The check for whether a block is going to be claimed by a snapshot
needs to happen before we notify the underlying layer that it is being freed.
This commit is contained in:
parent
f3b98ffc0c
commit
6d52186e53
@ -1873,10 +1873,7 @@ ffs_blkfree_cg(ump, fs, devvp, bno, size, inum, dephd)
|
||||
/* devvp is a normal disk device */
|
||||
dev = devvp->v_rdev;
|
||||
cgblkno = fsbtodb(fs, cgtod(fs, cg));
|
||||
ASSERT_VOP_LOCKED(devvp, "ffs_blkfree");
|
||||
if ((devvp->v_vflag & VV_COPYONWRITE) &&
|
||||
ffs_snapblkfree(fs, devvp, bno, size, inum))
|
||||
return;
|
||||
ASSERT_VOP_LOCKED(devvp, "ffs_blkfree_cg");
|
||||
}
|
||||
#ifdef INVARIANTS
|
||||
if ((u_int)size > fs->fs_bsize || fragoff(fs, size) != 0 ||
|
||||
@ -2030,6 +2027,17 @@ ffs_blkfree(ump, fs, devvp, bno, size, inum, dephd)
|
||||
struct bio *bip;
|
||||
struct ffs_blkfree_trim_params *tp;
|
||||
|
||||
/*
|
||||
* Check to see if a snapshot wants to claim the block.
|
||||
* Check that devvp is a normal disk device, not a snapshot,
|
||||
* it has a snapshot(s) associated with it, and one of the
|
||||
* snapshots wants to claim the block.
|
||||
*/
|
||||
if (devvp->v_type != VREG &&
|
||||
(devvp->v_vflag & VV_COPYONWRITE) &&
|
||||
ffs_snapblkfree(fs, devvp, bno, size, inum)) {
|
||||
return;
|
||||
}
|
||||
if (!ump->um_candelete) {
|
||||
ffs_blkfree_cg(ump, fs, devvp, bno, size, inum, dephd);
|
||||
return;
|
||||
|
Loading…
Reference in New Issue
Block a user