aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/btrfs/extent-tree.c14
-rw-r--r--fs/btrfs/transaction.c34
-rw-r--r--fs/btrfs/transaction.h1
3 files changed, 13 insertions, 36 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index 6c7927cd4f41..130df70f3348 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -5337,7 +5337,7 @@ int btrfs_subvolume_reserve_metadata(struct btrfs_root *root,
5337 if (root->fs_info->quota_enabled) { 5337 if (root->fs_info->quota_enabled) {
5338 /* One for parent inode, two for dir entries */ 5338 /* One for parent inode, two for dir entries */
5339 num_bytes = 3 * root->nodesize; 5339 num_bytes = 3 * root->nodesize;
5340 ret = btrfs_qgroup_reserve(root, num_bytes); 5340 ret = btrfs_qgroup_reserve_meta(root, num_bytes);
5341 if (ret) 5341 if (ret)
5342 return ret; 5342 return ret;
5343 } else { 5343 } else {
@@ -5355,10 +5355,8 @@ int btrfs_subvolume_reserve_metadata(struct btrfs_root *root,
5355 if (ret == -ENOSPC && use_global_rsv) 5355 if (ret == -ENOSPC && use_global_rsv)
5356 ret = btrfs_block_rsv_migrate(global_rsv, rsv, num_bytes); 5356 ret = btrfs_block_rsv_migrate(global_rsv, rsv, num_bytes);
5357 5357
5358 if (ret) { 5358 if (ret && *qgroup_reserved)
5359 if (*qgroup_reserved) 5359 btrfs_qgroup_free_meta(root, *qgroup_reserved);
5360 btrfs_qgroup_free(root, *qgroup_reserved);
5361 }
5362 5360
5363 return ret; 5361 return ret;
5364} 5362}
@@ -5519,15 +5517,15 @@ int btrfs_delalloc_reserve_metadata(struct inode *inode, u64 num_bytes)
5519 spin_unlock(&BTRFS_I(inode)->lock); 5517 spin_unlock(&BTRFS_I(inode)->lock);
5520 5518
5521 if (root->fs_info->quota_enabled) { 5519 if (root->fs_info->quota_enabled) {
5522 ret = btrfs_qgroup_reserve(root, nr_extents * root->nodesize); 5520 ret = btrfs_qgroup_reserve_meta(root,
5521 nr_extents * root->nodesize);
5523 if (ret) 5522 if (ret)
5524 goto out_fail; 5523 goto out_fail;
5525 } 5524 }
5526 5525
5527 ret = reserve_metadata_bytes(root, block_rsv, to_reserve, flush); 5526 ret = reserve_metadata_bytes(root, block_rsv, to_reserve, flush);
5528 if (unlikely(ret)) { 5527 if (unlikely(ret)) {
5529 if (root->fs_info->quota_enabled) 5528 btrfs_qgroup_free_meta(root, nr_extents * root->nodesize);
5530 btrfs_qgroup_free(root, nr_extents * root->nodesize);
5531 goto out_fail; 5529 goto out_fail;
5532 } 5530 }
5533 5531
diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c
index 9354e7a1247f..e377d7bb454e 100644
--- a/fs/btrfs/transaction.c
+++ b/fs/btrfs/transaction.c
@@ -480,13 +480,10 @@ start_transaction(struct btrfs_root *root, unsigned int num_items,
480 * the appropriate flushing if need be. 480 * the appropriate flushing if need be.
481 */ 481 */
482 if (num_items > 0 && root != root->fs_info->chunk_root) { 482 if (num_items > 0 && root != root->fs_info->chunk_root) {
483 if (root->fs_info->quota_enabled && 483 qgroup_reserved = num_items * root->nodesize;
484 is_fstree(root->root_key.objectid)) { 484 ret = btrfs_qgroup_reserve_meta(root, qgroup_reserved);
485 qgroup_reserved = num_items * root->nodesize; 485 if (ret)
486 ret = btrfs_qgroup_reserve(root, qgroup_reserved); 486 return ERR_PTR(ret);
487 if (ret)
488 return ERR_PTR(ret);
489 }
490 487
491 num_bytes = btrfs_calc_trans_metadata_size(root, num_items); 488 num_bytes = btrfs_calc_trans_metadata_size(root, num_items);
492 /* 489 /*
@@ -547,6 +544,7 @@ again:
547 h->transaction = cur_trans; 544 h->transaction = cur_trans;
548 h->root = root; 545 h->root = root;
549 h->use_count = 1; 546 h->use_count = 1;
547
550 h->type = type; 548 h->type = type;
551 h->can_flush_pending_bgs = true; 549 h->can_flush_pending_bgs = true;
552 INIT_LIST_HEAD(&h->qgroup_ref_list); 550 INIT_LIST_HEAD(&h->qgroup_ref_list);
@@ -568,7 +566,6 @@ again:
568 h->bytes_reserved = num_bytes; 566 h->bytes_reserved = num_bytes;
569 h->reloc_reserved = reloc_reserved; 567 h->reloc_reserved = reloc_reserved;
570 } 568 }
571 h->qgroup_reserved = qgroup_reserved;
572 569
573got_it: 570got_it:
574 btrfs_record_root_in_trans(h, root); 571 btrfs_record_root_in_trans(h, root);
@@ -586,8 +583,7 @@ alloc_fail:
586 btrfs_block_rsv_release(root, &root->fs_info->trans_block_rsv, 583 btrfs_block_rsv_release(root, &root->fs_info->trans_block_rsv,
587 num_bytes); 584 num_bytes);
588reserve_fail: 585reserve_fail:
589 if (qgroup_reserved) 586 btrfs_qgroup_free_meta(root, qgroup_reserved);
590 btrfs_qgroup_free(root, qgroup_reserved);
591 return ERR_PTR(ret); 587 return ERR_PTR(ret);
592} 588}
593 589
@@ -805,15 +801,6 @@ static int __btrfs_end_transaction(struct btrfs_trans_handle *trans,
805 must_run_delayed_refs = 2; 801 must_run_delayed_refs = 2;
806 } 802 }
807 803
808 if (trans->qgroup_reserved) {
809 /*
810 * the same root has to be passed here between start_transaction
811 * and end_transaction. Subvolume quota depends on this.
812 */
813 btrfs_qgroup_free(trans->root, trans->qgroup_reserved);
814 trans->qgroup_reserved = 0;
815 }
816
817 btrfs_trans_release_metadata(trans, root); 804 btrfs_trans_release_metadata(trans, root);
818 trans->block_rsv = NULL; 805 trans->block_rsv = NULL;
819 806
@@ -1231,6 +1218,7 @@ static noinline int commit_fs_roots(struct btrfs_trans_handle *trans,
1231 spin_lock(&fs_info->fs_roots_radix_lock); 1218 spin_lock(&fs_info->fs_roots_radix_lock);
1232 if (err) 1219 if (err)
1233 break; 1220 break;
1221 btrfs_qgroup_free_meta_all(root);
1234 } 1222 }
1235 } 1223 }
1236 spin_unlock(&fs_info->fs_roots_radix_lock); 1224 spin_unlock(&fs_info->fs_roots_radix_lock);
@@ -1835,10 +1823,6 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans,
1835 1823
1836 btrfs_trans_release_metadata(trans, root); 1824 btrfs_trans_release_metadata(trans, root);
1837 trans->block_rsv = NULL; 1825 trans->block_rsv = NULL;
1838 if (trans->qgroup_reserved) {
1839 btrfs_qgroup_free(root, trans->qgroup_reserved);
1840 trans->qgroup_reserved = 0;
1841 }
1842 1826
1843 cur_trans = trans->transaction; 1827 cur_trans = trans->transaction;
1844 1828
@@ -2191,10 +2175,6 @@ cleanup_transaction:
2191 btrfs_trans_release_metadata(trans, root); 2175 btrfs_trans_release_metadata(trans, root);
2192 btrfs_trans_release_chunk_metadata(trans); 2176 btrfs_trans_release_chunk_metadata(trans);
2193 trans->block_rsv = NULL; 2177 trans->block_rsv = NULL;
2194 if (trans->qgroup_reserved) {
2195 btrfs_qgroup_free(root, trans->qgroup_reserved);
2196 trans->qgroup_reserved = 0;
2197 }
2198 btrfs_warn(root->fs_info, "Skipping commit of aborted transaction."); 2178 btrfs_warn(root->fs_info, "Skipping commit of aborted transaction.");
2199 if (current->journal_info == trans) 2179 if (current->journal_info == trans)
2200 current->journal_info = NULL; 2180 current->journal_info = NULL;
diff --git a/fs/btrfs/transaction.h b/fs/btrfs/transaction.h
index db6bfd92f0ea..54b7dea74967 100644
--- a/fs/btrfs/transaction.h
+++ b/fs/btrfs/transaction.h
@@ -107,7 +107,6 @@ struct btrfs_trans_handle {
107 u64 transid; 107 u64 transid;
108 u64 bytes_reserved; 108 u64 bytes_reserved;
109 u64 chunk_bytes_reserved; 109 u64 chunk_bytes_reserved;
110 u64 qgroup_reserved;
111 unsigned long use_count; 110 unsigned long use_count;
112 unsigned long blocks_reserved; 111 unsigned long blocks_reserved;
113 unsigned long blocks_used; 112 unsigned long blocks_used;