}
 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)
        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);