btrfs: introduce BTRFS_QGROUP_RUNTIME_FLAG_NO_ACCOUNTING to skip qgroup accounting
authorQu Wenruo <wqu@suse.com>
Wed, 24 Aug 2022 01:14:08 +0000 (09:14 +0800)
committerDavid Sterba <dsterba@suse.com>
Mon, 26 Sep 2022 10:28:01 +0000 (12:28 +0200)
The new flag will make btrfs qgroup skip all its time consuming
qgroup accounting.

The lifespan is the same as BTRFS_QGROUP_RUNTIME_FLAG_CANCEL_RESCAN,
only get cleared after a new rescan.

Signed-off-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/qgroup.c
fs/btrfs/qgroup.h

index 18672202e0a5094f26a8e6c042d0c104d3b1a1af..89df16dcd83fc79621d83ce6c42ae9280314a900 100644 (file)
@@ -336,7 +336,8 @@ int btrfs_verify_qgroup_counts(struct btrfs_fs_info *fs_info, u64 qgroupid,
 static void qgroup_mark_inconsistent(struct btrfs_fs_info *fs_info)
 {
        fs_info->qgroup_flags |= (BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT |
-                                 BTRFS_QGROUP_RUNTIME_FLAG_CANCEL_RESCAN);
+                                 BTRFS_QGROUP_RUNTIME_FLAG_CANCEL_RESCAN |
+                                 BTRFS_QGROUP_RUNTIME_FLAG_NO_ACCOUNTING);
 }
 
 /*
@@ -1813,6 +1814,9 @@ int btrfs_qgroup_trace_extent_post(struct btrfs_trans_handle *trans,
         */
        ASSERT(trans != NULL);
 
+       if (trans->fs_info->qgroup_flags & BTRFS_QGROUP_RUNTIME_FLAG_NO_ACCOUNTING)
+               return 0;
+
        ret = btrfs_find_all_roots(NULL, trans->fs_info, bytenr, 0, &old_root,
                                   true);
        if (ret < 0) {
@@ -2627,7 +2631,8 @@ int btrfs_qgroup_account_extent(struct btrfs_trans_handle *trans, u64 bytenr,
         * If quotas get disabled meanwhile, the resources need to be freed and
         * we can't just exit here.
         */
-       if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags))
+       if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags) ||
+           fs_info->qgroup_flags & BTRFS_QGROUP_RUNTIME_FLAG_NO_ACCOUNTING)
                goto out_free;
 
        if (new_roots) {
@@ -2723,7 +2728,8 @@ int btrfs_qgroup_account_extents(struct btrfs_trans_handle *trans)
                num_dirty_extents++;
                trace_btrfs_qgroup_account_extents(fs_info, record);
 
-               if (!ret) {
+               if (!ret && !(fs_info->qgroup_flags &
+                             BTRFS_QGROUP_RUNTIME_FLAG_NO_ACCOUNTING)) {
                        /*
                         * Old roots should be searched when inserting qgroup
                         * extent record
@@ -3460,7 +3466,8 @@ qgroup_rescan_init(struct btrfs_fs_info *fs_info, u64 progress_objectid,
 
        memset(&fs_info->qgroup_rescan_progress, 0,
                sizeof(fs_info->qgroup_rescan_progress));
-       fs_info->qgroup_flags &= ~BTRFS_QGROUP_RUNTIME_FLAG_CANCEL_RESCAN;
+       fs_info->qgroup_flags &= ~(BTRFS_QGROUP_RUNTIME_FLAG_CANCEL_RESCAN |
+                                  BTRFS_QGROUP_RUNTIME_FLAG_NO_ACCOUNTING);
        fs_info->qgroup_rescan_progress.objectid = progress_objectid;
        init_completion(&fs_info->qgroup_rescan_completion);
        mutex_unlock(&fs_info->qgroup_rescan_lock);
index 90d3632c552432519da32f00fdba37871439613b..578c77e94200f580918149609673588444be9a2f 100644 (file)
  */
 
 #define BTRFS_QGROUP_RUNTIME_FLAG_CANCEL_RESCAN                (1UL << 3)
+#define BTRFS_QGROUP_RUNTIME_FLAG_NO_ACCOUNTING                (1UL << 4)
 
 /*
  * Record a dirty extent, and info qgroup to update quota on it