* Copyright (c) 1982, 1986, 1989 Regents of the University of California.
* All rights reserved.
*
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by the University of California, Berkeley. The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ * Redistribution is only permitted until one year after the first shipment
+ * of 4.4BSD by the Regents. Otherwise, redistribution and use in source and
+ * binary forms are permitted provided that: (1) source distributions retain
+ * this entire copyright notice and comment, and (2) distributions including
+ * binaries display the following acknowledgement: This product includes
+ * software developed by the University of California, Berkeley and its
+ * contributors'' in the documentation or other materials provided with the
+ * distribution and in all advertising materials mentioning features or use
+ * of this software. Neither the name of the University nor the names of
+ * its contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * @(#)vfs_vnops.c 7.12 (Berkeley) %G%
+ * @(#)vfs_vnops.c 7.23 (Berkeley) 6/28/90
*/
#include "param.h"
#include "socketvar.h"
#include "mount.h"
#include "vnode.h"
-#include "../ufs/fs.h"
-#include "../ufs/quota.h"
#include "ioctl.h"
#include "tty.h"
if (error = namei(ndp))
return (error);
if (ndp->ni_vp == NULL) {
- vattr_null(vap);
+ VATTR_NULL(vap);
vap->va_type = VREG;
vap->va_mode = cmode;
if (error = VOP_CREATE(ndp, vap))
fmode &= ~FTRUNC;
vp = ndp->ni_vp;
} else {
+ if (ndp->ni_dvp == ndp->ni_vp)
+ vrele(ndp->ni_dvp);
+ else
+ vput(ndp->ni_dvp);
+ ndp->ni_dvp = NULL;
vp = ndp->ni_vp;
- ndp->ni_vp = 0;
- VOP_ABORTOP(ndp);
- ndp->ni_vp = vp;
if (fmode & FEXCL) {
error = EEXIST;
goto bad;
}
}
if (fmode & FTRUNC) {
- vattr_null(vap);
+ VATTR_NULL(vap);
vap->va_size = 0;
if (error = VOP_SETATTR(vp, vap, ndp->ni_cred))
goto bad;
}
VOP_UNLOCK(vp);
- if (setjmp(&u.u_qsave)) {
- if (error == 0)
- error = EINTR;
- return (error);
- }
error = VOP_OPEN(vp, fmode, ndp->ni_cred);
if (error)
vrele(vp);
bad:
vput(vp);
- return(error);
+ return (error);
}
/*
* unless the file is a socket or a block or character
* device resident on the file system.
*/
- if ((vp->v_mount->m_flag & M_RDONLY) && vp->v_type != VCHR &&
+ if ((vp->v_mount->mnt_flag & MNT_RDONLY) && vp->v_type != VCHR &&
vp->v_type != VBLK && vp->v_type != VSOCK)
return (EROFS);
/*
case VSOCK:
mode |= S_IFSOCK;
break;
+ case VFIFO:
+ mode |= S_IFIFO;
+ break;
default:
return (EBADF);
};
default:
return (ENOTTY);
+ case VFIFO:
case VCHR:
case VBLK:
- u.u_r.r_val1 = 0;
- if (setjmp(&u.u_qsave)) {
- if ((u.u_sigintr & sigmask(u.u_procp->p_cursig)) != 0)
- return(EINTR);
- u.u_eosys = RESTARTSYS;
- return (0);
- }
error = VOP_IOCTL(vp, com, data, fp->f_flag, u.u_cred);
if (error == 0 && com == TIOCSCTTY) {
u.u_procp->p_session->s_ttyvp = vp;
struct file *fp;
int which;
{
- return(VOP_SELECT(((struct vnode *)fp->f_data), which, u.u_cred));
+ return (VOP_SELECT(((struct vnode *)fp->f_data), which, fp->f_flag,
+ u.u_cred));
}
/*
{
register int priority = PLOCK;
register struct vnode *vp = (struct vnode *)fp->f_data;
+ int error = 0;
+ static char lockstr[] = "flock";
if ((cmd & LOCK_EX) == 0)
priority += 4;
- if (setjmp(&u.u_qsave)) {
- if ((u.u_sigintr & sigmask(u.u_procp->p_cursig)) != 0)
- return(EINTR);
- u.u_eosys = RESTARTSYS;
- return (0);
- }
+ priority |= PCATCH;
+
/*
* If there's a exclusive lock currently applied
* to the file, then we've gotta wait for the
if (cmd & LOCK_NB)
return (EWOULDBLOCK);
vp->v_flag |= VLWAIT;
- sleep((caddr_t)&vp->v_exlockc, priority);
+ if (error = tsleep((caddr_t)&vp->v_exlockc, priority,
+ lockstr, 0))
+ return (error);
}
- if ((cmd & LOCK_EX) && (vp->v_flag & VSHLOCK)) {
+ if (error = 0 && (cmd & LOCK_EX) && (vp->v_flag & VSHLOCK)) {
/*
* Must wait for any shared locks to finish
* before we try to apply a exclusive lock.
if (cmd & LOCK_NB)
return (EWOULDBLOCK);
vp->v_flag |= VLWAIT;
- sleep((caddr_t)&vp->v_shlockc, PLOCK);
- goto again;
+ if (error = tsleep((caddr_t)&vp->v_shlockc, PLOCK | PCATCH,
+ lockstr, 0) == 0)
+ return (error);
}
if (fp->f_flag & FEXLOCK)
panic("vn_lock");