summaryrefslogtreecommitdiffstats
path: root/sys/ufs/ffs
diff options
context:
space:
mode:
authormckusick <mckusick@FreeBSD.org>2001-05-11 07:12:03 +0000
committermckusick <mckusick@FreeBSD.org>2001-05-11 07:12:03 +0000
commit8b011b16b30937f457138c156731df84e56beb2d (patch)
tree63c0aba2cf8a22afadf25ae7566fa990ceb8358d /sys/ufs/ffs
parent835997126bf51c408c2d0c3e9bbc86b3e0da3d94 (diff)
downloadFreeBSD-src-8b011b16b30937f457138c156731df84e56beb2d.zip
FreeBSD-src-8b011b16b30937f457138c156731df84e56beb2d.tar.gz
Remove yet another deadlock case.
Diffstat (limited to 'sys/ufs/ffs')
-rw-r--r--sys/ufs/ffs/ffs_snapshot.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/sys/ufs/ffs/ffs_snapshot.c b/sys/ufs/ffs/ffs_snapshot.c
index ce6e904..b16c62a 100644
--- a/sys/ufs/ffs/ffs_snapshot.c
+++ b/sys/ufs/ffs/ffs_snapshot.c
@@ -971,6 +971,7 @@ ffs_snapblkfree(freeip, bno, size)
VOP_UNLOCK(vp, 0, p);
break;
}
+ VOP_UNLOCK(vp, 0, p);
savedcbp = cbp;
}
/*
@@ -981,9 +982,11 @@ ffs_snapblkfree(freeip, bno, size)
if (savedcbp) {
vp = savedcbp->b_vp;
bawrite(savedcbp);
- if (VTOI(vp)->i_effnlink > 0)
+ if (VTOI(vp)->i_effnlink > 0) {
+ vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p);
(void) VOP_FSYNC(vp, KERNCRED, MNT_WAIT, p);
- VOP_UNLOCK(vp, 0, p);
+ VOP_UNLOCK(vp, 0, p);
+ }
}
/*
* If we have been unable to allocate a block in which to do
@@ -1104,7 +1107,7 @@ ffs_copyonwrite(devvp, bp)
* sleep briefly, and try again.
*/
retry:
- vn_lock(vp, LK_SHARED | LK_RETRY, p);
+ vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p);
if (lbn < NDADDR) {
blkno = ip->i_db[lbn];
} else {
OpenPOWER on IntegriCloud