diff options
author | Konstantin Belousov <kib@FreeBSD.org> | 2008-12-02 11:12:50 +0000 |
---|---|---|
committer | Konstantin Belousov <kib@FreeBSD.org> | 2008-12-02 11:12:50 +0000 |
commit | ffdaeffe217161b6c59f7d80f4db866106dfc2fb (patch) | |
tree | 207e3819384c3264a3156441da34d7a7532c0788 /sys/ufs | |
parent | dfd9bc23c96e1fa203f17c388b7a2cf774e9e8d7 (diff) | |
download | src-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.c | 11 |
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; |