MFV r299436: 6843 Make xattr dir truncate and remove in one tx

Reviewed by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed by: Dan McDonald <danmcd@omniti.com>
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Approved by: Robert Mustacchi <rm@joyent.com>
Author: Chunwei Chen <tuxoko@gmail.com>

openzfs/openzfs@399cc7d5d9
This commit is contained in:
Alexander Motin 2016-05-11 12:43:54 +00:00
commit d7ff478705
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=299437

View File

@ -611,19 +611,25 @@ zfs_rmnode(znode_t *zp)
zfs_znode_free(zp);
return;
}
}
/*
* Free up all the data in the file.
*/
error = dmu_free_long_range(os, zp->z_id, 0, DMU_OBJECT_END);
if (error) {
} else {
/*
* Not enough space. Leave the file in the unlinked set.
* Free up all the data in the file. We don't do this for
* XATTR 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.
*/
zfs_znode_dmu_fini(zp);
zfs_znode_free(zp);
return;
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.
*/
zfs_znode_dmu_fini(zp);
zfs_znode_free(zp);
return;
}
}
/*