struct btrfs_truncate_control control = {
.new_size = 0,
.min_type = BTRFS_EXTENT_DATA_KEY,
+ .clear_extent_range = true,
};
struct btrfs_inode *inode = BTRFS_I(vfs_inode);
struct btrfs_root *root = inode->root;
}
delete:
/*
- * We use btrfs_truncate_inode_items() to clean up log trees for
- * multiple fsyncs, and in this case we don't want to clear the
- * file extent range because it's just the log.
+ * We only want to clear the file extent range if we're
+ * modifying the actual inode's mapping, which is just the
+ * normal truncate path.
*/
- if (root == inode->root) {
+ if (control->clear_extent_range) {
ret = btrfs_inode_clear_file_extent_range(inode,
clear_start, clear_len);
if (ret) {
* extents we drop.
*/
bool skip_ref_updates;
+
+ /*
+ * IN: true if we need to clear the file extent range for the inode as
+ * we drop the file extent items.
+ */
+ bool clear_extent_range;
};
int btrfs_truncate_inode_items(struct btrfs_trans_handle *trans,
{
struct btrfs_truncate_control control = {
.min_type = BTRFS_EXTENT_DATA_KEY,
+ .clear_extent_range = true,
};
struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
struct btrfs_root *root = BTRFS_I(inode)->root;