return error;
 }
 
+static ssize_t qgroup_enabled_show(struct kobject *qgroups_kobj,
+                                  struct kobj_attribute *a,
+                                  char *buf)
+{
+       struct btrfs_fs_info *fs_info = to_fs_info(qgroups_kobj->parent);
+       bool enabled;
+
+       spin_lock(&fs_info->qgroup_lock);
+       enabled = fs_info->qgroup_flags & BTRFS_QGROUP_STATUS_FLAG_ON;
+       spin_unlock(&fs_info->qgroup_lock);
+
+       return sysfs_emit(buf, "%d\n", enabled);
+}
+BTRFS_ATTR(qgroups, enabled, qgroup_enabled_show);
+
+static ssize_t qgroup_inconsistent_show(struct kobject *qgroups_kobj,
+                                       struct kobj_attribute *a,
+                                       char *buf)
+{
+       struct btrfs_fs_info *fs_info = to_fs_info(qgroups_kobj->parent);
+       bool inconsistent;
+
+       spin_lock(&fs_info->qgroup_lock);
+       inconsistent = (fs_info->qgroup_flags & BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT);
+       spin_unlock(&fs_info->qgroup_lock);
+
+       return sysfs_emit(buf, "%d\n", inconsistent);
+}
+BTRFS_ATTR(qgroups, inconsistent, qgroup_inconsistent_show);
+
+/*
+ * Qgroups global info
+ *
+ * Path: /sys/fs/btrfs/<uuid>/qgroups/
+ */
+static struct attribute *qgroups_attrs[] = {
+       BTRFS_ATTR_PTR(qgroups, enabled),
+       BTRFS_ATTR_PTR(qgroups, inconsistent),
+       NULL
+};
+ATTRIBUTE_GROUPS(qgroups);
+
+static void qgroups_release(struct kobject *kobj)
+{
+       kfree(kobj);
+}
+
+static struct kobj_type qgroups_ktype = {
+       .sysfs_ops = &kobj_sysfs_ops,
+       .default_groups = qgroups_groups,
+       .release = qgroups_release,
+};
+
 static inline struct btrfs_fs_info *qgroup_kobj_to_fs_info(struct kobject *kobj)
 {
        return to_fs_info(kobj->parent->parent);
        if (fs_info->qgroups_kobj)
                return 0;
 
-       fs_info->qgroups_kobj = kobject_create_and_add("qgroups", fsid_kobj);
-       if (!fs_info->qgroups_kobj) {
-               ret = -ENOMEM;
+       fs_info->qgroups_kobj = kzalloc(sizeof(struct kobject), GFP_KERNEL);
+       if (!fs_info->qgroups_kobj)
+               return -ENOMEM;
+
+       ret = kobject_init_and_add(fs_info->qgroups_kobj, &qgroups_ktype,
+                                  fsid_kobj, "qgroups");
+       if (ret < 0)
                goto out;
-       }
+
        rbtree_postorder_for_each_entry_safe(qgroup, next,
                                             &fs_info->qgroup_tree, node) {
                ret = btrfs_sysfs_add_one_qgroup(fs_info, qgroup);