aboutsummaryrefslogtreecommitdiff
path: root/sys/ufs
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2008-12-02 11:12:50 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2008-12-02 11:12:50 +0000
commitffdaeffe217161b6c59f7d80f4db866106dfc2fb (patch)
tree207e3819384c3264a3156441da34d7a7532c0788 /sys/ufs
parentdfd9bc23c96e1fa203f17c388b7a2cf774e9e8d7 (diff)
downloadsrc-ffdaeffe217161b6c59f7d80f4db866106dfc2fb.tar.gz
src-ffdaeffe217161b6c59f7d80f4db866106dfc2fb.zip
Do not lock vnode interlock around reading of v_iflag to check VI_DOOMED.
Read of the pointer is atomic, and flag cannot be set while vnode lock is held. Requested by: jhb MFC after: 1 month
Notes
Notes: svn path=/head/; revision=185556
Diffstat (limited to 'sys/ufs')
-rw-r--r--sys/ufs/ufs/ufs_lookup.c11
1 files changed, 2 insertions, 9 deletions
diff --git a/sys/ufs/ufs/ufs_lookup.c b/sys/ufs/ufs/ufs_lookup.c
index d464e0023dae..65ab0da10e40 100644
--- a/sys/ufs/ufs/ufs_lookup.c
+++ b/sys/ufs/ufs/ufs_lookup.c
@@ -157,7 +157,6 @@ ufs_lookup(ap)
int nameiop = cnp->cn_nameiop;
ino_t ino;
int ltype;
- int pdoomed;
struct mount *mp;
bp = NULL;
@@ -588,20 +587,14 @@ found:
VOP_UNLOCK(pdp, 0);
pause("ufs_dd", 1);
vn_lock(pdp, ltype | LK_RETRY);
- VI_LOCK(pdp);
- pdoomed = pdp->v_iflag & VI_DOOMED;
- VI_UNLOCK(pdp);
- if (pdoomed)
+ if (pdp->v_iflag & VI_DOOMED)
return (ENOENT);
}
VOP_UNLOCK(pdp, 0); /* race to get the inode */
error = VFS_VGET(mp, ino, cnp->cn_lkflags, &tdp);
vfs_unbusy(mp);
vn_lock(pdp, ltype | LK_RETRY);
- VI_LOCK(pdp);
- pdoomed = pdp->v_iflag & VI_DOOMED;
- VI_UNLOCK(pdp);
- if (pdoomed) {
+ if (pdp->v_iflag & VI_DOOMED) {
if (error == 0)
vput(tdp);
error = ENOENT;