aboutsummaryrefslogtreecommitdiff
path: root/sys/ufs/ufs_vnops.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/ufs/ufs_vnops.c')
-rw-r--r--sys/ufs/ufs_vnops.c67
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;