Make snapshot accounting work with new extent-oriented mechanism by
skipping given root in new/old_roots in create_pending_snapshot().

Signed-off-by: Qu Wenruo <quwen...@cn.fujitsu.com>
---
v2:
  None
---
 fs/btrfs/transaction.c | 53 +++++++++++++++++++++++++++++++-------------------
 1 file changed, 33 insertions(+), 20 deletions(-)

diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c
index 2b50ce4..0f3c1b8 100644
--- a/fs/btrfs/transaction.c
+++ b/fs/btrfs/transaction.c
@@ -1286,6 +1286,12 @@ static noinline int create_pending_snapshot(struct 
btrfs_trans_handle *trans,
        if (pending->error)
                goto no_free_objectid;
 
+       /*
+        * Make qgroup to skip current new snapshot's qgroupid, as it is
+        * accounted by later btrfs_qgroup_inherit().
+        */
+       btrfs_set_skip_qgroup(trans, objectid);
+
        btrfs_reloc_pre_snapshot(trans, pending, &to_reserve);
 
        if (to_reserve > 0) {
@@ -1294,7 +1300,7 @@ static noinline int create_pending_snapshot(struct 
btrfs_trans_handle *trans,
                                                     to_reserve,
                                                     BTRFS_RESERVE_NO_FLUSH);
                if (pending->error)
-                       goto no_free_objectid;
+                       goto clear_skip_qgroup;
        }
 
        key.objectid = objectid;
@@ -1392,25 +1398,6 @@ static noinline int create_pending_snapshot(struct 
btrfs_trans_handle *trans,
                btrfs_abort_transaction(trans, root, ret);
                goto fail;
        }
-
-       /*
-        * We need to flush delayed refs in order to make sure all of our quota
-        * operations have been done before we call btrfs_qgroup_inherit.
-        */
-       ret = btrfs_run_delayed_refs(trans, root, (unsigned long)-1);
-       if (ret) {
-               btrfs_abort_transaction(trans, root, ret);
-               goto fail;
-       }
-
-       ret = btrfs_qgroup_inherit(trans, fs_info,
-                                  root->root_key.objectid,
-                                  objectid, pending->inherit);
-       if (ret) {
-               btrfs_abort_transaction(trans, root, ret);
-               goto fail;
-       }
-
        /* see comments in should_cow_block() */
        set_bit(BTRFS_ROOT_FORCE_COW, &root->state);
        smp_wmb();
@@ -1493,11 +1480,37 @@ static noinline int create_pending_snapshot(struct 
btrfs_trans_handle *trans,
                        goto fail;
                }
        }
+
+       ret = btrfs_run_delayed_refs(trans, root, (unsigned long)-1);
+       if (ret) {
+               btrfs_abort_transaction(trans, root, ret);
+               goto fail;
+       }
+
+       /*
+        * account qgroup counters before qgroup_inherit()
+        */
+       ret = btrfs_qgroup_prepare_account_extents(trans, fs_info);
+       if (ret)
+               goto fail;
+       ret = btrfs_qgroup_account_extents(trans, fs_info);
+       if (ret)
+               goto fail;
+       ret = btrfs_qgroup_inherit(trans, fs_info,
+                                  root->root_key.objectid,
+                                  objectid, pending->inherit);
+       if (ret) {
+               btrfs_abort_transaction(trans, root, ret);
+               goto fail;
+       }
+
 fail:
        pending->error = ret;
 dir_item_existed:
        trans->block_rsv = rsv;
        trans->bytes_reserved = 0;
+clear_skip_qgroup:
+       btrfs_clear_skip_qgroup(trans);
 no_free_objectid:
        kfree(new_root_item);
 root_item_alloc_fail:
-- 
2.3.6

--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to