aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoris Burkov <[email protected]>2023-06-28 11:00:05 -0700
committerDavid Sterba <[email protected]>2023-10-12 16:44:10 +0200
commit6ed05643ddb166c0fddabac8ee092659006214a9 (patch)
treed4170bc6404d703e0eeecb955cbb76322679585f
parentaf0e2aab3b70b7844232bbce2a619ec70e049df4 (diff)
btrfs: create qgroup earlier in snapshot creation
Pull creating the qgroup earlier in the snapshot. This allows simple quotas qgroups to see all the metadata writes related to the snapshot being created and to be born with the root node accounted. Note this has an impact on transaction commit where the qgroup creation can do a lot of work, allocate memory and take locks. The change is done for correctness, potential performance issues will be fixed in the future. Signed-off-by: Boris Burkov <[email protected]> [ add note ] Signed-off-by: David Sterba <[email protected]>
-rw-r--r--fs/btrfs/qgroup.c3
-rw-r--r--fs/btrfs/transaction.c6
2 files changed, 9 insertions, 0 deletions
diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c
index a95c11a163f2..3a6fb57b99f0 100644
--- a/fs/btrfs/qgroup.c
+++ b/fs/btrfs/qgroup.c
@@ -1689,6 +1689,9 @@ int btrfs_create_qgroup(struct btrfs_trans_handle *trans, u64 qgroupid)
struct btrfs_qgroup *prealloc = NULL;
int ret = 0;
+ if (btrfs_qgroup_mode(fs_info) == BTRFS_QGROUP_MODE_DISABLED)
+ return 0;
+
mutex_lock(&fs_info->qgroup_ioctl_lock);
if (!fs_info->quota_root) {
ret = -ENOTCONN;
diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c
index f5c3ea01c3d6..6c24d00c3612 100644
--- a/fs/btrfs/transaction.c
+++ b/fs/btrfs/transaction.c
@@ -1812,6 +1812,12 @@ static noinline int create_pending_snapshot(struct btrfs_trans_handle *trans,
}
btrfs_release_path(path);
+ ret = btrfs_create_qgroup(trans, objectid);
+ if (ret) {
+ btrfs_abort_transaction(trans, ret);
+ goto fail;
+ }
+
/*
* pull in the delayed directory update
* and the delayed inode item