vn_lock & ffs_snapremove
Kostik Belousov
kostikbel at gmail.com
Fri Apr 28 13:00:38 UTC 2006
Look at the two code fragments
1. from vn_lock(9):
error = VOP_LOCK(vp, flags | LK_INTERLOCK, td);
flags &= ~LK_INTERLOCK;
KASSERT((flags & LK_RETRY) == 0 || error == 0,
("LK_RETRY set with incompatible flags %d\n", flags));
/*
* Callers specify LK_RETRY if they wish to get dead vnodes.
* If RETRY is not set, we return ENOENT instead.
*/
if (error == 0 && vp->v_iflag & VI_DOOMED &&
(flags & LK_RETRY) == 0) {
VOP_UNLOCK(vp, 0, td);
error = ENOENT;
break;
}
2. ffs_snapremove(9):
(vp->v_vnlock for snapshot vnode vp points to sn_snlock)
lkp = vp->v_vnlock;
vp->v_vnlock = &vp->v_lock;
Is there anything that would prevent these two fragments to intervene ?
Esp. bad looks the situation where VOP_LOCK() from vn_lock executed
and locked doomed snapshot vnode, after that ffs_snapremove replaces
vnode lock and VOP_UNLOCK attempted on _another_ lock.
If this scenario can happen (as it seems), then, probably,
some measures like transferlockers(9) are needed ?
More information about the freebsd-fs
mailing list