Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 28 Apr 2006 16:00:30 +0300
From:      Kostik Belousov <kostikbel@gmail.com>
To:        freebsd-fs@freebsd.org
Subject:   vn_lock & ffs_snapremove
Message-ID:  <20060428130030.GC1270@deviant.kiev.zoral.com.ua>

next in thread | raw e-mail | index | archive | help
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 ?



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20060428130030.GC1270>