summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2017-08-04 08:16:05 +0000
committerkib <kib@FreeBSD.org>2017-08-04 08:16:05 +0000
commitea56495524195a851fdd5a3af96f8b5ff3394b6e (patch)
tree2c4644a42e6584bb7f47cd64f965c54b229d839b
parentef8e2a06ba6bf4731ef10fa2ca98bdb144a1402c (diff)
downloadFreeBSD-src-ea56495524195a851fdd5a3af96f8b5ff3394b6e.zip
FreeBSD-src-ea56495524195a851fdd5a3af96f8b5ff3394b6e.tar.gz
MFC r321347:
Account for lock recursion when transfering snaplock to the vnode lock in ffs_snapremove().
-rw-r--r--sys/ufs/ffs/ffs_snapshot.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/sys/ufs/ffs/ffs_snapshot.c b/sys/ufs/ffs/ffs_snapshot.c
index a303c8d..35344cd 100644
--- a/sys/ufs/ffs/ffs_snapshot.c
+++ b/sys/ufs/ffs/ffs_snapshot.c
@@ -1607,7 +1607,7 @@ ffs_snapremove(vp)
struct buf *ibp;
struct fs *fs;
ufs2_daddr_t numblks, blkno, dblk;
- int error, loc, last;
+ int error, i, last, loc;
struct snapdata *sn;
ip = VTOI(vp);
@@ -1627,10 +1627,14 @@ ffs_snapremove(vp)
ip->i_nextsnap.tqe_prev = 0;
VI_UNLOCK(devvp);
lockmgr(&vp->v_lock, LK_EXCLUSIVE, NULL);
+ for (i = 0; i < sn->sn_lock.lk_recurse; i++)
+ lockmgr(&vp->v_lock, LK_EXCLUSIVE, NULL);
KASSERT(vp->v_vnlock == &sn->sn_lock,
("ffs_snapremove: lost lock mutation"));
vp->v_vnlock = &vp->v_lock;
VI_LOCK(devvp);
+ while (sn->sn_lock.lk_recurse > 0)
+ lockmgr(&sn->sn_lock, LK_RELEASE, NULL);
lockmgr(&sn->sn_lock, LK_RELEASE, NULL);
try_free_snapdata(devvp);
} else
OpenPOWER on IntegriCloud