aboutsummaryrefslogtreecommitdiff
path: root/sys/fs/msdosfs
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2008-04-16 11:33:32 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2008-04-16 11:33:32 +0000
commiteab626f110908f209587469de08f63bf8642aa68 (patch)
tree8616e51dd9b0325c0f52f09db6fcfd6bd22753bc /sys/fs/msdosfs
parent92c4ddb268353053b8e7302a8eaa3b4a486127dd (diff)
downloadsrc-eab626f110908f209587469de08f63bf8642aa68.tar.gz
src-eab626f110908f209587469de08f63bf8642aa68.zip
Move the head of byte-level advisory lock list from the
filesystem-specific vnode data to the struct vnode. Provide the default implementation for the vop_advlock and vop_advlockasync. Purge the locks on the vnode reclaim by using the lf_purgelocks(). The default implementation is augmented for the nfs and smbfs. In the nfs_advlock, push the Giant inside the nfs_dolock. Before the change, the vop_advlock and vop_advlockasync have taken the unlocked vnode and dereferenced the fs-private inode data, racing with with the vnode reclamation due to forced unmount. Now, the vop_getattr under the shared vnode lock is used to obtain the inode size, and later, in the lf_advlockasync, after locking the vnode interlock, the VI_DOOMED flag is checked to prevent an operation on the doomed vnode. The implementation of the lf_purgelocks() is submitted by dfr. Reported by: kris Tested by: kris, pho Discussed with: jeff, dfr MFC after: 2 weeks
Notes
Notes: svn path=/head/; revision=178243
Diffstat (limited to 'sys/fs/msdosfs')
-rw-r--r--sys/fs/msdosfs/denode.h1
-rw-r--r--sys/fs/msdosfs/msdosfs_vnops.c35
2 files changed, 0 insertions, 36 deletions
diff --git a/sys/fs/msdosfs/denode.h b/sys/fs/msdosfs/denode.h
index fbd95aa62c8e..4e03e9a6be2f 100644
--- a/sys/fs/msdosfs/denode.h
+++ b/sys/fs/msdosfs/denode.h
@@ -159,7 +159,6 @@ struct denode {
u_long de_FileSize; /* size of file in bytes */
struct fatcache de_fc[FC_SIZE]; /* fat cache */
u_quad_t de_modrev; /* Revision level for lease. */
- struct lockf *de_lockf; /* lockf */
u_int64_t de_inode; /* Inode number (really byte offset of direntry) */
};
diff --git a/sys/fs/msdosfs/msdosfs_vnops.c b/sys/fs/msdosfs/msdosfs_vnops.c
index 7a89f7bd8526..8a1484fc06c9 100644
--- a/sys/fs/msdosfs/msdosfs_vnops.c
+++ b/sys/fs/msdosfs/msdosfs_vnops.c
@@ -82,8 +82,6 @@
/*
* Prototypes for MSDOSFS vnode operations
*/
-static vop_advlock_t msdosfs_advlock;
-static vop_advlockasync_t msdosfs_advlockasync;
static vop_create_t msdosfs_create;
static vop_mknod_t msdosfs_mknod;
static vop_open_t msdosfs_open;
@@ -1949,37 +1947,6 @@ msdosfs_pathconf(ap)
}
static int
-msdosfs_advlock(ap)
- struct vop_advlock_args /* {
- struct vnode *a_vp;
- u_char a_id;
- int a_op;
- struct flock *a_fl;
- int a_flags;
- } */ *ap;
-{
- struct denode *dep = VTODE(ap->a_vp);
-
- return (lf_advlock(ap, &dep->de_lockf, dep->de_FileSize));
-}
-
-static int
-msdosfs_advlockasync(ap)
- struct vop_advlockasync_args /* {
- struct vnode *a_vp;
- u_char a_id;
- int a_op;
- struct flock *a_fl;
- int a_flags;
- struct task *a_task;
- } */ *ap;
-{
- struct denode *dep = VTODE(ap->a_vp);
-
- return (lf_advlockasync(ap, &dep->de_lockf, dep->de_FileSize));
-}
-
-static int
msdosfs_vptofh(ap)
struct vop_vptofh_args /* {
struct vnode *a_vp;
@@ -2003,8 +1970,6 @@ struct vop_vector msdosfs_vnodeops = {
.vop_default = &default_vnodeops,
.vop_access = msdosfs_access,
- .vop_advlock = msdosfs_advlock,
- .vop_advlockasync = msdosfs_advlockasync,
.vop_bmap = msdosfs_bmap,
.vop_cachedlookup = msdosfs_lookup,
.vop_open = msdosfs_open,