diff options
-rw-r--r-- | fs/btrfs/sysfs.c | 44 | ||||
-rw-r--r-- | fs/btrfs/sysfs.h | 43 |
2 files changed, 87 insertions, 0 deletions
diff --git a/fs/btrfs/sysfs.c b/fs/btrfs/sysfs.c index 5b326cd60a4a..9e217b581903 100644 --- a/fs/btrfs/sysfs.c +++ b/fs/btrfs/sysfs.c | |||
@@ -26,20 +26,64 @@ | |||
26 | #include "ctree.h" | 26 | #include "ctree.h" |
27 | #include "disk-io.h" | 27 | #include "disk-io.h" |
28 | #include "transaction.h" | 28 | #include "transaction.h" |
29 | #include "sysfs.h" | ||
30 | |||
31 | static ssize_t btrfs_feature_attr_show(struct kobject *kobj, | ||
32 | struct kobj_attribute *a, char *buf) | ||
33 | { | ||
34 | return snprintf(buf, PAGE_SIZE, "0\n"); | ||
35 | } | ||
36 | |||
37 | BTRFS_FEAT_ATTR_INCOMPAT(mixed_backref, MIXED_BACKREF); | ||
38 | BTRFS_FEAT_ATTR_INCOMPAT(default_subvol, DEFAULT_SUBVOL); | ||
39 | BTRFS_FEAT_ATTR_INCOMPAT(mixed_groups, MIXED_GROUPS); | ||
40 | BTRFS_FEAT_ATTR_INCOMPAT(compress_lzo, COMPRESS_LZO); | ||
41 | BTRFS_FEAT_ATTR_INCOMPAT(compress_lzov2, COMPRESS_LZOv2); | ||
42 | BTRFS_FEAT_ATTR_INCOMPAT(big_metadata, BIG_METADATA); | ||
43 | BTRFS_FEAT_ATTR_INCOMPAT(extended_iref, EXTENDED_IREF); | ||
44 | BTRFS_FEAT_ATTR_INCOMPAT(raid56, RAID56); | ||
45 | BTRFS_FEAT_ATTR_INCOMPAT(skinny_metadata, SKINNY_METADATA); | ||
46 | |||
47 | static struct attribute *btrfs_supported_feature_attrs[] = { | ||
48 | BTRFS_FEAT_ATTR_PTR(mixed_backref), | ||
49 | BTRFS_FEAT_ATTR_PTR(default_subvol), | ||
50 | BTRFS_FEAT_ATTR_PTR(mixed_groups), | ||
51 | BTRFS_FEAT_ATTR_PTR(compress_lzo), | ||
52 | BTRFS_FEAT_ATTR_PTR(compress_lzov2), | ||
53 | BTRFS_FEAT_ATTR_PTR(big_metadata), | ||
54 | BTRFS_FEAT_ATTR_PTR(extended_iref), | ||
55 | BTRFS_FEAT_ATTR_PTR(raid56), | ||
56 | BTRFS_FEAT_ATTR_PTR(skinny_metadata), | ||
57 | NULL | ||
58 | }; | ||
59 | |||
60 | static const struct attribute_group btrfs_feature_attr_group = { | ||
61 | .name = "features", | ||
62 | .attrs = btrfs_supported_feature_attrs, | ||
63 | }; | ||
29 | 64 | ||
30 | /* /sys/fs/btrfs/ entry */ | 65 | /* /sys/fs/btrfs/ entry */ |
31 | static struct kset *btrfs_kset; | 66 | static struct kset *btrfs_kset; |
32 | 67 | ||
33 | int btrfs_init_sysfs(void) | 68 | int btrfs_init_sysfs(void) |
34 | { | 69 | { |
70 | int ret; | ||
35 | btrfs_kset = kset_create_and_add("btrfs", NULL, fs_kobj); | 71 | btrfs_kset = kset_create_and_add("btrfs", NULL, fs_kobj); |
36 | if (!btrfs_kset) | 72 | if (!btrfs_kset) |
37 | return -ENOMEM; | 73 | return -ENOMEM; |
74 | |||
75 | ret = sysfs_create_group(&btrfs_kset->kobj, &btrfs_feature_attr_group); | ||
76 | if (ret) { | ||
77 | kset_unregister(btrfs_kset); | ||
78 | return ret; | ||
79 | } | ||
80 | |||
38 | return 0; | 81 | return 0; |
39 | } | 82 | } |
40 | 83 | ||
41 | void btrfs_exit_sysfs(void) | 84 | void btrfs_exit_sysfs(void) |
42 | { | 85 | { |
86 | sysfs_remove_group(&btrfs_kset->kobj, &btrfs_feature_attr_group); | ||
43 | kset_unregister(btrfs_kset); | 87 | kset_unregister(btrfs_kset); |
44 | } | 88 | } |
45 | 89 | ||
diff --git a/fs/btrfs/sysfs.h b/fs/btrfs/sysfs.h new file mode 100644 index 000000000000..863e031ed1c1 --- /dev/null +++ b/fs/btrfs/sysfs.h | |||
@@ -0,0 +1,43 @@ | |||
1 | #ifndef _BTRFS_SYSFS_H_ | ||
2 | #define _BTRFS_SYSFS_H_ | ||
3 | |||
4 | enum btrfs_feature_set { | ||
5 | FEAT_COMPAT, | ||
6 | FEAT_COMPAT_RO, | ||
7 | FEAT_INCOMPAT, | ||
8 | FEAT_MAX | ||
9 | }; | ||
10 | |||
11 | #define __INIT_KOBJ_ATTR(_name, _mode, _show, _store) \ | ||
12 | { \ | ||
13 | .attr = { .name = __stringify(_name), .mode = _mode }, \ | ||
14 | .show = _show, \ | ||
15 | .store = _store, \ | ||
16 | } | ||
17 | |||
18 | struct btrfs_feature_attr { | ||
19 | struct kobj_attribute kobj_attr; | ||
20 | enum btrfs_feature_set feature_set; | ||
21 | u64 feature_bit; | ||
22 | }; | ||
23 | |||
24 | #define BTRFS_FEAT_ATTR(_name, _feature_set, _prefix, _feature_bit) \ | ||
25 | static struct btrfs_feature_attr btrfs_attr_##_name = { \ | ||
26 | .kobj_attr = __INIT_KOBJ_ATTR(_name, S_IRUGO, \ | ||
27 | btrfs_feature_attr_show, NULL), \ | ||
28 | .feature_set = _feature_set, \ | ||
29 | .feature_bit = _prefix ##_## _feature_bit, \ | ||
30 | } | ||
31 | #define BTRFS_FEAT_ATTR_PTR(_name) (&btrfs_attr_##_name.kobj_attr.attr) | ||
32 | |||
33 | #define BTRFS_FEAT_ATTR_COMPAT(name, feature) \ | ||
34 | BTRFS_FEAT_ATTR(name, FEAT_COMPAT, BTRFS_FEATURE_COMPAT, feature) | ||
35 | #define BTRFS_FEAT_ATTR_COMPAT_RO(name, feature) \ | ||
36 | BTRFS_FEAT_ATTR(name, FEAT_COMPAT_RO, BTRFS_FEATURE_COMPAT, feature) | ||
37 | #define BTRFS_FEAT_ATTR_INCOMPAT(name, feature) \ | ||
38 | BTRFS_FEAT_ATTR(name, FEAT_INCOMPAT, BTRFS_FEATURE_INCOMPAT, feature) | ||
39 | |||
40 | /* convert from attribute */ | ||
41 | #define to_btrfs_feature_attr(a) \ | ||
42 | container_of(a, struct btrfs_feature_attr, kobj_attr) | ||
43 | #endif /* _BTRFS_SYSFS_H_ */ | ||