Make xattr dir truncate and remove in one tx

We need truncate and remove be in the same tx when doing zfs_rmnode on xattr
dir. Otherwise, if we truncate and crash, we'll end up with inconsistent zap
object on the delete queue. We do this by skipping dmu_free_long_range and let
zfs_znode_delete to do the work.

Signed-off-by: Chunwei Chen <david.chen@osnexus.com>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Issue #4114
Issue #4052
Issue #4006
Issue #3018
Issue #2861
This commit is contained in:
Chunwei Chen 2015-12-21 11:57:18 -08:00 committed by Brian Behlendorf
parent 29572ccdef
commit f5f087eb88

View File

@ -632,16 +632,23 @@ zfs_rmnode(znode_t *zp)
}
/*
* Free up all the data in the file.
* Free up all the data in the file. We don't do this for directories
* because we need truncate and remove to be in the same tx, like in
* zfs_znode_delete(). Otherwise, if we crash here we'll end up with
* an inconsistent truncated zap object in the delete queue. Note a
* truncated file is harmless since it only contains user data.
*/
if (S_ISREG(ZTOI(zp)->i_mode)) {
error = dmu_free_long_range(os, zp->z_id, 0, DMU_OBJECT_END);
if (error) {
/*
* Not enough space. Leave the file in the unlinked set.
* Not enough space. Leave the file in the unlinked
* set.
*/
zfs_znode_dmu_fini(zp);
return;
}
}
/*
* If the file has extended attributes, we're going to unlink