diff options
| -rw-r--r-- | fs/btrfs/extent-tree.c | 22 |
1 files changed, 10 insertions, 12 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 85b8454d9608..61da9d0bb805 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
| @@ -4534,7 +4534,7 @@ int btrfs_delalloc_reserve_metadata(struct inode *inode, u64 num_bytes) | |||
| 4534 | unsigned nr_extents = 0; | 4534 | unsigned nr_extents = 0; |
| 4535 | int extra_reserve = 0; | 4535 | int extra_reserve = 0; |
| 4536 | enum btrfs_reserve_flush_enum flush = BTRFS_RESERVE_FLUSH_ALL; | 4536 | enum btrfs_reserve_flush_enum flush = BTRFS_RESERVE_FLUSH_ALL; |
| 4537 | int ret; | 4537 | int ret = 0; |
| 4538 | bool delalloc_lock = true; | 4538 | bool delalloc_lock = true; |
| 4539 | 4539 | ||
| 4540 | /* If we are a free space inode we need to not flush since we will be in | 4540 | /* If we are a free space inode we need to not flush since we will be in |
| @@ -4579,20 +4579,18 @@ int btrfs_delalloc_reserve_metadata(struct inode *inode, u64 num_bytes) | |||
| 4579 | csum_bytes = BTRFS_I(inode)->csum_bytes; | 4579 | csum_bytes = BTRFS_I(inode)->csum_bytes; |
| 4580 | spin_unlock(&BTRFS_I(inode)->lock); | 4580 | spin_unlock(&BTRFS_I(inode)->lock); |
| 4581 | 4581 | ||
| 4582 | if (root->fs_info->quota_enabled) { | 4582 | if (root->fs_info->quota_enabled) |
| 4583 | ret = btrfs_qgroup_reserve(root, num_bytes + | 4583 | ret = btrfs_qgroup_reserve(root, num_bytes + |
| 4584 | nr_extents * root->leafsize); | 4584 | nr_extents * root->leafsize); |
| 4585 | if (ret) { | ||
| 4586 | spin_lock(&BTRFS_I(inode)->lock); | ||
| 4587 | calc_csum_metadata_size(inode, num_bytes, 0); | ||
| 4588 | spin_unlock(&BTRFS_I(inode)->lock); | ||
| 4589 | if (delalloc_lock) | ||
| 4590 | mutex_unlock(&BTRFS_I(inode)->delalloc_mutex); | ||
| 4591 | return ret; | ||
| 4592 | } | ||
| 4593 | } | ||
| 4594 | 4585 | ||
| 4595 | ret = reserve_metadata_bytes(root, block_rsv, to_reserve, flush); | 4586 | /* |
| 4587 | * ret != 0 here means the qgroup reservation failed, we go straight to | ||
| 4588 | * the shared error handling then. | ||
| 4589 | */ | ||
| 4590 | if (ret == 0) | ||
| 4591 | ret = reserve_metadata_bytes(root, block_rsv, | ||
| 4592 | to_reserve, flush); | ||
| 4593 | |||
| 4596 | if (ret) { | 4594 | if (ret) { |
| 4597 | u64 to_free = 0; | 4595 | u64 to_free = 0; |
| 4598 | unsigned dropped; | 4596 | unsigned dropped; |
