diff options
author | kib <kib@FreeBSD.org> | 2008-04-16 11:33:32 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2008-04-16 11:33:32 +0000 |
commit | 52243403eb48561abd7b33995f5a4be6a56fa1f0 (patch) | |
tree | 8616e51dd9b0325c0f52f09db6fcfd6bd22753bc /sys/cddl | |
parent | 0e16b52aecb9efb40df3384931b2f3afe0d44466 (diff) | |
download | FreeBSD-src-52243403eb48561abd7b33995f5a4be6a56fa1f0.zip FreeBSD-src-52243403eb48561abd7b33995f5a4be6a56fa1f0.tar.gz |
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
Diffstat (limited to 'sys/cddl')
3 files changed, 0 insertions, 41 deletions
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_znode.h b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_znode.h index c9c317e..6b29232 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_znode.h +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_znode.h @@ -162,7 +162,6 @@ typedef struct znode { uint32_t z_sync_cnt; /* synchronous open count */ kmutex_t z_acl_lock; /* acl data lock */ list_node_t z_link_node; /* all znodes in fs link */ - struct lockf *z_lockf; /* Head of byte-level lock list. */ /* * These are dmu managed fields. */ diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c index 088103a..a8fcb80 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c @@ -3533,43 +3533,6 @@ zfs_freebsd_pathconf(ap) return (error); } -/* - * Advisory record locking support - */ -static int -zfs_freebsd_advlock(ap) - struct vop_advlock_args /* { - struct vnode *a_vp; - caddr_t a_id; - int a_op; - struct flock *a_fl; - int a_flags; - } */ *ap; -{ - znode_t *zp = VTOZ(ap->a_vp); - - return (lf_advlock(ap, &(zp->z_lockf), zp->z_phys->zp_size)); -} - -/* - * Advisory record locking support - */ -static int -zfs_freebsd_advlockasync(ap) - struct vop_advlockasync_args /* { - struct vnode *a_vp; - caddr_t a_id; - int a_op; - struct flock *a_fl; - int a_flags; - struct task *a_task; - } */ *ap; -{ - znode_t *zp = VTOZ(ap->a_vp); - - return (lf_advlockasync(ap, &(zp->z_lockf), zp->z_phys->zp_size)); -} - struct vop_vector zfs_vnodeops; struct vop_vector zfs_fifoops; @@ -3602,8 +3565,6 @@ struct vop_vector zfs_vnodeops = { .vop_write = zfs_freebsd_write, .vop_remove = zfs_freebsd_remove, .vop_rename = zfs_freebsd_rename, - .vop_advlock = zfs_freebsd_advlock, - .vop_advlockasync = zfs_freebsd_advlockasync, .vop_pathconf = zfs_freebsd_pathconf, .vop_bmap = VOP_EOPNOTSUPP, .vop_fid = zfs_freebsd_fid, diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c index 46e501c..e32e873 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c @@ -136,7 +136,6 @@ zfs_znode_cache_constructor(void *buf, void *cdrarg, int kmflags) zp->z_dbuf_held = 0; zp->z_dirlocks = 0; - zp->z_lockf = NULL; return (0); } |