]> git.proxmox.com Git - mirror_ubuntu-disco-kernel.git/commitdiff
Btrfs: use the transactions block_rsv for the csum root
authorJosef Bacik <josef@redhat.com>
Tue, 30 Aug 2011 15:31:29 +0000 (11:31 -0400)
committerJosef Bacik <josef@redhat.com>
Wed, 19 Oct 2011 19:12:42 +0000 (15:12 -0400)
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>
fs/btrfs/extent-tree.c
fs/btrfs/transaction.c

index ccdc4d12e8d42af7fbc1a54d9e558e5b952191a9..53f6dbdab51029077a3a6e6d04c62cb26adf70fd 100644 (file)
@@ -3565,10 +3565,12 @@ out:
 static struct btrfs_block_rsv *get_block_rsv(struct btrfs_trans_handle *trans,
                                             struct btrfs_root *root)
 {
-       struct btrfs_block_rsv *block_rsv;
-       if (root->ref_cows)
+       struct btrfs_block_rsv *block_rsv = NULL;
+
+       if (root->ref_cows || root == root->fs_info->csum_root)
                block_rsv = trans->block_rsv;
-       else
+
+       if (!block_rsv)
                block_rsv = root->block_rsv;
 
        if (!block_rsv)
@@ -3865,12 +3867,13 @@ static void release_global_block_rsv(struct btrfs_fs_info *fs_info)
 void btrfs_trans_release_metadata(struct btrfs_trans_handle *trans,
                                  struct btrfs_root *root)
 {
+       struct btrfs_block_rsv *block_rsv;
+
        if (!trans->bytes_reserved)
                return;
 
-       BUG_ON(trans->block_rsv != &root->fs_info->trans_block_rsv);
-       btrfs_block_rsv_release(root, trans->block_rsv,
-                               trans->bytes_reserved);
+       block_rsv = &root->fs_info->trans_block_rsv;
+       btrfs_block_rsv_release(root, block_rsv, trans->bytes_reserved);
        trans->bytes_reserved = 0;
 }
 
index a1d8c322c1ba723257e9432fb35c6cbdc1ff1067..a770f4bd9d315239cb209c6e76397d7eead24ddf 100644 (file)
@@ -453,6 +453,7 @@ static int __btrfs_end_transaction(struct btrfs_trans_handle *trans,
                return 0;
        }
 
+       trans->block_rsv = NULL;
        while (count < 4) {
                unsigned long cur = trans->delayed_ref_updates;
                trans->delayed_ref_updates = 0;