diff options
author | rwatson <rwatson@FreeBSD.org> | 2004-06-01 18:03:20 +0000 |
---|---|---|
committer | rwatson <rwatson@FreeBSD.org> | 2004-06-01 18:03:20 +0000 |
commit | 1e76056c09514635a9a2a057476724f42303910a (patch) | |
tree | c68378fc477ba0e1231624e12d7ed55c843cfbdd /sys/kern/vfs_vnops.c | |
parent | 9e06a1e05abc0cec47d35f94cd372e908733d300 (diff) | |
download | FreeBSD-src-1e76056c09514635a9a2a057476724f42303910a.zip FreeBSD-src-1e76056c09514635a9a2a057476724f42303910a.tar.gz |
Push the VOP_ADVLOCK() call to release advisory locks on vnode file
descriptors out of fdrop_locked() and into vn_closefile(). This
removes all knowledge of vnodes from fdrop_locked(), since the lock
behavior was specific to vnodes. This also removes the specific
requirement for Giant in fdrop_locked(), it's now only required by
code that it calls into.
Add GIANT_REQUIRED to vn_closefile() since VFS requires Giant.
Diffstat (limited to 'sys/kern/vfs_vnops.c')
-rw-r--r-- | sys/kern/vfs_vnops.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c index 1e9d3bb..2da4b6b 100644 --- a/sys/kern/vfs_vnops.c +++ b/sys/kern/vfs_vnops.c @@ -59,6 +59,7 @@ __FBSDID("$FreeBSD$"); #include <sys/ttycom.h> #include <sys/conf.h> #include <sys/syslog.h> +#include <sys/unistd.h> static fo_rdwr_t vn_read; static fo_rdwr_t vn_write; @@ -909,9 +910,25 @@ vn_closefile(fp, td) struct file *fp; struct thread *td; { + struct vnode *vp; + struct flock lf; + + GIANT_REQUIRED; + + KASSERT(fp->f_type == DTYPE_VNODE, ("vn_closefile: !DTYPE_VNODE")); + vp = fp->f_vnode; + + if (fp->f_flag & FHASLOCK) { + lf.l_whence = SEEK_SET; + lf.l_start = 0; + lf.l_len = 0; + lf.l_type = F_UNLCK; + (void) VOP_ADVLOCK(vp, (caddr_t)fp, F_UNLCK, &lf, F_FLOCK); + } fp->f_ops = &badfileops; - return (vn_close(fp->f_vnode, fp->f_flag, fp->f_cred, td)); + + return (vn_close(vp, fp->f_flag, fp->f_cred, td)); } /* |