summaryrefslogtreecommitdiffstats
path: root/sys/fs/nfsclient/nfs_clvnops.c
diff options
context:
space:
mode:
authorrmacklem <rmacklem@FreeBSD.org>2009-06-09 15:18:01 +0000
committerrmacklem <rmacklem@FreeBSD.org>2009-06-09 15:18:01 +0000
commitaf60635fabd4377e14bc00ac6a5d6723f01308ed (patch)
tree59bd9058cc068204f3c2b26031c42c9c5f2277b6 /sys/fs/nfsclient/nfs_clvnops.c
parent77373ed4681d2d7d7a25a619e896c065e12976c6 (diff)
downloadFreeBSD-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.c18
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);
OpenPOWER on IntegriCloud