diff options
| author | Konstantin Belousov <kib@FreeBSD.org> | 2008-08-01 09:46:19 +0000 |
|---|---|---|
| committer | Konstantin Belousov <kib@FreeBSD.org> | 2008-08-01 09:46:19 +0000 |
| commit | cb917b839b94adf81f241d51bcd2a1ce82161618 (patch) | |
| tree | 20f5445f82a8aac528ac6803d9bf5f1b4b31ed62 /sys/nfsclient/nfs_vnops.c | |
| parent | 5e38927c8c78b301b63e4c30508cf75fd60fa0e4 (diff) | |
Notes
Diffstat (limited to 'sys/nfsclient/nfs_vnops.c')
| -rw-r--r-- | sys/nfsclient/nfs_vnops.c | 42 |
1 files changed, 23 insertions, 19 deletions
diff --git a/sys/nfsclient/nfs_vnops.c b/sys/nfsclient/nfs_vnops.c index b6e90686ccf9..9ce7ee08d0e4 100644 --- a/sys/nfsclient/nfs_vnops.c +++ b/sys/nfsclient/nfs_vnops.c @@ -3043,18 +3043,19 @@ done: static int nfs_advlock(struct vop_advlock_args *ap) { + struct vnode *vp = ap->a_vp; + u_quad_t size; int error; - - mtx_lock(&Giant); - if ((VFSTONFS(ap->a_vp->v_mount)->nm_flag & NFSMNT_NOLOCKD) != 0) { - struct nfsnode *np = VTONFS(ap->a_vp); - error = lf_advlock(ap, &(np->n_lockf), np->n_size); - goto out; - } - error = nfs_dolock(ap); -out: - mtx_unlock(&Giant); + error = vn_lock(vp, LK_SHARED, curthread); + if (error) + return (error); + if ((VFSTONFS(vp->v_mount)->nm_flag & NFSMNT_NOLOCKD) != 0) { + size = VTONFS(vp)->n_size; + VOP_UNLOCK(vp, 0, curthread); + error = lf_advlock(ap, &(vp->v_lockf), size); + } else + error = nfs_dolock(ap); return (error); } @@ -3064,18 +3065,21 @@ out: static int nfs_advlockasync(struct vop_advlockasync_args *ap) { + struct vnode *vp = ap->a_vp; + u_quad_t size; int error; - mtx_lock(&Giant); - if ((VFSTONFS(ap->a_vp->v_mount)->nm_flag & NFSMNT_NOLOCKD) != 0) { - struct nfsnode *np = VTONFS(ap->a_vp); - - error = lf_advlockasync(ap, &(np->n_lockf), np->n_size); - goto out; + error = vn_lock(vp, LK_SHARED, curthread); + if (error) + return (error); + if ((VFSTONFS(vp->v_mount)->nm_flag & NFSMNT_NOLOCKD) != 0) { + size = VTONFS(vp)->n_size; + VOP_UNLOCK(vp, 0, curthread); + error = lf_advlockasync(ap, &(vp->v_lockf), size); + } else { + VOP_UNLOCK(vp, 0, curthread); + error = EOPNOTSUPP; } - error = EOPNOTSUPP; -out: - mtx_unlock(&Giant); return (error); } |
