|
@@ -4534,7 +4534,7 @@ int btrfs_delalloc_reserve_metadata(struct inode *inode, u64 num_bytes)
|
|
unsigned nr_extents = 0;
|
|
unsigned nr_extents = 0;
|
|
int extra_reserve = 0;
|
|
int extra_reserve = 0;
|
|
enum btrfs_reserve_flush_enum flush = BTRFS_RESERVE_FLUSH_ALL;
|
|
enum btrfs_reserve_flush_enum flush = BTRFS_RESERVE_FLUSH_ALL;
|
|
- int ret;
|
|
|
|
|
|
+ int ret = 0;
|
|
bool delalloc_lock = true;
|
|
bool delalloc_lock = true;
|
|
|
|
|
|
/* If we are a free space inode we need to not flush since we will be in
|
|
/* 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)
|
|
csum_bytes = BTRFS_I(inode)->csum_bytes;
|
|
csum_bytes = BTRFS_I(inode)->csum_bytes;
|
|
spin_unlock(&BTRFS_I(inode)->lock);
|
|
spin_unlock(&BTRFS_I(inode)->lock);
|
|
|
|
|
|
- if (root->fs_info->quota_enabled) {
|
|
|
|
|
|
+ if (root->fs_info->quota_enabled)
|
|
ret = btrfs_qgroup_reserve(root, num_bytes +
|
|
ret = btrfs_qgroup_reserve(root, num_bytes +
|
|
nr_extents * root->leafsize);
|
|
nr_extents * root->leafsize);
|
|
- if (ret) {
|
|
|
|
- spin_lock(&BTRFS_I(inode)->lock);
|
|
|
|
- calc_csum_metadata_size(inode, num_bytes, 0);
|
|
|
|
- spin_unlock(&BTRFS_I(inode)->lock);
|
|
|
|
- if (delalloc_lock)
|
|
|
|
- mutex_unlock(&BTRFS_I(inode)->delalloc_mutex);
|
|
|
|
- return ret;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
|
|
- ret = reserve_metadata_bytes(root, block_rsv, to_reserve, flush);
|
|
|
|
|
|
+ /*
|
|
|
|
+ * ret != 0 here means the qgroup reservation failed, we go straight to
|
|
|
|
+ * the shared error handling then.
|
|
|
|
+ */
|
|
|
|
+ if (ret == 0)
|
|
|
|
+ ret = reserve_metadata_bytes(root, block_rsv,
|
|
|
|
+ to_reserve, flush);
|
|
|
|
+
|
|
if (ret) {
|
|
if (ret) {
|
|
u64 to_free = 0;
|
|
u64 to_free = 0;
|
|
unsigned dropped;
|
|
unsigned dropped;
|