Allow the dounmount() to proceed even for doomed coveredvp.
In dounmount(), before or while vn_lock(coveredvp) is called, coveredvp vnode may be VI_DOOMED due to one of the following: - other thread finished unmount and vput()ed it, and vnode was chosen for recycling, while vn_lock() slept; - forced unmount of the coveredvp->v_mount fs. In the first case, next check for changed v_mountedhere or mnt_gen counter would be successfull. In the second case, the unmount shall be allowed. Submitted by: sobomax MFC after: 2 weeks
This commit is contained in:
parent
64c43db51c
commit
e5ea32c290
@ -1168,14 +1168,12 @@ dounmount(mp, flags, td)
|
||||
mnt_gen_r = mp->mnt_gen;
|
||||
VI_LOCK(coveredvp);
|
||||
vholdl(coveredvp);
|
||||
error = vn_lock(coveredvp, LK_EXCLUSIVE | LK_INTERLOCK, td);
|
||||
vn_lock(coveredvp, LK_EXCLUSIVE | LK_INTERLOCK | LK_RETRY, td);
|
||||
vdrop(coveredvp);
|
||||
/*
|
||||
* Check for mp being unmounted while waiting for the
|
||||
* covered vnode lock.
|
||||
*/
|
||||
if (error)
|
||||
return (error);
|
||||
if (coveredvp->v_mountedhere != mp ||
|
||||
coveredvp->v_mountedhere->mnt_gen != mnt_gen_r) {
|
||||
VOP_UNLOCK(coveredvp, 0, td);
|
||||
|
Loading…
Reference in New Issue
Block a user