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>