btrfs: sysfs: expose quota mode via sysfs
authorBoris Burkov <boris@bur.io>
Thu, 27 Apr 2023 17:58:20 +0000 (10:58 -0700)
committerDavid Sterba <dsterba@suse.com>
Thu, 12 Oct 2023 14:44:10 +0000 (16:44 +0200)
Add a new sysfs file /sys/fs/btrfs/<uuid>/qgroups/mode
which prints out the mode qgroups is running in. The possible modes are
qgroup, and squota.

If quotas are not enabled, then the qgroups directory will not exist,
so don't handle that mode.

Signed-off-by: Boris Burkov <boris@bur.io>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/sysfs.c

index 8b75e974f30b97079bf9219035fc670d320f53d8..68b7d678790cf67fbeddb5bde4345da98e72987c 100644 (file)
@@ -2089,6 +2089,33 @@ static ssize_t qgroup_enabled_show(struct kobject *qgroups_kobj,
 }
 BTRFS_ATTR(qgroups, enabled, qgroup_enabled_show);
 
+static ssize_t qgroup_mode_show(struct kobject *qgroups_kobj,
+                               struct kobj_attribute *a,
+                               char *buf)
+{
+       struct btrfs_fs_info *fs_info = to_fs_info(qgroups_kobj->parent);
+       ssize_t ret = 0;
+
+       spin_lock(&fs_info->qgroup_lock);
+       ASSERT(btrfs_qgroup_enabled(fs_info));
+       switch (btrfs_qgroup_mode(fs_info)) {
+       case BTRFS_QGROUP_MODE_FULL:
+               ret = sysfs_emit(buf, "qgroup\n");
+               break;
+       case BTRFS_QGROUP_MODE_SIMPLE:
+               ret = sysfs_emit(buf, "squota\n");
+               break;
+       default:
+               btrfs_warn(fs_info, "unexpected qgroup mode %d\n",
+                          btrfs_qgroup_mode(fs_info));
+               break;
+       }
+       spin_unlock(&fs_info->qgroup_lock);
+
+       return ret;
+}
+BTRFS_ATTR(qgroups, mode, qgroup_mode_show);
+
 static ssize_t qgroup_inconsistent_show(struct kobject *qgroups_kobj,
                                        struct kobj_attribute *a,
                                        char *buf)
@@ -2151,6 +2178,7 @@ static struct attribute *qgroups_attrs[] = {
        BTRFS_ATTR_PTR(qgroups, enabled),
        BTRFS_ATTR_PTR(qgroups, inconsistent),
        BTRFS_ATTR_PTR(qgroups, drop_subtree_threshold),
+       BTRFS_ATTR_PTR(qgroups, mode),
        NULL
 };
 ATTRIBUTE_GROUPS(qgroups);