aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosef Bacik <josef@redhat.com>2011-08-30 11:31:29 -0400
committerJosef Bacik <josef@redhat.com>2011-10-19 15:12:42 -0400
commit4c13d758b7e79c14a0026c1f783f0c79e339b7bb (patch)
treed1510daf164457d433b5f6219e5d48f2f6720a31
parentc09544e07f8cdc455ed8615d4c067d694c33bd18 (diff)
Btrfs: use the transactions block_rsv for the csum root
The alloc warnings everybody has been seeing is because we have been reserving space for csums, but we weren't actually using that space. So make get_block_rsv() return the trans->block_rsv if we're modifying the csum root. Also set the trans->block_rsv to NULL so that if we modify the csum root when running delayed ref's that comes out of the global reserve like it's supposed to. With this patch I'm not seeing those alloc warnings anymore. Thanks, Signed-off-by: Josef Bacik <josef@redhat.com>
-rw-r--r--fs/btrfs/extent-tree.c15
-rw-r--r--fs/btrfs/transaction.c1
2 files changed, 10 insertions, 6 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index ccdc4d12e8d4..53f6dbdab510 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -3565,10 +3565,12 @@ out:
3565static struct btrfs_block_rsv *get_block_rsv(struct btrfs_trans_handle *trans, 3565static struct btrfs_block_rsv *get_block_rsv(struct btrfs_trans_handle *trans,
3566 struct btrfs_root *root) 3566 struct btrfs_root *root)
3567{ 3567{
3568 struct btrfs_block_rsv *block_rsv; 3568 struct btrfs_block_rsv *block_rsv = NULL;
3569 if (root->ref_cows) 3569
3570 if (root->ref_cows || root == root->fs_info->csum_root)
3570 block_rsv = trans->block_rsv; 3571 block_rsv = trans->block_rsv;
3571 else 3572
3573 if (!block_rsv)
3572 block_rsv = root->block_rsv; 3574 block_rsv = root->block_rsv;
3573 3575
3574 if (!block_rsv) 3576 if (!block_rsv)
@@ -3865,12 +3867,13 @@ static void release_global_block_rsv(struct btrfs_fs_info *fs_info)
3865void btrfs_trans_release_metadata(struct btrfs_trans_handle *trans, 3867void btrfs_trans_release_metadata(struct btrfs_trans_handle *trans,
3866 struct btrfs_root *root) 3868 struct btrfs_root *root)
3867{ 3869{
3870 struct btrfs_block_rsv *block_rsv;
3871
3868 if (!trans->bytes_reserved) 3872 if (!trans->bytes_reserved)
3869 return; 3873 return;
3870 3874
3871 BUG_ON(trans->block_rsv != &root->fs_info->trans_block_rsv); 3875 block_rsv = &root->fs_info->trans_block_rsv;
3872 btrfs_block_rsv_release(root, trans->block_rsv, 3876 btrfs_block_rsv_release(root, block_rsv, trans->bytes_reserved);
3873 trans->bytes_reserved);
3874 trans->bytes_reserved = 0; 3877 trans->bytes_reserved = 0;
3875} 3878}
3876 3879
diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c
index a1d8c322c1ba..a770f4bd9d31 100644
--- a/fs/btrfs/transaction.c
+++ b/fs/btrfs/transaction.c
@@ -453,6 +453,7 @@ static int __btrfs_end_transaction(struct btrfs_trans_handle *trans,
453 return 0; 453 return 0;
454 } 454 }
455 455
456 trans->block_rsv = NULL;
456 while (count < 4) { 457 while (count < 4) {
457 unsigned long cur = trans->delayed_ref_updates; 458 unsigned long cur = trans->delayed_ref_updates;
458 trans->delayed_ref_updates = 0; 459 trans->delayed_ref_updates = 0;