diff options
author | rmacklem <rmacklem@FreeBSD.org> | 2009-06-09 15:18:01 +0000 |
---|---|---|
committer | rmacklem <rmacklem@FreeBSD.org> | 2009-06-09 15:18:01 +0000 |
commit | af60635fabd4377e14bc00ac6a5d6723f01308ed (patch) | |
tree | 59bd9058cc068204f3c2b26031c42c9c5f2277b6 /sys/fs/nfsclient/nfs_clvnops.c | |
parent | 77373ed4681d2d7d7a25a619e896c065e12976c6 (diff) | |
download | FreeBSD-src-af60635fabd4377e14bc00ac6a5d6723f01308ed.zip FreeBSD-src-af60635fabd4377e14bc00ac6a5d6723f01308ed.tar.gz |
Since vn_lock() with the LK_RETRY flag never returns an error
for FreeBSD-CURRENT, the code that checked for and returned the
error was broken. Change it to check for VI_DOOMED set after
vn_lock() and return an error for that case. I believe this
should only happen for forced dismounts.
Approved by: kib (mentor)
Diffstat (limited to 'sys/fs/nfsclient/nfs_clvnops.c')
-rw-r--r-- | sys/fs/nfsclient/nfs_clvnops.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/sys/fs/nfsclient/nfs_clvnops.c b/sys/fs/nfsclient/nfs_clvnops.c index 937453c..a1f2701 100644 --- a/sys/fs/nfsclient/nfs_clvnops.c +++ b/sys/fs/nfsclient/nfs_clvnops.c @@ -2726,14 +2726,16 @@ nfs_advlock(struct vop_advlock_args *ap) struct proc *p = (struct proc *)ap->a_id; struct thread *td = curthread; /* XXX */ struct vattr va; - int ret, error = EOPNOTSUPP, vlret; + int ret, error = EOPNOTSUPP; u_quad_t size; if (NFS_ISV4(vp) && (ap->a_flags & F_POSIX)) { cred = p->p_ucred; - vlret = vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); - if (vlret) - return (vlret); + vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); + if (vp->v_iflag & VI_DOOMED) { + VOP_UNLOCK(vp, 0); + return (EBADF); + } /* * If this is unlocking a write locked region, flush and @@ -2757,9 +2759,11 @@ nfs_advlock(struct vop_advlock_args *ap) error = nfs_catnap(PZERO | PCATCH, "ncladvl"); if (error) return (EINTR); - vlret = vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); - if (vlret) - return (vlret); + vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); + if (vp->v_iflag & VI_DOOMED) { + VOP_UNLOCK(vp, 0); + return (EBADF); + } } } while (ret == NFSERR_DENIED && (ap->a_flags & F_WAIT) && ap->a_op == F_SETLK); |