linux/fs/btrfs/sysfs.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * Copyright (C) 2007 Oracle.  All rights reserved.
   4 */
   5
   6#include <linux/sched.h>
   7#include <linux/sched/mm.h>
   8#include <linux/slab.h>
   9#include <linux/spinlock.h>
  10#include <linux/completion.h>
  11#include <linux/bug.h>
  12#include <crypto/hash.h>
  13
  14#include "ctree.h"
  15#include "discard.h"
  16#include "disk-io.h"
  17#include "send.h"
  18#include "transaction.h"
  19#include "sysfs.h"
  20#include "volumes.h"
  21#include "space-info.h"
  22#include "block-group.h"
  23#include "qgroup.h"
  24
  25struct btrfs_feature_attr {
  26        struct kobj_attribute kobj_attr;
  27        enum btrfs_feature_set feature_set;
  28        u64 feature_bit;
  29};
  30
  31/* For raid type sysfs entries */
  32struct raid_kobject {
  33        u64 flags;
  34        struct kobject kobj;
  35};
  36
  37#define __INIT_KOBJ_ATTR(_name, _mode, _show, _store)                   \
  38{                                                                       \
  39        .attr   = { .name = __stringify(_name), .mode = _mode },        \
  40        .show   = _show,                                                \
  41        .store  = _store,                                               \
  42}
  43
  44#define BTRFS_ATTR_RW(_prefix, _name, _show, _store)                    \
  45        static struct kobj_attribute btrfs_attr_##_prefix##_##_name =   \
  46                        __INIT_KOBJ_ATTR(_name, 0644, _show, _store)
  47
  48#define BTRFS_ATTR(_prefix, _name, _show)                               \
  49        static struct kobj_attribute btrfs_attr_##_prefix##_##_name =   \
  50                        __INIT_KOBJ_ATTR(_name, 0444, _show, NULL)
  51
  52#define BTRFS_ATTR_PTR(_prefix, _name)                                  \
  53        (&btrfs_attr_##_prefix##_##_name.attr)
  54
  55#define BTRFS_FEAT_ATTR(_name, _feature_set, _feature_prefix, _feature_bit)  \
  56static struct btrfs_feature_attr btrfs_attr_features_##_name = {             \
  57        .kobj_attr = __INIT_KOBJ_ATTR(_name, S_IRUGO,                        \
  58                                      btrfs_feature_attr_show,               \
  59                                      btrfs_feature_attr_store),             \
  60        .feature_set    = _feature_set,                                      \
  61        .feature_bit    = _feature_prefix ##_## _feature_bit,                \
  62}
  63#define BTRFS_FEAT_ATTR_PTR(_name)                                           \
  64        (&btrfs_attr_features_##_name.kobj_attr.attr)
  65
  66#define BTRFS_FEAT_ATTR_COMPAT(name, feature) \
  67        BTRFS_FEAT_ATTR(name, FEAT_COMPAT, BTRFS_FEATURE_COMPAT, feature)
  68#define BTRFS_FEAT_ATTR_COMPAT_RO(name, feature) \
  69        BTRFS_FEAT_ATTR(name, FEAT_COMPAT_RO, BTRFS_FEATURE_COMPAT_RO, feature)
  70#define BTRFS_FEAT_ATTR_INCOMPAT(name, feature) \
  71        BTRFS_FEAT_ATTR(name, FEAT_INCOMPAT, BTRFS_FEATURE_INCOMPAT, feature)
  72
  73static inline struct btrfs_fs_info *to_fs_info(struct kobject *kobj);
  74static inline struct btrfs_fs_devices *to_fs_devs(struct kobject *kobj);
  75
  76static struct btrfs_feature_attr *to_btrfs_feature_attr(struct kobj_attribute *a)
  77{
  78        return container_of(a, struct btrfs_feature_attr, kobj_attr);
  79}
  80
  81static struct kobj_attribute *attr_to_btrfs_attr(struct attribute *attr)
  82{
  83        return container_of(attr, struct kobj_attribute, attr);
  84}
  85
  86static struct btrfs_feature_attr *attr_to_btrfs_feature_attr(
  87                struct attribute *attr)
  88{
  89        return to_btrfs_feature_attr(attr_to_btrfs_attr(attr));
  90}
  91
  92static u64 get_features(struct btrfs_fs_info *fs_info,
  93                        enum btrfs_feature_set set)
  94{
  95        struct btrfs_super_block *disk_super = fs_info->super_copy;
  96        if (set == FEAT_COMPAT)
  97                return btrfs_super_compat_flags(disk_super);
  98        else if (set == FEAT_COMPAT_RO)
  99                return btrfs_super_compat_ro_flags(disk_super);
 100        else
 101                return btrfs_super_incompat_flags(disk_super);
 102}
 103
 104static void set_features(struct btrfs_fs_info *fs_info,
 105                         enum btrfs_feature_set set, u64 features)
 106{
 107        struct btrfs_super_block *disk_super = fs_info->super_copy;
 108        if (set == FEAT_COMPAT)
 109                btrfs_set_super_compat_flags(disk_super, features);
 110        else if (set == FEAT_COMPAT_RO)
 111                btrfs_set_super_compat_ro_flags(disk_super, features);
 112        else
 113                btrfs_set_super_incompat_flags(disk_super, features);
 114}
 115
 116static int can_modify_feature(struct btrfs_feature_attr *fa)
 117{
 118        int val = 0;
 119        u64 set, clear;
 120        switch (fa->feature_set) {
 121        case FEAT_COMPAT:
 122                set = BTRFS_FEATURE_COMPAT_SAFE_SET;
 123                clear = BTRFS_FEATURE_COMPAT_SAFE_CLEAR;
 124                break;
 125        case FEAT_COMPAT_RO:
 126                set = BTRFS_FEATURE_COMPAT_RO_SAFE_SET;
 127                clear = BTRFS_FEATURE_COMPAT_RO_SAFE_CLEAR;
 128                break;
 129        case FEAT_INCOMPAT:
 130                set = BTRFS_FEATURE_INCOMPAT_SAFE_SET;
 131                clear = BTRFS_FEATURE_INCOMPAT_SAFE_CLEAR;
 132                break;
 133        default:
 134                pr_warn("btrfs: sysfs: unknown feature set %d\n",
 135                                fa->feature_set);
 136                return 0;
 137        }
 138
 139        if (set & fa->feature_bit)
 140                val |= 1;
 141        if (clear & fa->feature_bit)
 142                val |= 2;
 143
 144        return val;
 145}
 146
 147static ssize_t btrfs_feature_attr_show(struct kobject *kobj,
 148                                       struct kobj_attribute *a, char *buf)
 149{
 150        int val = 0;
 151        struct btrfs_fs_info *fs_info = to_fs_info(kobj);
 152        struct btrfs_feature_attr *fa = to_btrfs_feature_attr(a);
 153        if (fs_info) {
 154                u64 features = get_features(fs_info, fa->feature_set);
 155                if (features & fa->feature_bit)
 156                        val = 1;
 157        } else
 158                val = can_modify_feature(fa);
 159
 160        return scnprintf(buf, PAGE_SIZE, "%d\n", val);
 161}
 162
 163static ssize_t btrfs_feature_attr_store(struct kobject *kobj,
 164                                        struct kobj_attribute *a,
 165                                        const char *buf, size_t count)
 166{
 167        struct btrfs_fs_info *fs_info;
 168        struct btrfs_feature_attr *fa = to_btrfs_feature_attr(a);
 169        u64 features, set, clear;
 170        unsigned long val;
 171        int ret;
 172
 173        fs_info = to_fs_info(kobj);
 174        if (!fs_info)
 175                return -EPERM;
 176
 177        if (sb_rdonly(fs_info->sb))
 178                return -EROFS;
 179
 180        ret = kstrtoul(skip_spaces(buf), 0, &val);
 181        if (ret)
 182                return ret;
 183
 184        if (fa->feature_set == FEAT_COMPAT) {
 185                set = BTRFS_FEATURE_COMPAT_SAFE_SET;
 186                clear = BTRFS_FEATURE_COMPAT_SAFE_CLEAR;
 187        } else if (fa->feature_set == FEAT_COMPAT_RO) {
 188                set = BTRFS_FEATURE_COMPAT_RO_SAFE_SET;
 189                clear = BTRFS_FEATURE_COMPAT_RO_SAFE_CLEAR;
 190        } else {
 191                set = BTRFS_FEATURE_INCOMPAT_SAFE_SET;
 192                clear = BTRFS_FEATURE_INCOMPAT_SAFE_CLEAR;
 193        }
 194
 195        features = get_features(fs_info, fa->feature_set);
 196
 197        /* Nothing to do */
 198        if ((val && (features & fa->feature_bit)) ||
 199            (!val && !(features & fa->feature_bit)))
 200                return count;
 201
 202        if ((val && !(set & fa->feature_bit)) ||
 203            (!val && !(clear & fa->feature_bit))) {
 204                btrfs_info(fs_info,
 205                        "%sabling feature %s on mounted fs is not supported.",
 206                        val ? "En" : "Dis", fa->kobj_attr.attr.name);
 207                return -EPERM;
 208        }
 209
 210        btrfs_info(fs_info, "%s %s feature flag",
 211                   val ? "Setting" : "Clearing", fa->kobj_attr.attr.name);
 212
 213        spin_lock(&fs_info->super_lock);
 214        features = get_features(fs_info, fa->feature_set);
 215        if (val)
 216                features |= fa->feature_bit;
 217        else
 218                features &= ~fa->feature_bit;
 219        set_features(fs_info, fa->feature_set, features);
 220        spin_unlock(&fs_info->super_lock);
 221
 222        /*
 223         * We don't want to do full transaction commit from inside sysfs
 224         */
 225        btrfs_set_pending(fs_info, COMMIT);
 226        wake_up_process(fs_info->transaction_kthread);
 227
 228        return count;
 229}
 230
 231static umode_t btrfs_feature_visible(struct kobject *kobj,
 232                                     struct attribute *attr, int unused)
 233{
 234        struct btrfs_fs_info *fs_info = to_fs_info(kobj);
 235        umode_t mode = attr->mode;
 236
 237        if (fs_info) {
 238                struct btrfs_feature_attr *fa;
 239                u64 features;
 240
 241                fa = attr_to_btrfs_feature_attr(attr);
 242                features = get_features(fs_info, fa->feature_set);
 243
 244                if (can_modify_feature(fa))
 245                        mode |= S_IWUSR;
 246                else if (!(features & fa->feature_bit))
 247                        mode = 0;
 248        }
 249
 250        return mode;
 251}
 252
 253BTRFS_FEAT_ATTR_INCOMPAT(mixed_backref, MIXED_BACKREF);
 254BTRFS_FEAT_ATTR_INCOMPAT(default_subvol, DEFAULT_SUBVOL);
 255BTRFS_FEAT_ATTR_INCOMPAT(mixed_groups, MIXED_GROUPS);
 256BTRFS_FEAT_ATTR_INCOMPAT(compress_lzo, COMPRESS_LZO);
 257BTRFS_FEAT_ATTR_INCOMPAT(compress_zstd, COMPRESS_ZSTD);
 258BTRFS_FEAT_ATTR_INCOMPAT(big_metadata, BIG_METADATA);
 259BTRFS_FEAT_ATTR_INCOMPAT(extended_iref, EXTENDED_IREF);
 260BTRFS_FEAT_ATTR_INCOMPAT(raid56, RAID56);
 261BTRFS_FEAT_ATTR_INCOMPAT(skinny_metadata, SKINNY_METADATA);
 262BTRFS_FEAT_ATTR_INCOMPAT(no_holes, NO_HOLES);
 263BTRFS_FEAT_ATTR_INCOMPAT(metadata_uuid, METADATA_UUID);
 264BTRFS_FEAT_ATTR_COMPAT_RO(free_space_tree, FREE_SPACE_TREE);
 265BTRFS_FEAT_ATTR_INCOMPAT(raid1c34, RAID1C34);
 266/* Remove once support for zoned allocation is feature complete */
 267#ifdef CONFIG_BTRFS_DEBUG
 268BTRFS_FEAT_ATTR_INCOMPAT(zoned, ZONED);
 269#endif
 270
 271static struct attribute *btrfs_supported_feature_attrs[] = {
 272        BTRFS_FEAT_ATTR_PTR(mixed_backref),
 273        BTRFS_FEAT_ATTR_PTR(default_subvol),
 274        BTRFS_FEAT_ATTR_PTR(mixed_groups),
 275        BTRFS_FEAT_ATTR_PTR(compress_lzo),
 276        BTRFS_FEAT_ATTR_PTR(compress_zstd),
 277        BTRFS_FEAT_ATTR_PTR(big_metadata),
 278        BTRFS_FEAT_ATTR_PTR(extended_iref),
 279        BTRFS_FEAT_ATTR_PTR(raid56),
 280        BTRFS_FEAT_ATTR_PTR(skinny_metadata),
 281        BTRFS_FEAT_ATTR_PTR(no_holes),
 282        BTRFS_FEAT_ATTR_PTR(metadata_uuid),
 283        BTRFS_FEAT_ATTR_PTR(free_space_tree),
 284        BTRFS_FEAT_ATTR_PTR(raid1c34),
 285#ifdef CONFIG_BTRFS_DEBUG
 286        BTRFS_FEAT_ATTR_PTR(zoned),
 287#endif
 288        NULL
 289};
 290
 291/*
 292 * Features which depend on feature bits and may differ between each fs.
 293 *
 294 * /sys/fs/btrfs/features lists all available features of this kernel while
 295 * /sys/fs/btrfs/UUID/features shows features of the fs which are enabled or
 296 * can be changed online.
 297 */
 298static const struct attribute_group btrfs_feature_attr_group = {
 299        .name = "features",
 300        .is_visible = btrfs_feature_visible,
 301        .attrs = btrfs_supported_feature_attrs,
 302};
 303
 304static ssize_t rmdir_subvol_show(struct kobject *kobj,
 305                                 struct kobj_attribute *ka, char *buf)
 306{
 307        return scnprintf(buf, PAGE_SIZE, "0\n");
 308}
 309BTRFS_ATTR(static_feature, rmdir_subvol, rmdir_subvol_show);
 310
 311static ssize_t supported_checksums_show(struct kobject *kobj,
 312                                        struct kobj_attribute *a, char *buf)
 313{
 314        ssize_t ret = 0;
 315        int i;
 316
 317        for (i = 0; i < btrfs_get_num_csums(); i++) {
 318                /*
 319                 * This "trick" only works as long as 'enum btrfs_csum_type' has
 320                 * no holes in it
 321                 */
 322                ret += scnprintf(buf + ret, PAGE_SIZE - ret, "%s%s",
 323                                (i == 0 ? "" : " "), btrfs_super_csum_name(i));
 324
 325        }
 326
 327        ret += scnprintf(buf + ret, PAGE_SIZE - ret, "\n");
 328        return ret;
 329}
 330BTRFS_ATTR(static_feature, supported_checksums, supported_checksums_show);
 331
 332static ssize_t send_stream_version_show(struct kobject *kobj,
 333                                        struct kobj_attribute *ka, char *buf)
 334{
 335        return snprintf(buf, PAGE_SIZE, "%d\n", BTRFS_SEND_STREAM_VERSION);
 336}
 337BTRFS_ATTR(static_feature, send_stream_version, send_stream_version_show);
 338
 339static const char *rescue_opts[] = {
 340        "usebackuproot",
 341        "nologreplay",
 342        "ignorebadroots",
 343        "ignoredatacsums",
 344        "all",
 345};
 346
 347static ssize_t supported_rescue_options_show(struct kobject *kobj,
 348                                             struct kobj_attribute *a,
 349                                             char *buf)
 350{
 351        ssize_t ret = 0;
 352        int i;
 353
 354        for (i = 0; i < ARRAY_SIZE(rescue_opts); i++)
 355                ret += scnprintf(buf + ret, PAGE_SIZE - ret, "%s%s",
 356                                 (i ? " " : ""), rescue_opts[i]);
 357        ret += scnprintf(buf + ret, PAGE_SIZE - ret, "\n");
 358        return ret;
 359}
 360BTRFS_ATTR(static_feature, supported_rescue_options,
 361           supported_rescue_options_show);
 362
 363static ssize_t supported_sectorsizes_show(struct kobject *kobj,
 364                                          struct kobj_attribute *a,
 365                                          char *buf)
 366{
 367        ssize_t ret = 0;
 368
 369        /* Only sectorsize == PAGE_SIZE is now supported */
 370        ret += scnprintf(buf + ret, PAGE_SIZE - ret, "%lu\n", PAGE_SIZE);
 371
 372        return ret;
 373}
 374BTRFS_ATTR(static_feature, supported_sectorsizes,
 375           supported_sectorsizes_show);
 376
 377static struct attribute *btrfs_supported_static_feature_attrs[] = {
 378        BTRFS_ATTR_PTR(static_feature, rmdir_subvol),
 379        BTRFS_ATTR_PTR(static_feature, supported_checksums),
 380        BTRFS_ATTR_PTR(static_feature, send_stream_version),
 381        BTRFS_ATTR_PTR(static_feature, supported_rescue_options),
 382        BTRFS_ATTR_PTR(static_feature, supported_sectorsizes),
 383        NULL
 384};
 385
 386/*
 387 * Features which only depend on kernel version.
 388 *
 389 * These are listed in /sys/fs/btrfs/features along with
 390 * btrfs_feature_attr_group
 391 */
 392static const struct attribute_group btrfs_static_feature_attr_group = {
 393        .name = "features",
 394        .attrs = btrfs_supported_static_feature_attrs,
 395};
 396
 397#ifdef CONFIG_BTRFS_DEBUG
 398
 399/*
 400 * Discard statistics and tunables
 401 */
 402#define discard_to_fs_info(_kobj)       to_fs_info((_kobj)->parent->parent)
 403
 404static ssize_t btrfs_discardable_bytes_show(struct kobject *kobj,
 405                                            struct kobj_attribute *a,
 406                                            char *buf)
 407{
 408        struct btrfs_fs_info *fs_info = discard_to_fs_info(kobj);
 409
 410        return scnprintf(buf, PAGE_SIZE, "%lld\n",
 411                        atomic64_read(&fs_info->discard_ctl.discardable_bytes));
 412}
 413BTRFS_ATTR(discard, discardable_bytes, btrfs_discardable_bytes_show);
 414
 415static ssize_t btrfs_discardable_extents_show(struct kobject *kobj,
 416                                              struct kobj_attribute *a,
 417                                              char *buf)
 418{
 419        struct btrfs_fs_info *fs_info = discard_to_fs_info(kobj);
 420
 421        return scnprintf(buf, PAGE_SIZE, "%d\n",
 422                        atomic_read(&fs_info->discard_ctl.discardable_extents));
 423}
 424BTRFS_ATTR(discard, discardable_extents, btrfs_discardable_extents_show);
 425
 426static ssize_t btrfs_discard_bitmap_bytes_show(struct kobject *kobj,
 427                                               struct kobj_attribute *a,
 428                                               char *buf)
 429{
 430        struct btrfs_fs_info *fs_info = discard_to_fs_info(kobj);
 431
 432        return scnprintf(buf, PAGE_SIZE, "%llu\n",
 433                        fs_info->discard_ctl.discard_bitmap_bytes);
 434}
 435BTRFS_ATTR(discard, discard_bitmap_bytes, btrfs_discard_bitmap_bytes_show);
 436
 437static ssize_t btrfs_discard_bytes_saved_show(struct kobject *kobj,
 438                                              struct kobj_attribute *a,
 439                                              char *buf)
 440{
 441        struct btrfs_fs_info *fs_info = discard_to_fs_info(kobj);
 442
 443        return scnprintf(buf, PAGE_SIZE, "%lld\n",
 444                atomic64_read(&fs_info->discard_ctl.discard_bytes_saved));
 445}
 446BTRFS_ATTR(discard, discard_bytes_saved, btrfs_discard_bytes_saved_show);
 447
 448static ssize_t btrfs_discard_extent_bytes_show(struct kobject *kobj,
 449                                               struct kobj_attribute *a,
 450                                               char *buf)
 451{
 452        struct btrfs_fs_info *fs_info = discard_to_fs_info(kobj);
 453
 454        return scnprintf(buf, PAGE_SIZE, "%llu\n",
 455                        fs_info->discard_ctl.discard_extent_bytes);
 456}
 457BTRFS_ATTR(discard, discard_extent_bytes, btrfs_discard_extent_bytes_show);
 458
 459static ssize_t btrfs_discard_iops_limit_show(struct kobject *kobj,
 460                                             struct kobj_attribute *a,
 461                                             char *buf)
 462{
 463        struct btrfs_fs_info *fs_info = discard_to_fs_info(kobj);
 464
 465        return scnprintf(buf, PAGE_SIZE, "%u\n",
 466                        READ_ONCE(fs_info->discard_ctl.iops_limit));
 467}
 468
 469static ssize_t btrfs_discard_iops_limit_store(struct kobject *kobj,
 470                                              struct kobj_attribute *a,
 471                                              const char *buf, size_t len)
 472{
 473        struct btrfs_fs_info *fs_info = discard_to_fs_info(kobj);
 474        struct btrfs_discard_ctl *discard_ctl = &fs_info->discard_ctl;
 475        u32 iops_limit;
 476        int ret;
 477
 478        ret = kstrtou32(buf, 10, &iops_limit);
 479        if (ret)
 480                return -EINVAL;
 481
 482        WRITE_ONCE(discard_ctl->iops_limit, iops_limit);
 483        btrfs_discard_calc_delay(discard_ctl);
 484        btrfs_discard_schedule_work(discard_ctl, true);
 485        return len;
 486}
 487BTRFS_ATTR_RW(discard, iops_limit, btrfs_discard_iops_limit_show,
 488              btrfs_discard_iops_limit_store);
 489
 490static ssize_t btrfs_discard_kbps_limit_show(struct kobject *kobj,
 491                                             struct kobj_attribute *a,
 492                                             char *buf)
 493{
 494        struct btrfs_fs_info *fs_info = discard_to_fs_info(kobj);
 495
 496        return scnprintf(buf, PAGE_SIZE, "%u\n",
 497                        READ_ONCE(fs_info->discard_ctl.kbps_limit));
 498}
 499
 500static ssize_t btrfs_discard_kbps_limit_store(struct kobject *kobj,
 501                                              struct kobj_attribute *a,
 502                                              const char *buf, size_t len)
 503{
 504        struct btrfs_fs_info *fs_info = discard_to_fs_info(kobj);
 505        struct btrfs_discard_ctl *discard_ctl = &fs_info->discard_ctl;
 506        u32 kbps_limit;
 507        int ret;
 508
 509        ret = kstrtou32(buf, 10, &kbps_limit);
 510        if (ret)
 511                return -EINVAL;
 512
 513        WRITE_ONCE(discard_ctl->kbps_limit, kbps_limit);
 514        btrfs_discard_schedule_work(discard_ctl, true);
 515        return len;
 516}
 517BTRFS_ATTR_RW(discard, kbps_limit, btrfs_discard_kbps_limit_show,
 518              btrfs_discard_kbps_limit_store);
 519
 520static ssize_t btrfs_discard_max_discard_size_show(struct kobject *kobj,
 521                                                   struct kobj_attribute *a,
 522                                                   char *buf)
 523{
 524        struct btrfs_fs_info *fs_info = discard_to_fs_info(kobj);
 525
 526        return scnprintf(buf, PAGE_SIZE, "%llu\n",
 527                        READ_ONCE(fs_info->discard_ctl.max_discard_size));
 528}
 529
 530static ssize_t btrfs_discard_max_discard_size_store(struct kobject *kobj,
 531                                                    struct kobj_attribute *a,
 532                                                    const char *buf, size_t len)
 533{
 534        struct btrfs_fs_info *fs_info = discard_to_fs_info(kobj);
 535        struct btrfs_discard_ctl *discard_ctl = &fs_info->discard_ctl;
 536        u64 max_discard_size;
 537        int ret;
 538
 539        ret = kstrtou64(buf, 10, &max_discard_size);
 540        if (ret)
 541                return -EINVAL;
 542
 543        WRITE_ONCE(discard_ctl->max_discard_size, max_discard_size);
 544
 545        return len;
 546}
 547BTRFS_ATTR_RW(discard, max_discard_size, btrfs_discard_max_discard_size_show,
 548              btrfs_discard_max_discard_size_store);
 549
 550static const struct attribute *discard_debug_attrs[] = {
 551        BTRFS_ATTR_PTR(discard, discardable_bytes),
 552        BTRFS_ATTR_PTR(discard, discardable_extents),
 553        BTRFS_ATTR_PTR(discard, discard_bitmap_bytes),
 554        BTRFS_ATTR_PTR(discard, discard_bytes_saved),
 555        BTRFS_ATTR_PTR(discard, discard_extent_bytes),
 556        BTRFS_ATTR_PTR(discard, iops_limit),
 557        BTRFS_ATTR_PTR(discard, kbps_limit),
 558        BTRFS_ATTR_PTR(discard, max_discard_size),
 559        NULL,
 560};
 561
 562/*
 563 * Runtime debugging exported via sysfs
 564 *
 565 * /sys/fs/btrfs/debug - applies to module or all filesystems
 566 * /sys/fs/btrfs/UUID  - applies only to the given filesystem
 567 */
 568static const struct attribute *btrfs_debug_mount_attrs[] = {
 569        NULL,
 570};
 571
 572static struct attribute *btrfs_debug_feature_attrs[] = {
 573        NULL
 574};
 575
 576static const struct attribute_group btrfs_debug_feature_attr_group = {
 577        .name = "debug",
 578        .attrs = btrfs_debug_feature_attrs,
 579};
 580
 581#endif
 582
 583static ssize_t btrfs_show_u64(u64 *value_ptr, spinlock_t *lock, char *buf)
 584{
 585        u64 val;
 586        if (lock)
 587                spin_lock(lock);
 588        val = *value_ptr;
 589        if (lock)
 590                spin_unlock(lock);
 591        return scnprintf(buf, PAGE_SIZE, "%llu\n", val);
 592}
 593
 594static ssize_t global_rsv_size_show(struct kobject *kobj,
 595                                    struct kobj_attribute *ka, char *buf)
 596{
 597        struct btrfs_fs_info *fs_info = to_fs_info(kobj->parent);
 598        struct btrfs_block_rsv *block_rsv = &fs_info->global_block_rsv;
 599        return btrfs_show_u64(&block_rsv->size, &block_rsv->lock, buf);
 600}
 601BTRFS_ATTR(allocation, global_rsv_size, global_rsv_size_show);
 602
 603static ssize_t global_rsv_reserved_show(struct kobject *kobj,
 604                                        struct kobj_attribute *a, char *buf)
 605{
 606        struct btrfs_fs_info *fs_info = to_fs_info(kobj->parent);
 607        struct btrfs_block_rsv *block_rsv = &fs_info->global_block_rsv;
 608        return btrfs_show_u64(&block_rsv->reserved, &block_rsv->lock, buf);
 609}
 610BTRFS_ATTR(allocation, global_rsv_reserved, global_rsv_reserved_show);
 611
 612#define to_space_info(_kobj) container_of(_kobj, struct btrfs_space_info, kobj)
 613#define to_raid_kobj(_kobj) container_of(_kobj, struct raid_kobject, kobj)
 614
 615static ssize_t raid_bytes_show(struct kobject *kobj,
 616                               struct kobj_attribute *attr, char *buf);
 617BTRFS_ATTR(raid, total_bytes, raid_bytes_show);
 618BTRFS_ATTR(raid, used_bytes, raid_bytes_show);
 619
 620static ssize_t raid_bytes_show(struct kobject *kobj,
 621                               struct kobj_attribute *attr, char *buf)
 622
 623{
 624        struct btrfs_space_info *sinfo = to_space_info(kobj->parent);
 625        struct btrfs_block_group *block_group;
 626        int index = btrfs_bg_flags_to_raid_index(to_raid_kobj(kobj)->flags);
 627        u64 val = 0;
 628
 629        down_read(&sinfo->groups_sem);
 630        list_for_each_entry(block_group, &sinfo->block_groups[index], list) {
 631                if (&attr->attr == BTRFS_ATTR_PTR(raid, total_bytes))
 632                        val += block_group->length;
 633                else
 634                        val += block_group->used;
 635        }
 636        up_read(&sinfo->groups_sem);
 637        return scnprintf(buf, PAGE_SIZE, "%llu\n", val);
 638}
 639
 640static struct attribute *raid_attrs[] = {
 641        BTRFS_ATTR_PTR(raid, total_bytes),
 642        BTRFS_ATTR_PTR(raid, used_bytes),
 643        NULL
 644};
 645ATTRIBUTE_GROUPS(raid);
 646
 647static void release_raid_kobj(struct kobject *kobj)
 648{
 649        kfree(to_raid_kobj(kobj));
 650}
 651
 652static struct kobj_type btrfs_raid_ktype = {
 653        .sysfs_ops = &kobj_sysfs_ops,
 654        .release = release_raid_kobj,
 655        .default_groups = raid_groups,
 656};
 657
 658#define SPACE_INFO_ATTR(field)                                          \
 659static ssize_t btrfs_space_info_show_##field(struct kobject *kobj,      \
 660                                             struct kobj_attribute *a,  \
 661                                             char *buf)                 \
 662{                                                                       \
 663        struct btrfs_space_info *sinfo = to_space_info(kobj);           \
 664        return btrfs_show_u64(&sinfo->field, &sinfo->lock, buf);        \
 665}                                                                       \
 666BTRFS_ATTR(space_info, field, btrfs_space_info_show_##field)
 667
 668SPACE_INFO_ATTR(flags);
 669SPACE_INFO_ATTR(total_bytes);
 670SPACE_INFO_ATTR(bytes_used);
 671SPACE_INFO_ATTR(bytes_pinned);
 672SPACE_INFO_ATTR(bytes_reserved);
 673SPACE_INFO_ATTR(bytes_may_use);
 674SPACE_INFO_ATTR(bytes_readonly);
 675SPACE_INFO_ATTR(bytes_zone_unusable);
 676SPACE_INFO_ATTR(disk_used);
 677SPACE_INFO_ATTR(disk_total);
 678
 679static struct attribute *space_info_attrs[] = {
 680        BTRFS_ATTR_PTR(space_info, flags),
 681        BTRFS_ATTR_PTR(space_info, total_bytes),
 682        BTRFS_ATTR_PTR(space_info, bytes_used),
 683        BTRFS_ATTR_PTR(space_info, bytes_pinned),
 684        BTRFS_ATTR_PTR(space_info, bytes_reserved),
 685        BTRFS_ATTR_PTR(space_info, bytes_may_use),
 686        BTRFS_ATTR_PTR(space_info, bytes_readonly),
 687        BTRFS_ATTR_PTR(space_info, bytes_zone_unusable),
 688        BTRFS_ATTR_PTR(space_info, disk_used),
 689        BTRFS_ATTR_PTR(space_info, disk_total),
 690        NULL,
 691};
 692ATTRIBUTE_GROUPS(space_info);
 693
 694static void space_info_release(struct kobject *kobj)
 695{
 696        struct btrfs_space_info *sinfo = to_space_info(kobj);
 697        kfree(sinfo);
 698}
 699
 700static struct kobj_type space_info_ktype = {
 701        .sysfs_ops = &kobj_sysfs_ops,
 702        .release = space_info_release,
 703        .default_groups = space_info_groups,
 704};
 705
 706static const struct attribute *allocation_attrs[] = {
 707        BTRFS_ATTR_PTR(allocation, global_rsv_reserved),
 708        BTRFS_ATTR_PTR(allocation, global_rsv_size),
 709        NULL,
 710};
 711
 712static ssize_t btrfs_label_show(struct kobject *kobj,
 713                                struct kobj_attribute *a, char *buf)
 714{
 715        struct btrfs_fs_info *fs_info = to_fs_info(kobj);
 716        char *label = fs_info->super_copy->label;
 717        ssize_t ret;
 718
 719        spin_lock(&fs_info->super_lock);
 720        ret = scnprintf(buf, PAGE_SIZE, label[0] ? "%s\n" : "%s", label);
 721        spin_unlock(&fs_info->super_lock);
 722
 723        return ret;
 724}
 725
 726static ssize_t btrfs_label_store(struct kobject *kobj,
 727                                 struct kobj_attribute *a,
 728                                 const char *buf, size_t len)
 729{
 730        struct btrfs_fs_info *fs_info = to_fs_info(kobj);
 731        size_t p_len;
 732
 733        if (!fs_info)
 734                return -EPERM;
 735
 736        if (sb_rdonly(fs_info->sb))
 737                return -EROFS;
 738
 739        /*
 740         * p_len is the len until the first occurrence of either
 741         * '\n' or '\0'
 742         */
 743        p_len = strcspn(buf, "\n");
 744
 745        if (p_len >= BTRFS_LABEL_SIZE)
 746                return -EINVAL;
 747
 748        spin_lock(&fs_info->super_lock);
 749        memset(fs_info->super_copy->label, 0, BTRFS_LABEL_SIZE);
 750        memcpy(fs_info->super_copy->label, buf, p_len);
 751        spin_unlock(&fs_info->super_lock);
 752
 753        /*
 754         * We don't want to do full transaction commit from inside sysfs
 755         */
 756        btrfs_set_pending(fs_info, COMMIT);
 757        wake_up_process(fs_info->transaction_kthread);
 758
 759        return len;
 760}
 761BTRFS_ATTR_RW(, label, btrfs_label_show, btrfs_label_store);
 762
 763static ssize_t btrfs_nodesize_show(struct kobject *kobj,
 764                                struct kobj_attribute *a, char *buf)
 765{
 766        struct btrfs_fs_info *fs_info = to_fs_info(kobj);
 767
 768        return scnprintf(buf, PAGE_SIZE, "%u\n", fs_info->super_copy->nodesize);
 769}
 770
 771BTRFS_ATTR(, nodesize, btrfs_nodesize_show);
 772
 773static ssize_t btrfs_sectorsize_show(struct kobject *kobj,
 774                                struct kobj_attribute *a, char *buf)
 775{
 776        struct btrfs_fs_info *fs_info = to_fs_info(kobj);
 777
 778        return scnprintf(buf, PAGE_SIZE, "%u\n",
 779                         fs_info->super_copy->sectorsize);
 780}
 781
 782BTRFS_ATTR(, sectorsize, btrfs_sectorsize_show);
 783
 784static ssize_t btrfs_clone_alignment_show(struct kobject *kobj,
 785                                struct kobj_attribute *a, char *buf)
 786{
 787        struct btrfs_fs_info *fs_info = to_fs_info(kobj);
 788
 789        return scnprintf(buf, PAGE_SIZE, "%u\n", fs_info->super_copy->sectorsize);
 790}
 791
 792BTRFS_ATTR(, clone_alignment, btrfs_clone_alignment_show);
 793
 794static ssize_t quota_override_show(struct kobject *kobj,
 795                                   struct kobj_attribute *a, char *buf)
 796{
 797        struct btrfs_fs_info *fs_info = to_fs_info(kobj);
 798        int quota_override;
 799
 800        quota_override = test_bit(BTRFS_FS_QUOTA_OVERRIDE, &fs_info->flags);
 801        return scnprintf(buf, PAGE_SIZE, "%d\n", quota_override);
 802}
 803
 804static ssize_t quota_override_store(struct kobject *kobj,
 805                                    struct kobj_attribute *a,
 806                                    const char *buf, size_t len)
 807{
 808        struct btrfs_fs_info *fs_info = to_fs_info(kobj);
 809        unsigned long knob;
 810        int err;
 811
 812        if (!fs_info)
 813                return -EPERM;
 814
 815        if (!capable(CAP_SYS_RESOURCE))
 816                return -EPERM;
 817
 818        err = kstrtoul(buf, 10, &knob);
 819        if (err)
 820                return err;
 821        if (knob > 1)
 822                return -EINVAL;
 823
 824        if (knob)
 825                set_bit(BTRFS_FS_QUOTA_OVERRIDE, &fs_info->flags);
 826        else
 827                clear_bit(BTRFS_FS_QUOTA_OVERRIDE, &fs_info->flags);
 828
 829        return len;
 830}
 831
 832BTRFS_ATTR_RW(, quota_override, quota_override_show, quota_override_store);
 833
 834static ssize_t btrfs_metadata_uuid_show(struct kobject *kobj,
 835                                struct kobj_attribute *a, char *buf)
 836{
 837        struct btrfs_fs_info *fs_info = to_fs_info(kobj);
 838
 839        return scnprintf(buf, PAGE_SIZE, "%pU\n",
 840                        fs_info->fs_devices->metadata_uuid);
 841}
 842
 843BTRFS_ATTR(, metadata_uuid, btrfs_metadata_uuid_show);
 844
 845static ssize_t btrfs_checksum_show(struct kobject *kobj,
 846                                   struct kobj_attribute *a, char *buf)
 847{
 848        struct btrfs_fs_info *fs_info = to_fs_info(kobj);
 849        u16 csum_type = btrfs_super_csum_type(fs_info->super_copy);
 850
 851        return scnprintf(buf, PAGE_SIZE, "%s (%s)\n",
 852                        btrfs_super_csum_name(csum_type),
 853                        crypto_shash_driver_name(fs_info->csum_shash));
 854}
 855
 856BTRFS_ATTR(, checksum, btrfs_checksum_show);
 857
 858static ssize_t btrfs_exclusive_operation_show(struct kobject *kobj,
 859                struct kobj_attribute *a, char *buf)
 860{
 861        struct btrfs_fs_info *fs_info = to_fs_info(kobj);
 862        const char *str;
 863
 864        switch (READ_ONCE(fs_info->exclusive_operation)) {
 865                case  BTRFS_EXCLOP_NONE:
 866                        str = "none\n";
 867                        break;
 868                case BTRFS_EXCLOP_BALANCE:
 869                        str = "balance\n";
 870                        break;
 871                case BTRFS_EXCLOP_DEV_ADD:
 872                        str = "device add\n";
 873                        break;
 874                case BTRFS_EXCLOP_DEV_REMOVE:
 875                        str = "device remove\n";
 876                        break;
 877                case BTRFS_EXCLOP_DEV_REPLACE:
 878                        str = "device replace\n";
 879                        break;
 880                case BTRFS_EXCLOP_RESIZE:
 881                        str = "resize\n";
 882                        break;
 883                case BTRFS_EXCLOP_SWAP_ACTIVATE:
 884                        str = "swap activate\n";
 885                        break;
 886                default:
 887                        str = "UNKNOWN\n";
 888                        break;
 889        }
 890        return scnprintf(buf, PAGE_SIZE, "%s", str);
 891}
 892BTRFS_ATTR(, exclusive_operation, btrfs_exclusive_operation_show);
 893
 894static ssize_t btrfs_generation_show(struct kobject *kobj,
 895                                     struct kobj_attribute *a, char *buf)
 896{
 897        struct btrfs_fs_info *fs_info = to_fs_info(kobj);
 898
 899        return scnprintf(buf, PAGE_SIZE, "%llu\n", fs_info->generation);
 900}
 901BTRFS_ATTR(, generation, btrfs_generation_show);
 902
 903/*
 904 * Look for an exact string @string in @buffer with possible leading or
 905 * trailing whitespace
 906 */
 907static bool strmatch(const char *buffer, const char *string)
 908{
 909        const size_t len = strlen(string);
 910
 911        /* Skip leading whitespace */
 912        buffer = skip_spaces(buffer);
 913
 914        /* Match entire string, check if the rest is whitespace or empty */
 915        if (strncmp(string, buffer, len) == 0 &&
 916            strlen(skip_spaces(buffer + len)) == 0)
 917                return true;
 918
 919        return false;
 920}
 921
 922static const char * const btrfs_read_policy_name[] = { "pid" };
 923
 924static ssize_t btrfs_read_policy_show(struct kobject *kobj,
 925                                      struct kobj_attribute *a, char *buf)
 926{
 927        struct btrfs_fs_devices *fs_devices = to_fs_devs(kobj);
 928        ssize_t ret = 0;
 929        int i;
 930
 931        for (i = 0; i < BTRFS_NR_READ_POLICY; i++) {
 932                if (fs_devices->read_policy == i)
 933                        ret += scnprintf(buf + ret, PAGE_SIZE - ret, "%s[%s]",
 934                                         (ret == 0 ? "" : " "),
 935                                         btrfs_read_policy_name[i]);
 936                else
 937                        ret += scnprintf(buf + ret, PAGE_SIZE - ret, "%s%s",
 938                                         (ret == 0 ? "" : " "),
 939                                         btrfs_read_policy_name[i]);
 940        }
 941
 942        ret += scnprintf(buf + ret, PAGE_SIZE - ret, "\n");
 943
 944        return ret;
 945}
 946
 947static ssize_t btrfs_read_policy_store(struct kobject *kobj,
 948                                       struct kobj_attribute *a,
 949                                       const char *buf, size_t len)
 950{
 951        struct btrfs_fs_devices *fs_devices = to_fs_devs(kobj);
 952        int i;
 953
 954        for (i = 0; i < BTRFS_NR_READ_POLICY; i++) {
 955                if (strmatch(buf, btrfs_read_policy_name[i])) {
 956                        if (i != fs_devices->read_policy) {
 957                                fs_devices->read_policy = i;
 958                                btrfs_info(fs_devices->fs_info,
 959                                           "read policy set to '%s'",
 960                                           btrfs_read_policy_name[i]);
 961                        }
 962                        return len;
 963                }
 964        }
 965
 966        return -EINVAL;
 967}
 968BTRFS_ATTR_RW(, read_policy, btrfs_read_policy_show, btrfs_read_policy_store);
 969
 970static ssize_t btrfs_bg_reclaim_threshold_show(struct kobject *kobj,
 971                                               struct kobj_attribute *a,
 972                                               char *buf)
 973{
 974        struct btrfs_fs_info *fs_info = to_fs_info(kobj);
 975        ssize_t ret;
 976
 977        ret = scnprintf(buf, PAGE_SIZE, "%d\n", fs_info->bg_reclaim_threshold);
 978
 979        return ret;
 980}
 981
 982static ssize_t btrfs_bg_reclaim_threshold_store(struct kobject *kobj,
 983                                                struct kobj_attribute *a,
 984                                                const char *buf, size_t len)
 985{
 986        struct btrfs_fs_info *fs_info = to_fs_info(kobj);
 987        int thresh;
 988        int ret;
 989
 990        ret = kstrtoint(buf, 10, &thresh);
 991        if (ret)
 992                return ret;
 993
 994        if (thresh <= 50 || thresh > 100)
 995                return -EINVAL;
 996
 997        fs_info->bg_reclaim_threshold = thresh;
 998
 999        return len;
1000}
1001BTRFS_ATTR_RW(, bg_reclaim_threshold, btrfs_bg_reclaim_threshold_show,
1002              btrfs_bg_reclaim_threshold_store);
1003
1004static const struct attribute *btrfs_attrs[] = {
1005        BTRFS_ATTR_PTR(, label),
1006        BTRFS_ATTR_PTR(, nodesize),
1007        BTRFS_ATTR_PTR(, sectorsize),
1008        BTRFS_ATTR_PTR(, clone_alignment),
1009        BTRFS_ATTR_PTR(, quota_override),
1010        BTRFS_ATTR_PTR(, metadata_uuid),
1011        BTRFS_ATTR_PTR(, checksum),
1012        BTRFS_ATTR_PTR(, exclusive_operation),
1013        BTRFS_ATTR_PTR(, generation),
1014        BTRFS_ATTR_PTR(, read_policy),
1015        BTRFS_ATTR_PTR(, bg_reclaim_threshold),
1016        NULL,
1017};
1018
1019static void btrfs_release_fsid_kobj(struct kobject *kobj)
1020{
1021        struct btrfs_fs_devices *fs_devs = to_fs_devs(kobj);
1022
1023        memset(&fs_devs->fsid_kobj, 0, sizeof(struct kobject));
1024        complete(&fs_devs->kobj_unregister);
1025}
1026
1027static struct kobj_type btrfs_ktype = {
1028        .sysfs_ops      = &kobj_sysfs_ops,
1029        .release        = btrfs_release_fsid_kobj,
1030};
1031
1032static inline struct btrfs_fs_devices *to_fs_devs(struct kobject *kobj)
1033{
1034        if (kobj->ktype != &btrfs_ktype)
1035                return NULL;
1036        return container_of(kobj, struct btrfs_fs_devices, fsid_kobj);
1037}
1038
1039static inline struct btrfs_fs_info *to_fs_info(struct kobject *kobj)
1040{
1041        if (kobj->ktype != &btrfs_ktype)
1042                return NULL;
1043        return to_fs_devs(kobj)->fs_info;
1044}
1045
1046#define NUM_FEATURE_BITS 64
1047#define BTRFS_FEATURE_NAME_MAX 13
1048static char btrfs_unknown_feature_names[FEAT_MAX][NUM_FEATURE_BITS][BTRFS_FEATURE_NAME_MAX];
1049static struct btrfs_feature_attr btrfs_feature_attrs[FEAT_MAX][NUM_FEATURE_BITS];
1050
1051static const u64 supported_feature_masks[FEAT_MAX] = {
1052        [FEAT_COMPAT]    = BTRFS_FEATURE_COMPAT_SUPP,
1053        [FEAT_COMPAT_RO] = BTRFS_FEATURE_COMPAT_RO_SUPP,
1054        [FEAT_INCOMPAT]  = BTRFS_FEATURE_INCOMPAT_SUPP,
1055};
1056
1057static int addrm_unknown_feature_attrs(struct btrfs_fs_info *fs_info, bool add)
1058{
1059        int set;
1060
1061        for (set = 0; set < FEAT_MAX; set++) {
1062                int i;
1063                struct attribute *attrs[2];
1064                struct attribute_group agroup = {
1065                        .name = "features",
1066                        .attrs = attrs,
1067                };
1068                u64 features = get_features(fs_info, set);
1069                features &= ~supported_feature_masks[set];
1070
1071                if (!features)
1072                        continue;
1073
1074                attrs[1] = NULL;
1075                for (i = 0; i < NUM_FEATURE_BITS; i++) {
1076                        struct btrfs_feature_attr *fa;
1077
1078                        if (!(features & (1ULL << i)))
1079                                continue;
1080
1081                        fa = &btrfs_feature_attrs[set][i];
1082                        attrs[0] = &fa->kobj_attr.attr;
1083                        if (add) {
1084                                int ret;
1085                                ret = sysfs_merge_group(&fs_info->fs_devices->fsid_kobj,
1086                                                        &agroup);
1087                                if (ret)
1088                                        return ret;
1089                        } else
1090                                sysfs_unmerge_group(&fs_info->fs_devices->fsid_kobj,
1091                                                    &agroup);
1092                }
1093
1094        }
1095        return 0;
1096}
1097
1098static void __btrfs_sysfs_remove_fsid(struct btrfs_fs_devices *fs_devs)
1099{
1100        if (fs_devs->devinfo_kobj) {
1101                kobject_del(fs_devs->devinfo_kobj);
1102                kobject_put(fs_devs->devinfo_kobj);
1103                fs_devs->devinfo_kobj = NULL;
1104        }
1105
1106        if (fs_devs->devices_kobj) {
1107                kobject_del(fs_devs->devices_kobj);
1108                kobject_put(fs_devs->devices_kobj);
1109                fs_devs->devices_kobj = NULL;
1110        }
1111
1112        if (fs_devs->fsid_kobj.state_initialized) {
1113                kobject_del(&fs_devs->fsid_kobj);
1114                kobject_put(&fs_devs->fsid_kobj);
1115                wait_for_completion(&fs_devs->kobj_unregister);
1116        }
1117}
1118
1119/* when fs_devs is NULL it will remove all fsid kobject */
1120void btrfs_sysfs_remove_fsid(struct btrfs_fs_devices *fs_devs)
1121{
1122        struct list_head *fs_uuids = btrfs_get_fs_uuids();
1123
1124        if (fs_devs) {
1125                __btrfs_sysfs_remove_fsid(fs_devs);
1126                return;
1127        }
1128
1129        list_for_each_entry(fs_devs, fs_uuids, fs_list) {
1130                __btrfs_sysfs_remove_fsid(fs_devs);
1131        }
1132}
1133
1134static void btrfs_sysfs_remove_fs_devices(struct btrfs_fs_devices *fs_devices)
1135{
1136        struct btrfs_device *device;
1137        struct btrfs_fs_devices *seed;
1138
1139        list_for_each_entry(device, &fs_devices->devices, dev_list)
1140                btrfs_sysfs_remove_device(device);
1141
1142        list_for_each_entry(seed, &fs_devices->seed_list, seed_list) {
1143                list_for_each_entry(device, &seed->devices, dev_list)
1144                        btrfs_sysfs_remove_device(device);
1145        }
1146}
1147
1148void btrfs_sysfs_remove_mounted(struct btrfs_fs_info *fs_info)
1149{
1150        struct kobject *fsid_kobj = &fs_info->fs_devices->fsid_kobj;
1151
1152        sysfs_remove_link(fsid_kobj, "bdi");
1153
1154        if (fs_info->space_info_kobj) {
1155                sysfs_remove_files(fs_info->space_info_kobj, allocation_attrs);
1156                kobject_del(fs_info->space_info_kobj);
1157                kobject_put(fs_info->space_info_kobj);
1158        }
1159#ifdef CONFIG_BTRFS_DEBUG
1160        if (fs_info->discard_debug_kobj) {
1161                sysfs_remove_files(fs_info->discard_debug_kobj,
1162                                   discard_debug_attrs);
1163                kobject_del(fs_info->discard_debug_kobj);
1164                kobject_put(fs_info->discard_debug_kobj);
1165        }
1166        if (fs_info->debug_kobj) {
1167                sysfs_remove_files(fs_info->debug_kobj, btrfs_debug_mount_attrs);
1168                kobject_del(fs_info->debug_kobj);
1169                kobject_put(fs_info->debug_kobj);
1170        }
1171#endif
1172        addrm_unknown_feature_attrs(fs_info, false);
1173        sysfs_remove_group(fsid_kobj, &btrfs_feature_attr_group);
1174        sysfs_remove_files(fsid_kobj, btrfs_attrs);
1175        btrfs_sysfs_remove_fs_devices(fs_info->fs_devices);
1176}
1177
1178static const char * const btrfs_feature_set_names[FEAT_MAX] = {
1179        [FEAT_COMPAT]    = "compat",
1180        [FEAT_COMPAT_RO] = "compat_ro",
1181        [FEAT_INCOMPAT]  = "incompat",
1182};
1183
1184const char *btrfs_feature_set_name(enum btrfs_feature_set set)
1185{
1186        return btrfs_feature_set_names[set];
1187}
1188
1189char *btrfs_printable_features(enum btrfs_feature_set set, u64 flags)
1190{
1191        size_t bufsize = 4096; /* safe max, 64 names * 64 bytes */
1192        int len = 0;
1193        int i;
1194        char *str;
1195
1196        str = kmalloc(bufsize, GFP_KERNEL);
1197        if (!str)
1198                return str;
1199
1200        for (i = 0; i < ARRAY_SIZE(btrfs_feature_attrs[set]); i++) {
1201                const char *name;
1202
1203                if (!(flags & (1ULL << i)))
1204                        continue;
1205
1206                name = btrfs_feature_attrs[set][i].kobj_attr.attr.name;
1207                len += scnprintf(str + len, bufsize - len, "%s%s",
1208                                len ? "," : "", name);
1209        }
1210
1211        return str;
1212}
1213
1214static void init_feature_attrs(void)
1215{
1216        struct btrfs_feature_attr *fa;
1217        int set, i;
1218
1219        BUILD_BUG_ON(ARRAY_SIZE(btrfs_unknown_feature_names) !=
1220                     ARRAY_SIZE(btrfs_feature_attrs));
1221        BUILD_BUG_ON(ARRAY_SIZE(btrfs_unknown_feature_names[0]) !=
1222                     ARRAY_SIZE(btrfs_feature_attrs[0]));
1223
1224        memset(btrfs_feature_attrs, 0, sizeof(btrfs_feature_attrs));
1225        memset(btrfs_unknown_feature_names, 0,
1226               sizeof(btrfs_unknown_feature_names));
1227
1228        for (i = 0; btrfs_supported_feature_attrs[i]; i++) {
1229                struct btrfs_feature_attr *sfa;
1230                struct attribute *a = btrfs_supported_feature_attrs[i];
1231                int bit;
1232                sfa = attr_to_btrfs_feature_attr(a);
1233                bit = ilog2(sfa->feature_bit);
1234                fa = &btrfs_feature_attrs[sfa->feature_set][bit];
1235
1236                fa->kobj_attr.attr.name = sfa->kobj_attr.attr.name;
1237        }
1238
1239        for (set = 0; set < FEAT_MAX; set++) {
1240                for (i = 0; i < ARRAY_SIZE(btrfs_feature_attrs[set]); i++) {
1241                        char *name = btrfs_unknown_feature_names[set][i];
1242                        fa = &btrfs_feature_attrs[set][i];
1243
1244                        if (fa->kobj_attr.attr.name)
1245                                continue;
1246
1247                        snprintf(name, BTRFS_FEATURE_NAME_MAX, "%s:%u",
1248                                 btrfs_feature_set_names[set], i);
1249
1250                        fa->kobj_attr.attr.name = name;
1251                        fa->kobj_attr.attr.mode = S_IRUGO;
1252                        fa->feature_set = set;
1253                        fa->feature_bit = 1ULL << i;
1254                }
1255        }
1256}
1257
1258/*
1259 * Create a sysfs entry for a given block group type at path
1260 * /sys/fs/btrfs/UUID/allocation/data/TYPE
1261 */
1262void btrfs_sysfs_add_block_group_type(struct btrfs_block_group *cache)
1263{
1264        struct btrfs_fs_info *fs_info = cache->fs_info;
1265        struct btrfs_space_info *space_info = cache->space_info;
1266        struct raid_kobject *rkobj;
1267        const int index = btrfs_bg_flags_to_raid_index(cache->flags);
1268        unsigned int nofs_flag;
1269        int ret;
1270
1271        /*
1272         * Setup a NOFS context because kobject_add(), deep in its call chain,
1273         * does GFP_KERNEL allocations, and we are often called in a context
1274         * where if reclaim is triggered we can deadlock (we are either holding
1275         * a transaction handle or some lock required for a transaction
1276         * commit).
1277         */
1278        nofs_flag = memalloc_nofs_save();
1279
1280        rkobj = kzalloc(sizeof(*rkobj), GFP_NOFS);
1281        if (!rkobj) {
1282                memalloc_nofs_restore(nofs_flag);
1283                btrfs_warn(cache->fs_info,
1284                                "couldn't alloc memory for raid level kobject");
1285                return;
1286        }
1287
1288        rkobj->flags = cache->flags;
1289        kobject_init(&rkobj->kobj, &btrfs_raid_ktype);
1290
1291        /*
1292         * We call this either on mount, or if we've created a block group for a
1293         * new index type while running (i.e. when restriping).  The running
1294         * case is tricky because we could race with other threads, so we need
1295         * to have this check to make sure we didn't already init the kobject.
1296         *
1297         * We don't have to protect on the free side because it only happens on
1298         * unmount.
1299         */
1300        spin_lock(&space_info->lock);
1301        if (space_info->block_group_kobjs[index]) {
1302                spin_unlock(&space_info->lock);
1303                kobject_put(&rkobj->kobj);
1304                return;
1305        } else {
1306                space_info->block_group_kobjs[index] = &rkobj->kobj;
1307        }
1308        spin_unlock(&space_info->lock);
1309
1310        ret = kobject_add(&rkobj->kobj, &space_info->kobj, "%s",
1311                          btrfs_bg_type_to_raid_name(rkobj->flags));
1312        memalloc_nofs_restore(nofs_flag);
1313        if (ret) {
1314                spin_lock(&space_info->lock);
1315                space_info->block_group_kobjs[index] = NULL;
1316                spin_unlock(&space_info->lock);
1317                kobject_put(&rkobj->kobj);
1318                btrfs_warn(fs_info,
1319                        "failed to add kobject for block cache, ignoring");
1320                return;
1321        }
1322}
1323
1324/*
1325 * Remove sysfs directories for all block group types of a given space info and
1326 * the space info as well
1327 */
1328void btrfs_sysfs_remove_space_info(struct btrfs_space_info *space_info)
1329{
1330        int i;
1331
1332        for (i = 0; i < BTRFS_NR_RAID_TYPES; i++) {
1333                struct kobject *kobj;
1334
1335                kobj = space_info->block_group_kobjs[i];
1336                space_info->block_group_kobjs[i] = NULL;
1337                if (kobj) {
1338                        kobject_del(kobj);
1339                        kobject_put(kobj);
1340                }
1341        }
1342        kobject_del(&space_info->kobj);
1343        kobject_put(&space_info->kobj);
1344}
1345
1346static const char *alloc_name(u64 flags)
1347{
1348        switch (flags) {
1349        case BTRFS_BLOCK_GROUP_METADATA | BTRFS_BLOCK_GROUP_DATA:
1350                return "mixed";
1351        case BTRFS_BLOCK_GROUP_METADATA:
1352                return "metadata";
1353        case BTRFS_BLOCK_GROUP_DATA:
1354                return "data";
1355        case BTRFS_BLOCK_GROUP_SYSTEM:
1356                return "system";
1357        default:
1358                WARN_ON(1);
1359                return "invalid-combination";
1360        }
1361}
1362
1363/*
1364 * Create a sysfs entry for a space info type at path
1365 * /sys/fs/btrfs/UUID/allocation/TYPE
1366 */
1367int btrfs_sysfs_add_space_info_type(struct btrfs_fs_info *fs_info,
1368                                    struct btrfs_space_info *space_info)
1369{
1370        int ret;
1371
1372        ret = kobject_init_and_add(&space_info->kobj, &space_info_ktype,
1373                                   fs_info->space_info_kobj, "%s",
1374                                   alloc_name(space_info->flags));
1375        if (ret) {
1376                kobject_put(&space_info->kobj);
1377                return ret;
1378        }
1379
1380        return 0;
1381}
1382
1383void btrfs_sysfs_remove_device(struct btrfs_device *device)
1384{
1385        struct kobject *devices_kobj;
1386
1387        /*
1388         * Seed fs_devices devices_kobj aren't used, fetch kobject from the
1389         * fs_info::fs_devices.
1390         */
1391        devices_kobj = device->fs_info->fs_devices->devices_kobj;
1392        ASSERT(devices_kobj);
1393
1394        if (device->bdev)
1395                sysfs_remove_link(devices_kobj, bdev_kobj(device->bdev)->name);
1396
1397        if (device->devid_kobj.state_initialized) {
1398                kobject_del(&device->devid_kobj);
1399                kobject_put(&device->devid_kobj);
1400                wait_for_completion(&device->kobj_unregister);
1401        }
1402}
1403
1404static ssize_t btrfs_devinfo_in_fs_metadata_show(struct kobject *kobj,
1405                                                 struct kobj_attribute *a,
1406                                                 char *buf)
1407{
1408        int val;
1409        struct btrfs_device *device = container_of(kobj, struct btrfs_device,
1410                                                   devid_kobj);
1411
1412        val = !!test_bit(BTRFS_DEV_STATE_IN_FS_METADATA, &device->dev_state);
1413
1414        return scnprintf(buf, PAGE_SIZE, "%d\n", val);
1415}
1416BTRFS_ATTR(devid, in_fs_metadata, btrfs_devinfo_in_fs_metadata_show);
1417
1418static ssize_t btrfs_devinfo_missing_show(struct kobject *kobj,
1419                                        struct kobj_attribute *a, char *buf)
1420{
1421        int val;
1422        struct btrfs_device *device = container_of(kobj, struct btrfs_device,
1423                                                   devid_kobj);
1424
1425        val = !!test_bit(BTRFS_DEV_STATE_MISSING, &device->dev_state);
1426
1427        return scnprintf(buf, PAGE_SIZE, "%d\n", val);
1428}
1429BTRFS_ATTR(devid, missing, btrfs_devinfo_missing_show);
1430
1431static ssize_t btrfs_devinfo_replace_target_show(struct kobject *kobj,
1432                                                 struct kobj_attribute *a,
1433                                                 char *buf)
1434{
1435        int val;
1436        struct btrfs_device *device = container_of(kobj, struct btrfs_device,
1437                                                   devid_kobj);
1438
1439        val = !!test_bit(BTRFS_DEV_STATE_REPLACE_TGT, &device->dev_state);
1440
1441        return scnprintf(buf, PAGE_SIZE, "%d\n", val);
1442}
1443BTRFS_ATTR(devid, replace_target, btrfs_devinfo_replace_target_show);
1444
1445static ssize_t btrfs_devinfo_scrub_speed_max_show(struct kobject *kobj,
1446                                             struct kobj_attribute *a,
1447                                             char *buf)
1448{
1449        struct btrfs_device *device = container_of(kobj, struct btrfs_device,
1450                                                   devid_kobj);
1451
1452        return scnprintf(buf, PAGE_SIZE, "%llu\n",
1453                         READ_ONCE(device->scrub_speed_max));
1454}
1455
1456static ssize_t btrfs_devinfo_scrub_speed_max_store(struct kobject *kobj,
1457                                              struct kobj_attribute *a,
1458                                              const char *buf, size_t len)
1459{
1460        struct btrfs_device *device = container_of(kobj, struct btrfs_device,
1461                                                   devid_kobj);
1462        char *endptr;
1463        unsigned long long limit;
1464
1465        limit = memparse(buf, &endptr);
1466        WRITE_ONCE(device->scrub_speed_max, limit);
1467        return len;
1468}
1469BTRFS_ATTR_RW(devid, scrub_speed_max, btrfs_devinfo_scrub_speed_max_show,
1470              btrfs_devinfo_scrub_speed_max_store);
1471
1472static ssize_t btrfs_devinfo_writeable_show(struct kobject *kobj,
1473                                            struct kobj_attribute *a, char *buf)
1474{
1475        int val;
1476        struct btrfs_device *device = container_of(kobj, struct btrfs_device,
1477                                                   devid_kobj);
1478
1479        val = !!test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state);
1480
1481        return scnprintf(buf, PAGE_SIZE, "%d\n", val);
1482}
1483BTRFS_ATTR(devid, writeable, btrfs_devinfo_writeable_show);
1484
1485static ssize_t btrfs_devinfo_error_stats_show(struct kobject *kobj,
1486                struct kobj_attribute *a, char *buf)
1487{
1488        struct btrfs_device *device = container_of(kobj, struct btrfs_device,
1489                                                   devid_kobj);
1490
1491        if (!device->dev_stats_valid)
1492                return scnprintf(buf, PAGE_SIZE, "invalid\n");
1493
1494        /*
1495         * Print all at once so we get a snapshot of all values from the same
1496         * time. Keep them in sync and in order of definition of
1497         * btrfs_dev_stat_values.
1498         */
1499        return scnprintf(buf, PAGE_SIZE,
1500                "write_errs %d\n"
1501                "read_errs %d\n"
1502                "flush_errs %d\n"
1503                "corruption_errs %d\n"
1504                "generation_errs %d\n",
1505                btrfs_dev_stat_read(device, BTRFS_DEV_STAT_WRITE_ERRS),
1506                btrfs_dev_stat_read(device, BTRFS_DEV_STAT_READ_ERRS),
1507                btrfs_dev_stat_read(device, BTRFS_DEV_STAT_FLUSH_ERRS),
1508                btrfs_dev_stat_read(device, BTRFS_DEV_STAT_CORRUPTION_ERRS),
1509                btrfs_dev_stat_read(device, BTRFS_DEV_STAT_GENERATION_ERRS));
1510}
1511BTRFS_ATTR(devid, error_stats, btrfs_devinfo_error_stats_show);
1512
1513static struct attribute *devid_attrs[] = {
1514        BTRFS_ATTR_PTR(devid, error_stats),
1515        BTRFS_ATTR_PTR(devid, in_fs_metadata),
1516        BTRFS_ATTR_PTR(devid, missing),
1517        BTRFS_ATTR_PTR(devid, replace_target),
1518        BTRFS_ATTR_PTR(devid, scrub_speed_max),
1519        BTRFS_ATTR_PTR(devid, writeable),
1520        NULL
1521};
1522ATTRIBUTE_GROUPS(devid);
1523
1524static void btrfs_release_devid_kobj(struct kobject *kobj)
1525{
1526        struct btrfs_device *device = container_of(kobj, struct btrfs_device,
1527                                                   devid_kobj);
1528
1529        memset(&device->devid_kobj, 0, sizeof(struct kobject));
1530        complete(&device->kobj_unregister);
1531}
1532
1533static struct kobj_type devid_ktype = {
1534        .sysfs_ops      = &kobj_sysfs_ops,
1535        .default_groups = devid_groups,
1536        .release        = btrfs_release_devid_kobj,
1537};
1538
1539int btrfs_sysfs_add_device(struct btrfs_device *device)
1540{
1541        int ret;
1542        unsigned int nofs_flag;
1543        struct kobject *devices_kobj;
1544        struct kobject *devinfo_kobj;
1545
1546        /*
1547         * Make sure we use the fs_info::fs_devices to fetch the kobjects even
1548         * for the seed fs_devices
1549         */
1550        devices_kobj = device->fs_info->fs_devices->devices_kobj;
1551        devinfo_kobj = device->fs_info->fs_devices->devinfo_kobj;
1552        ASSERT(devices_kobj);
1553        ASSERT(devinfo_kobj);
1554
1555        nofs_flag = memalloc_nofs_save();
1556
1557        if (device->bdev) {
1558                struct kobject *disk_kobj = bdev_kobj(device->bdev);
1559
1560                ret = sysfs_create_link(devices_kobj, disk_kobj, disk_kobj->name);
1561                if (ret) {
1562                        btrfs_warn(device->fs_info,
1563                                "creating sysfs device link for devid %llu failed: %d",
1564                                device->devid, ret);
1565                        goto out;
1566                }
1567        }
1568
1569        init_completion(&device->kobj_unregister);
1570        ret = kobject_init_and_add(&device->devid_kobj, &devid_ktype,
1571                                   devinfo_kobj, "%llu", device->devid);
1572        if (ret) {
1573                kobject_put(&device->devid_kobj);
1574                btrfs_warn(device->fs_info,
1575                           "devinfo init for devid %llu failed: %d",
1576                           device->devid, ret);
1577        }
1578
1579out:
1580        memalloc_nofs_restore(nofs_flag);
1581        return ret;
1582}
1583
1584static int btrfs_sysfs_add_fs_devices(struct btrfs_fs_devices *fs_devices)
1585{
1586        int ret;
1587        struct btrfs_device *device;
1588        struct btrfs_fs_devices *seed;
1589
1590        list_for_each_entry(device, &fs_devices->devices, dev_list) {
1591                ret = btrfs_sysfs_add_device(device);
1592                if (ret)
1593                        goto fail;
1594        }
1595
1596        list_for_each_entry(seed, &fs_devices->seed_list, seed_list) {
1597                list_for_each_entry(device, &seed->devices, dev_list) {
1598                        ret = btrfs_sysfs_add_device(device);
1599                        if (ret)
1600                                goto fail;
1601                }
1602        }
1603
1604        return 0;
1605
1606fail:
1607        btrfs_sysfs_remove_fs_devices(fs_devices);
1608        return ret;
1609}
1610
1611void btrfs_kobject_uevent(struct block_device *bdev, enum kobject_action action)
1612{
1613        int ret;
1614
1615        ret = kobject_uevent(&disk_to_dev(bdev->bd_disk)->kobj, action);
1616        if (ret)
1617                pr_warn("BTRFS: Sending event '%d' to kobject: '%s' (%p): failed\n",
1618                        action, kobject_name(&disk_to_dev(bdev->bd_disk)->kobj),
1619                        &disk_to_dev(bdev->bd_disk)->kobj);
1620}
1621
1622void btrfs_sysfs_update_sprout_fsid(struct btrfs_fs_devices *fs_devices)
1623
1624{
1625        char fsid_buf[BTRFS_UUID_UNPARSED_SIZE];
1626
1627        /*
1628         * Sprouting changes fsid of the mounted filesystem, rename the fsid
1629         * directory
1630         */
1631        snprintf(fsid_buf, BTRFS_UUID_UNPARSED_SIZE, "%pU", fs_devices->fsid);
1632        if (kobject_rename(&fs_devices->fsid_kobj, fsid_buf))
1633                btrfs_warn(fs_devices->fs_info,
1634                                "sysfs: failed to create fsid for sprout");
1635}
1636
1637void btrfs_sysfs_update_devid(struct btrfs_device *device)
1638{
1639        char tmp[24];
1640
1641        snprintf(tmp, sizeof(tmp), "%llu", device->devid);
1642
1643        if (kobject_rename(&device->devid_kobj, tmp))
1644                btrfs_warn(device->fs_devices->fs_info,
1645                           "sysfs: failed to update devid for %llu",
1646                           device->devid);
1647}
1648
1649/* /sys/fs/btrfs/ entry */
1650static struct kset *btrfs_kset;
1651
1652/*
1653 * Creates:
1654 *              /sys/fs/btrfs/UUID
1655 *
1656 * Can be called by the device discovery thread.
1657 */
1658int btrfs_sysfs_add_fsid(struct btrfs_fs_devices *fs_devs)
1659{
1660        int error;
1661
1662        init_completion(&fs_devs->kobj_unregister);
1663        fs_devs->fsid_kobj.kset = btrfs_kset;
1664        error = kobject_init_and_add(&fs_devs->fsid_kobj, &btrfs_ktype, NULL,
1665                                     "%pU", fs_devs->fsid);
1666        if (error) {
1667                kobject_put(&fs_devs->fsid_kobj);
1668                return error;
1669        }
1670
1671        fs_devs->devices_kobj = kobject_create_and_add("devices",
1672                                                       &fs_devs->fsid_kobj);
1673        if (!fs_devs->devices_kobj) {
1674                btrfs_err(fs_devs->fs_info,
1675                          "failed to init sysfs device interface");
1676                btrfs_sysfs_remove_fsid(fs_devs);
1677                return -ENOMEM;
1678        }
1679
1680        fs_devs->devinfo_kobj = kobject_create_and_add("devinfo",
1681                                                       &fs_devs->fsid_kobj);
1682        if (!fs_devs->devinfo_kobj) {
1683                btrfs_err(fs_devs->fs_info,
1684                          "failed to init sysfs devinfo kobject");
1685                btrfs_sysfs_remove_fsid(fs_devs);
1686                return -ENOMEM;
1687        }
1688
1689        return 0;
1690}
1691
1692int btrfs_sysfs_add_mounted(struct btrfs_fs_info *fs_info)
1693{
1694        int error;
1695        struct btrfs_fs_devices *fs_devs = fs_info->fs_devices;
1696        struct kobject *fsid_kobj = &fs_devs->fsid_kobj;
1697
1698        error = btrfs_sysfs_add_fs_devices(fs_devs);
1699        if (error)
1700                return error;
1701
1702        error = sysfs_create_files(fsid_kobj, btrfs_attrs);
1703        if (error) {
1704                btrfs_sysfs_remove_fs_devices(fs_devs);
1705                return error;
1706        }
1707
1708        error = sysfs_create_group(fsid_kobj,
1709                                   &btrfs_feature_attr_group);
1710        if (error)
1711                goto failure;
1712
1713#ifdef CONFIG_BTRFS_DEBUG
1714        fs_info->debug_kobj = kobject_create_and_add("debug", fsid_kobj);
1715        if (!fs_info->debug_kobj) {
1716                error = -ENOMEM;
1717                goto failure;
1718        }
1719
1720        error = sysfs_create_files(fs_info->debug_kobj, btrfs_debug_mount_attrs);
1721        if (error)
1722                goto failure;
1723
1724        /* Discard directory */
1725        fs_info->discard_debug_kobj = kobject_create_and_add("discard",
1726                                                     fs_info->debug_kobj);
1727        if (!fs_info->discard_debug_kobj) {
1728                error = -ENOMEM;
1729                goto failure;
1730        }
1731
1732        error = sysfs_create_files(fs_info->discard_debug_kobj,
1733                                   discard_debug_attrs);
1734        if (error)
1735                goto failure;
1736#endif
1737
1738        error = addrm_unknown_feature_attrs(fs_info, true);
1739        if (error)
1740                goto failure;
1741
1742        error = sysfs_create_link(fsid_kobj, &fs_info->sb->s_bdi->dev->kobj, "bdi");
1743        if (error)
1744                goto failure;
1745
1746        fs_info->space_info_kobj = kobject_create_and_add("allocation",
1747                                                  fsid_kobj);
1748        if (!fs_info->space_info_kobj) {
1749                error = -ENOMEM;
1750                goto failure;
1751        }
1752
1753        error = sysfs_create_files(fs_info->space_info_kobj, allocation_attrs);
1754        if (error)
1755                goto failure;
1756
1757        return 0;
1758failure:
1759        btrfs_sysfs_remove_mounted(fs_info);
1760        return error;
1761}
1762
1763static inline struct btrfs_fs_info *qgroup_kobj_to_fs_info(struct kobject *kobj)
1764{
1765        return to_fs_info(kobj->parent->parent);
1766}
1767
1768#define QGROUP_ATTR(_member, _show_name)                                        \
1769static ssize_t btrfs_qgroup_show_##_member(struct kobject *qgroup_kobj,         \
1770                                           struct kobj_attribute *a,            \
1771                                           char *buf)                           \
1772{                                                                               \
1773        struct btrfs_fs_info *fs_info = qgroup_kobj_to_fs_info(qgroup_kobj);    \
1774        struct btrfs_qgroup *qgroup = container_of(qgroup_kobj,                 \
1775                        struct btrfs_qgroup, kobj);                             \
1776        return btrfs_show_u64(&qgroup->_member, &fs_info->qgroup_lock, buf);    \
1777}                                                                               \
1778BTRFS_ATTR(qgroup, _show_name, btrfs_qgroup_show_##_member)
1779
1780#define QGROUP_RSV_ATTR(_name, _type)                                           \
1781static ssize_t btrfs_qgroup_rsv_show_##_name(struct kobject *qgroup_kobj,       \
1782                                             struct kobj_attribute *a,          \
1783                                             char *buf)                         \
1784{                                                                               \
1785        struct btrfs_fs_info *fs_info = qgroup_kobj_to_fs_info(qgroup_kobj);    \
1786        struct btrfs_qgroup *qgroup = container_of(qgroup_kobj,                 \
1787                        struct btrfs_qgroup, kobj);                             \
1788        return btrfs_show_u64(&qgroup->rsv.values[_type],                       \
1789                        &fs_info->qgroup_lock, buf);                            \
1790}                                                                               \
1791BTRFS_ATTR(qgroup, rsv_##_name, btrfs_qgroup_rsv_show_##_name)
1792
1793QGROUP_ATTR(rfer, referenced);
1794QGROUP_ATTR(excl, exclusive);
1795QGROUP_ATTR(max_rfer, max_referenced);
1796QGROUP_ATTR(max_excl, max_exclusive);
1797QGROUP_ATTR(lim_flags, limit_flags);
1798QGROUP_RSV_ATTR(data, BTRFS_QGROUP_RSV_DATA);
1799QGROUP_RSV_ATTR(meta_pertrans, BTRFS_QGROUP_RSV_META_PERTRANS);
1800QGROUP_RSV_ATTR(meta_prealloc, BTRFS_QGROUP_RSV_META_PREALLOC);
1801
1802static struct attribute *qgroup_attrs[] = {
1803        BTRFS_ATTR_PTR(qgroup, referenced),
1804        BTRFS_ATTR_PTR(qgroup, exclusive),
1805        BTRFS_ATTR_PTR(qgroup, max_referenced),
1806        BTRFS_ATTR_PTR(qgroup, max_exclusive),
1807        BTRFS_ATTR_PTR(qgroup, limit_flags),
1808        BTRFS_ATTR_PTR(qgroup, rsv_data),
1809        BTRFS_ATTR_PTR(qgroup, rsv_meta_pertrans),
1810        BTRFS_ATTR_PTR(qgroup, rsv_meta_prealloc),
1811        NULL
1812};
1813ATTRIBUTE_GROUPS(qgroup);
1814
1815static void qgroup_release(struct kobject *kobj)
1816{
1817        struct btrfs_qgroup *qgroup = container_of(kobj, struct btrfs_qgroup, kobj);
1818
1819        memset(&qgroup->kobj, 0, sizeof(*kobj));
1820}
1821
1822static struct kobj_type qgroup_ktype = {
1823        .sysfs_ops = &kobj_sysfs_ops,
1824        .release = qgroup_release,
1825        .default_groups = qgroup_groups,
1826};
1827
1828int btrfs_sysfs_add_one_qgroup(struct btrfs_fs_info *fs_info,
1829                                struct btrfs_qgroup *qgroup)
1830{
1831        struct kobject *qgroups_kobj = fs_info->qgroups_kobj;
1832        int ret;
1833
1834        if (test_bit(BTRFS_FS_STATE_DUMMY_FS_INFO, &fs_info->fs_state))
1835                return 0;
1836        if (qgroup->kobj.state_initialized)
1837                return 0;
1838        if (!qgroups_kobj)
1839                return -EINVAL;
1840
1841        ret = kobject_init_and_add(&qgroup->kobj, &qgroup_ktype, qgroups_kobj,
1842                        "%hu_%llu", btrfs_qgroup_level(qgroup->qgroupid),
1843                        btrfs_qgroup_subvolid(qgroup->qgroupid));
1844        if (ret < 0)
1845                kobject_put(&qgroup->kobj);
1846
1847        return ret;
1848}
1849
1850void btrfs_sysfs_del_qgroups(struct btrfs_fs_info *fs_info)
1851{
1852        struct btrfs_qgroup *qgroup;
1853        struct btrfs_qgroup *next;
1854
1855        if (test_bit(BTRFS_FS_STATE_DUMMY_FS_INFO, &fs_info->fs_state))
1856                return;
1857
1858        rbtree_postorder_for_each_entry_safe(qgroup, next,
1859                                             &fs_info->qgroup_tree, node)
1860                btrfs_sysfs_del_one_qgroup(fs_info, qgroup);
1861        if (fs_info->qgroups_kobj) {
1862                kobject_del(fs_info->qgroups_kobj);
1863                kobject_put(fs_info->qgroups_kobj);
1864                fs_info->qgroups_kobj = NULL;
1865        }
1866}
1867
1868/* Called when qgroups get initialized, thus there is no need for locking */
1869int btrfs_sysfs_add_qgroups(struct btrfs_fs_info *fs_info)
1870{
1871        struct kobject *fsid_kobj = &fs_info->fs_devices->fsid_kobj;
1872        struct btrfs_qgroup *qgroup;
1873        struct btrfs_qgroup *next;
1874        int ret = 0;
1875
1876        if (test_bit(BTRFS_FS_STATE_DUMMY_FS_INFO, &fs_info->fs_state))
1877                return 0;
1878
1879        ASSERT(fsid_kobj);
1880        if (fs_info->qgroups_kobj)
1881                return 0;
1882
1883        fs_info->qgroups_kobj = kobject_create_and_add("qgroups", fsid_kobj);
1884        if (!fs_info->qgroups_kobj) {
1885                ret = -ENOMEM;
1886                goto out;
1887        }
1888        rbtree_postorder_for_each_entry_safe(qgroup, next,
1889                                             &fs_info->qgroup_tree, node) {
1890                ret = btrfs_sysfs_add_one_qgroup(fs_info, qgroup);
1891                if (ret < 0)
1892                        goto out;
1893        }
1894
1895out:
1896        if (ret < 0)
1897                btrfs_sysfs_del_qgroups(fs_info);
1898        return ret;
1899}
1900
1901void btrfs_sysfs_del_one_qgroup(struct btrfs_fs_info *fs_info,
1902                                struct btrfs_qgroup *qgroup)
1903{
1904        if (test_bit(BTRFS_FS_STATE_DUMMY_FS_INFO, &fs_info->fs_state))
1905                return;
1906
1907        if (qgroup->kobj.state_initialized) {
1908                kobject_del(&qgroup->kobj);
1909                kobject_put(&qgroup->kobj);
1910        }
1911}
1912
1913/*
1914 * Change per-fs features in /sys/fs/btrfs/UUID/features to match current
1915 * values in superblock. Call after any changes to incompat/compat_ro flags
1916 */
1917void btrfs_sysfs_feature_update(struct btrfs_fs_info *fs_info,
1918                u64 bit, enum btrfs_feature_set set)
1919{
1920        struct btrfs_fs_devices *fs_devs;
1921        struct kobject *fsid_kobj;
1922        u64 __maybe_unused features;
1923        int __maybe_unused ret;
1924
1925        if (!fs_info)
1926                return;
1927
1928        /*
1929         * See 14e46e04958df74 and e410e34fad913dd, feature bit updates are not
1930         * safe when called from some contexts (eg. balance)
1931         */
1932        features = get_features(fs_info, set);
1933        ASSERT(bit & supported_feature_masks[set]);
1934
1935        fs_devs = fs_info->fs_devices;
1936        fsid_kobj = &fs_devs->fsid_kobj;
1937
1938        if (!fsid_kobj->state_initialized)
1939                return;
1940
1941        /*
1942         * FIXME: this is too heavy to update just one value, ideally we'd like
1943         * to use sysfs_update_group but some refactoring is needed first.
1944         */
1945        sysfs_remove_group(fsid_kobj, &btrfs_feature_attr_group);
1946        ret = sysfs_create_group(fsid_kobj, &btrfs_feature_attr_group);
1947}
1948
1949int __init btrfs_init_sysfs(void)
1950{
1951        int ret;
1952
1953        btrfs_kset = kset_create_and_add("btrfs", NULL, fs_kobj);
1954        if (!btrfs_kset)
1955                return -ENOMEM;
1956
1957        init_feature_attrs();
1958        ret = sysfs_create_group(&btrfs_kset->kobj, &btrfs_feature_attr_group);
1959        if (ret)
1960                goto out2;
1961        ret = sysfs_merge_group(&btrfs_kset->kobj,
1962                                &btrfs_static_feature_attr_group);
1963        if (ret)
1964                goto out_remove_group;
1965
1966#ifdef CONFIG_BTRFS_DEBUG
1967        ret = sysfs_create_group(&btrfs_kset->kobj, &btrfs_debug_feature_attr_group);
1968        if (ret)
1969                goto out2;
1970#endif
1971
1972        return 0;
1973
1974out_remove_group:
1975        sysfs_remove_group(&btrfs_kset->kobj, &btrfs_feature_attr_group);
1976out2:
1977        kset_unregister(btrfs_kset);
1978
1979        return ret;
1980}
1981
1982void __cold btrfs_exit_sysfs(void)
1983{
1984        sysfs_unmerge_group(&btrfs_kset->kobj,
1985                            &btrfs_static_feature_attr_group);
1986        sysfs_remove_group(&btrfs_kset->kobj, &btrfs_feature_attr_group);
1987#ifdef CONFIG_BTRFS_DEBUG
1988        sysfs_remove_group(&btrfs_kset->kobj, &btrfs_debug_feature_attr_group);
1989#endif
1990        kset_unregister(btrfs_kset);
1991}
1992
1993