diff options
Diffstat (limited to 'sys/ufs/ufs_vnops.c')
| -rw-r--r-- | sys/ufs/ufs_vnops.c | 67 |
1 files changed, 62 insertions, 5 deletions
diff --git a/sys/ufs/ufs_vnops.c b/sys/ufs/ufs_vnops.c index 4c254ad0d546..096cb1f3a338 100644 --- a/sys/ufs/ufs_vnops.c +++ b/sys/ufs/ufs_vnops.c @@ -31,7 +31,7 @@ * SUCH DAMAGE. * * from: @(#)ufs_vnops.c 7.64 (Berkeley) 5/16/91 - * $Id: ufs_vnops.c,v 1.5.2.1 1993/11/13 22:52:24 rgrimes Exp $ + * $Id: ufs_vnops.c,v 1.14 1994/01/19 21:09:26 jtc Exp $ */ #include "param.h" @@ -56,9 +56,18 @@ #include "dir.h" #include "fs.h" +/* Get the current value of _POSIX_CHOWN_RESTRICTED */ +#include "sys/unistd.h" /* make sure to get sys/ version. */ + +static int maknode(int, struct nameidata *, struct inode **); + +/* XXX - don't want to change ucred.h again */ +extern int groupmember(int /*gid_t*/, struct ucred *); + /* * Create a regular file */ +int ufs_create(ndp, vap, p) struct nameidata *ndp; struct vattr *vap; @@ -77,6 +86,7 @@ ufs_create(ndp, vap, p) * Mknod vnode call */ /* ARGSUSED */ +int ufs_mknod(ndp, vap, cred, p) struct nameidata *ndp; struct ucred *cred; @@ -115,6 +125,7 @@ ufs_mknod(ndp, vap, cred, p) * Nothing to do. */ /* ARGSUSED */ +int ufs_open(vp, mode, cred, p) struct vnode *vp; int mode; @@ -131,6 +142,7 @@ ufs_open(vp, mode, cred, p) * Update the times on the inode. */ /* ARGSUSED */ +int ufs_close(vp, fflag, cred, p) struct vnode *vp; int fflag; @@ -149,6 +161,7 @@ ufs_close(vp, fflag, cred, p) * The mode is shifted to select the owner/group/other fields. The * super user is granted all permissions. */ +int ufs_access(vp, mode, cred, p) struct vnode *vp; register int mode; @@ -200,6 +213,7 @@ found: } /* ARGSUSED */ +int ufs_getattr(vp, vap, cred, p) struct vnode *vp; register struct vattr *vap; @@ -223,7 +237,7 @@ ufs_getattr(vp, vap, cred, p) vap->va_size = ip->i_size; vap->va_size_rsv = 0; #else - vap->va_qsize = ip->i_din.di_qsize; + vap->va_qsize.v = ip->i_din.di_qsize.v; #endif vap->va_atime.tv_sec = ip->i_atime; vap->va_atime.tv_usec = 0; @@ -249,6 +263,7 @@ ufs_getattr(vp, vap, cred, p) /* * Set attribute vnode op. called from several syscalls */ +int ufs_setattr(vp, vap, cred, p) register struct vnode *vp; register struct vattr *vap; @@ -281,7 +296,9 @@ ufs_setattr(vp, vap, cred, p) } if (vap->va_atime.tv_sec != VNOVAL || vap->va_mtime.tv_sec != VNOVAL) { if (cred->cr_uid != ip->i_uid && - (error = suser(cred, &p->p_acflag))) + (error = suser(cred, &p->p_acflag)) && + ((vap->va_vaflags & VA_UTIMES_NULL) == 0 || + (error = VOP_ACCESS(vp, VWRITE, cred, p)))) return (error); if (vap->va_atime.tv_sec != VNOVAL) ip->i_flag |= IACC; @@ -300,7 +317,7 @@ ufs_setattr(vp, vap, cred, p) if (cred->cr_uid == 0) { ip->i_flags = vap->va_flags; } else { - ip->i_flags &= 0xffff0000; + ip->i_flags &= 0xffff0000ul; ip->i_flags |= (vap->va_flags & 0xffff); } ip->i_flag |= ICHG; @@ -312,6 +329,7 @@ ufs_setattr(vp, vap, cred, p) * Change the mode on a file. * Inode must be locked before calling. */ +int chmod1(vp, mode, p) register struct vnode *vp; register int mode; @@ -342,6 +360,7 @@ chmod1(vp, mode, p) * Perform chown operation on inode ip; * inode must be locked prior to call. */ +int chown1(vp, uid, gid, p) register struct vnode *vp; uid_t uid; @@ -367,10 +386,16 @@ chown1(vp, uid, gid, p) * of the file, or are not a member of the target group, * the caller must be superuser or the call fails. */ +#ifdef _POSIX_CHOWN_RESTRICTED if ((cred->cr_uid != ip->i_uid || uid != ip->i_uid || !groupmember((gid_t)gid, cred)) && (error = suser(cred, &p->p_acflag))) return (error); +#else + if ((cred->cr_uid != ip->i_uid || !groupmember((gid_t)gid, cred)) + && (error = suser(cred, &p->p_acflag))) + return error; +#endif ouid = ip->i_uid; ogid = ip->i_gid; #ifdef QUOTA @@ -448,6 +473,7 @@ good: * Vnode op for reading. */ /* ARGSUSED */ +int ufs_read(vp, uio, ioflag, cred) struct vnode *vp; register struct uio *uio; @@ -510,6 +536,7 @@ ufs_read(vp, uio, ioflag, cred) /* * Vnode op for writing. */ +int ufs_write(vp, uio, ioflag, cred) register struct vnode *vp; struct uio *uio; @@ -566,7 +593,9 @@ ufs_write(vp, uio, ioflag, cred) if (ioflag & IO_SYNC) flags = B_SYNC; - (void) vnode_pager_uncache(vp); + if ((ioflag & IO_PAGER) == 0) + (void) vnode_pager_uncache(vp); + do { lbn = lblkno(fs, uio->uio_offset); on = blkoff(fs, uio->uio_offset); @@ -607,6 +636,7 @@ ufs_write(vp, uio, ioflag, cred) } /* ARGSUSED */ +int ufs_ioctl(vp, com, data, fflag, cred, p) struct vnode *vp; int com; @@ -620,6 +650,7 @@ ufs_ioctl(vp, com, data, fflag, cred, p) } /* ARGSUSED */ +int ufs_select(vp, which, fflags, cred, p) struct vnode *vp; int which, fflags; @@ -639,6 +670,7 @@ ufs_select(vp, which, fflags, cred, p) * NB Currently unsupported. */ /* ARGSUSED */ +int ufs_mmap(vp, fflags, cred, p) struct vnode *vp; int fflags; @@ -653,6 +685,7 @@ ufs_mmap(vp, fflags, cred, p) * Synch an open file. */ /* ARGSUSED */ +int ufs_fsync(vp, fflags, cred, waitfor, p) struct vnode *vp; int fflags; @@ -674,6 +707,7 @@ ufs_fsync(vp, fflags, cred, waitfor, p) * Nothing to do, so just return. */ /* ARGSUSED */ +int ufs_seek(vp, oldoff, newoff, cred) struct vnode *vp; off_t oldoff, newoff; @@ -688,6 +722,7 @@ ufs_seek(vp, oldoff, newoff, cred) * Hard to avoid races here, especially * in unlinking directories. */ +int ufs_remove(ndp, p) struct nameidata *ndp; struct proc *p; @@ -713,6 +748,7 @@ ufs_remove(ndp, p) /* * link vnode call */ +int ufs_link(vp, ndp, p) register struct vnode *vp; register struct nameidata *ndp; @@ -771,6 +807,7 @@ ufs_link(vp, ndp, p) * is different from the source, patch the ".." entry in the * directory. */ +int ufs_rename(fndp, tndp, p) register struct nameidata *fndp, *tndp; struct proc *p; @@ -1085,6 +1122,7 @@ struct dirtemplate mastertemplate = { /* * Mkdir system call */ +int ufs_mkdir(ndp, vap, p) struct nameidata *ndp; struct vattr *vap; @@ -1200,6 +1238,7 @@ bad: /* * Rmdir system call. */ +int ufs_rmdir(ndp, p) register struct nameidata *ndp; struct proc *p; @@ -1264,6 +1303,7 @@ out: /* * symlink -- make a symbolic link */ +int ufs_symlink(ndp, vap, target, p) struct nameidata *ndp; struct vattr *vap; @@ -1296,6 +1336,7 @@ ufs_symlink(ndp, vap, target, p) /* * Vnode op for read and write */ +int ufs_readdir(vp, uio, cred, eofflagp) struct vnode *vp; register struct uio *uio; @@ -1323,6 +1364,7 @@ ufs_readdir(vp, uio, cred, eofflagp) /* * Return target name of a symbolic link */ +int ufs_readlink(vp, uiop, cred) struct vnode *vp; struct uio *uiop; @@ -1340,6 +1382,7 @@ ufs_readlink(vp, uiop, cred) * done. If a buffer has been saved in anticipation of a CREATE, delete it. */ /* ARGSUSED */ +int ufs_abortop(ndp) struct nameidata *ndp; { @@ -1352,6 +1395,7 @@ ufs_abortop(ndp) /* * Lock an inode. */ +int ufs_lock(vp) struct vnode *vp; { @@ -1364,6 +1408,7 @@ ufs_lock(vp) /* * Unlock an inode. */ +int ufs_unlock(vp) struct vnode *vp; { @@ -1378,6 +1423,7 @@ ufs_unlock(vp) /* * Check for a locked inode. */ +int ufs_islocked(vp) struct vnode *vp; { @@ -1390,6 +1436,7 @@ ufs_islocked(vp) /* * Get access to bmap */ +int ufs_bmap(vp, bn, vpp, bnp) struct vnode *vp; daddr_t bn; @@ -1411,6 +1458,7 @@ ufs_bmap(vp, bn, vpp, bnp) */ int checkoverlap = 0; +int ufs_strategy(bp) register struct buf *bp; { @@ -1468,6 +1516,7 @@ ufs_strategy(bp) /* * Print out the contents of an inode. */ +void ufs_print(vp) struct vnode *vp; { @@ -1491,6 +1540,7 @@ ufs_print(vp) /* * Read wrapper for special devices. */ +int ufsspec_read(vp, uio, ioflag, cred) struct vnode *vp; struct uio *uio; @@ -1508,6 +1558,7 @@ ufsspec_read(vp, uio, ioflag, cred) /* * Write wrapper for special devices. */ +int ufsspec_write(vp, uio, ioflag, cred) struct vnode *vp; struct uio *uio; @@ -1527,6 +1578,7 @@ ufsspec_write(vp, uio, ioflag, cred) * * Update the times on the inode then do device close. */ +int ufsspec_close(vp, fflag, cred, p) struct vnode *vp; int fflag; @@ -1544,6 +1596,7 @@ ufsspec_close(vp, fflag, cred, p) /* * Read wrapper for fifo's */ +int ufsfifo_read(vp, uio, ioflag, cred) struct vnode *vp; struct uio *uio; @@ -1561,6 +1614,7 @@ ufsfifo_read(vp, uio, ioflag, cred) /* * Write wrapper for fifo's. */ +int ufsfifo_write(vp, uio, ioflag, cred) struct vnode *vp; struct uio *uio; @@ -1580,6 +1634,7 @@ ufsfifo_write(vp, uio, ioflag, cred) * * Update the times on the inode then do device close. */ +int ufsfifo_close(vp, fflag, cred, p) struct vnode *vp; int fflag; @@ -1597,6 +1652,7 @@ ufsfifo_close(vp, fflag, cred, p) /* * Allocate a new inode. */ +static int maknode(mode, ndp, ipp) int mode; register struct nameidata *ndp; @@ -1674,6 +1730,7 @@ bad: /* * Advisory record locking support */ +int ufs_advlock(vp, id, op, fl, flags) struct vnode *vp; caddr_t id; |
