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