diff options
author | mckusick <mckusick@FreeBSD.org> | 2001-05-11 07:12:03 +0000 |
---|---|---|
committer | mckusick <mckusick@FreeBSD.org> | 2001-05-11 07:12:03 +0000 |
commit | 8b011b16b30937f457138c156731df84e56beb2d (patch) | |
tree | 63c0aba2cf8a22afadf25ae7566fa990ceb8358d /sys/ufs/ffs | |
parent | 835997126bf51c408c2d0c3e9bbc86b3e0da3d94 (diff) | |
download | FreeBSD-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.c | 9 |
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 { |