*/
ret = btrfs_truncate_inode_items(trans, root, inode, &control);
+ inode_sub_bytes(&inode->vfs_inode, control.sub_bytes);
btrfs_inode_safe_disk_i_size_write(inode, control.last_size);
unlock_extent_cached(&inode->io_tree, 0, (u64)-1, &cached_state);
BUG_ON(new_size > 0 && control->min_type != BTRFS_EXTENT_DATA_KEY);
control->last_size = new_size;
+ control->sub_bytes = 0;
/*
* For shareable roots we want to back off from time to time, this turns
btrfs_set_file_extent_num_bytes(leaf, fi,
extent_num_bytes);
num_dec = (orig_num_bytes - extent_num_bytes);
- if (test_bit(BTRFS_ROOT_SHAREABLE, &root->state) &&
- extent_start != 0)
- inode_sub_bytes(&inode->vfs_inode,
- num_dec);
+ if (extent_start != 0)
+ control->sub_bytes += num_dec;
btrfs_mark_buffer_dirty(leaf);
} else {
extent_num_bytes =
/* FIXME blocksize != 4096 */
num_dec = btrfs_file_extent_num_bytes(leaf, fi);
- if (extent_start != 0) {
- if (test_bit(BTRFS_ROOT_SHAREABLE,
- &root->state))
- inode_sub_bytes(&inode->vfs_inode,
- num_dec);
- }
+ if (extent_start != 0)
+ control->sub_bytes += num_dec;
}
clear_len = num_dec;
} else if (extent_type == BTRFS_FILE_EXTENT_INLINE) {
clear_len = fs_info->sectorsize;
}
- if (test_bit(BTRFS_ROOT_SHAREABLE, &root->state))
- inode_sub_bytes(&inode->vfs_inode,
- item_end + 1 - new_size);
+ control->sub_bytes += item_end + 1 - new_size;
}
delete:
/*
/* OUT: the last size we truncated this inode to. */
u64 last_size;
+ /* OUT: the number of bytes to sub from this inode. */
+ u64 sub_bytes;
+
/*
* IN: minimum key type to remove. All key types with this type are
* removed only if their offset >= new_size.
ret = btrfs_truncate_inode_items(trans, root, BTRFS_I(inode),
&control);
+ inode_sub_bytes(inode, control.sub_bytes);
btrfs_inode_safe_disk_i_size_write(BTRFS_I(inode), control.last_size);
unlock_extent_cached(&BTRFS_I(inode)->io_tree, lock_start,