diff options
author | Konstantin Belousov <kib@FreeBSD.org> | 2008-04-16 11:33:32 +0000 |
---|---|---|
committer | Konstantin Belousov <kib@FreeBSD.org> | 2008-04-16 11:33:32 +0000 |
commit | eab626f110908f209587469de08f63bf8642aa68 (patch) | |
tree | 8616e51dd9b0325c0f52f09db6fcfd6bd22753bc /sys/fs/msdosfs | |
parent | 92c4ddb268353053b8e7302a8eaa3b4a486127dd (diff) | |
download | src-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.h | 1 | ||||
-rw-r--r-- | sys/fs/msdosfs/msdosfs_vnops.c | 35 |
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, |