Btrfs: call the qgroup accounting functions
authorJan Schmidt <list.btrfs@jan-o-sch.net>
Thu, 28 Jun 2012 16:04:55 +0000 (18:04 +0200)
committerJan Schmidt <list.btrfs@jan-o-sch.net>
Thu, 12 Jul 2012 08:54:37 +0000 (10:54 +0200)
Signed-off-by: Jan Schmidt <list.btrfs@jan-o-sch.net>
fs/btrfs/extent-tree.c
fs/btrfs/transaction.c

index 1a63b830846dc261ea1c59e78271966c325c35d2..c08337a83aced70b82c37b48569fbcdb581a8f22 100644 (file)
@@ -2479,6 +2479,8 @@ int btrfs_run_delayed_refs(struct btrfs_trans_handle *trans,
                       2 * 1024 * 1024, btrfs_get_alloc_profile(root, 0),
                       CHUNK_ALLOC_NO_FORCE);
 
+       btrfs_delayed_refs_qgroup_accounting(trans, root->fs_info);
+
        delayed_refs = &trans->transaction->delayed_refs;
        INIT_LIST_HEAD(&cluster);
 again:
@@ -2588,6 +2590,7 @@ again:
        }
 out:
        spin_unlock(&delayed_refs->lock);
+       assert_qgroups_uptodate(trans);
        return 0;
 }
 
index 0d6c8816845a2bd7c19bffcbeedd2be6151e670a..d20d2e24f8d2d1fe801c0e342789ef2e46f83f6d 100644 (file)
@@ -512,6 +512,11 @@ static int __btrfs_end_transaction(struct btrfs_trans_handle *trans,
                return 0;
        }
 
+       /*
+        * do the qgroup accounting as early as possible
+        */
+       err = btrfs_delayed_refs_qgroup_accounting(trans, info);
+
        btrfs_trans_release_metadata(trans, root);
        trans->block_rsv = NULL;
        /*
@@ -571,6 +576,7 @@ static int __btrfs_end_transaction(struct btrfs_trans_handle *trans,
            root->fs_info->fs_state & BTRFS_SUPER_FLAG_ERROR) {
                err = -EIO;
        }
+       assert_qgroups_uptodate(trans);
 
        memset(trans, 0, sizeof(*trans));
        kmem_cache_free(btrfs_trans_handle_cachep, trans);
@@ -1355,6 +1361,13 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans,
                if (ret)
                        goto cleanup_transaction;
 
+               /*
+                * running the delayed items may have added new refs. account
+                * them now so that they hinder processing of more delayed refs
+                * as little as possible.
+                */
+               btrfs_delayed_refs_qgroup_accounting(trans, root->fs_info);
+
                /*
                 * rename don't use btrfs_join_transaction, so, once we
                 * set the transaction to blocked above, we aren't going
@@ -1467,6 +1480,7 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans,
                            root->fs_info->chunk_root->node);
        switch_commit_root(root->fs_info->chunk_root);
 
+       assert_qgroups_uptodate(trans);
        update_super_roots(root);
 
        if (!root->fs_info->log_root_recovering) {
This page took 0.034288 seconds and 5 git commands to generate.