diff options
Diffstat (limited to 'fs/btrfs/extent-tree.c')
-rw-r--r-- | fs/btrfs/extent-tree.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index c08337a83ace..2ce16f97730a 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
@@ -4565,6 +4565,13 @@ int btrfs_delalloc_reserve_metadata(struct inode *inode, u64 num_bytes) | |||
4565 | csum_bytes = BTRFS_I(inode)->csum_bytes; | 4565 | csum_bytes = BTRFS_I(inode)->csum_bytes; |
4566 | spin_unlock(&BTRFS_I(inode)->lock); | 4566 | spin_unlock(&BTRFS_I(inode)->lock); |
4567 | 4567 | ||
4568 | if (root->fs_info->quota_enabled) { | ||
4569 | ret = btrfs_qgroup_reserve(root, num_bytes + | ||
4570 | nr_extents * root->leafsize); | ||
4571 | if (ret) | ||
4572 | return ret; | ||
4573 | } | ||
4574 | |||
4568 | ret = reserve_metadata_bytes(root, block_rsv, to_reserve, flush); | 4575 | ret = reserve_metadata_bytes(root, block_rsv, to_reserve, flush); |
4569 | if (ret) { | 4576 | if (ret) { |
4570 | u64 to_free = 0; | 4577 | u64 to_free = 0; |
@@ -4643,6 +4650,11 @@ void btrfs_delalloc_release_metadata(struct inode *inode, u64 num_bytes) | |||
4643 | 4650 | ||
4644 | trace_btrfs_space_reservation(root->fs_info, "delalloc", | 4651 | trace_btrfs_space_reservation(root->fs_info, "delalloc", |
4645 | btrfs_ino(inode), to_free, 0); | 4652 | btrfs_ino(inode), to_free, 0); |
4653 | if (root->fs_info->quota_enabled) { | ||
4654 | btrfs_qgroup_free(root, num_bytes + | ||
4655 | dropped * root->leafsize); | ||
4656 | } | ||
4657 | |||
4646 | btrfs_block_rsv_release(root, &root->fs_info->delalloc_block_rsv, | 4658 | btrfs_block_rsv_release(root, &root->fs_info->delalloc_block_rsv, |
4647 | to_free); | 4659 | to_free); |
4648 | } | 4660 | } |