summaryrefslogtreecommitdiffstats
path: root/sys/kern/vfs_vnops.c
diff options
context:
space:
mode:
authorrwatson <rwatson@FreeBSD.org>2004-06-01 18:03:20 +0000
committerrwatson <rwatson@FreeBSD.org>2004-06-01 18:03:20 +0000
commit1e76056c09514635a9a2a057476724f42303910a (patch)
treec68378fc477ba0e1231624e12d7ed55c843cfbdd /sys/kern/vfs_vnops.c
parent9e06a1e05abc0cec47d35f94cd372e908733d300 (diff)
downloadFreeBSD-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.c19
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));
}
/*
OpenPOWER on IntegriCloud