btrfs: publish supported featured in sysfs
This patch adds the ability to publish supported features to sysfs under /sys/fs/btrfs/features. The files are module-wide and export which features the kernel supports. The content, for now, is just "0\n". Signed-off-by: Jeff Mahoney <jeffm@suse.com> Signed-off-by: Josef Bacik <jbacik@fusionio.com> Signed-off-by: Chris Mason <clm@fb.com>
This commit is contained in:
parent
29dfe2dc0e
commit
079b72bca3
@ -26,20 +26,64 @@
|
||||
#include "ctree.h"
|
||||
#include "disk-io.h"
|
||||
#include "transaction.h"
|
||||
#include "sysfs.h"
|
||||
|
||||
static ssize_t btrfs_feature_attr_show(struct kobject *kobj,
|
||||
struct kobj_attribute *a, char *buf)
|
||||
{
|
||||
return snprintf(buf, PAGE_SIZE, "0\n");
|
||||
}
|
||||
|
||||
BTRFS_FEAT_ATTR_INCOMPAT(mixed_backref, MIXED_BACKREF);
|
||||
BTRFS_FEAT_ATTR_INCOMPAT(default_subvol, DEFAULT_SUBVOL);
|
||||
BTRFS_FEAT_ATTR_INCOMPAT(mixed_groups, MIXED_GROUPS);
|
||||
BTRFS_FEAT_ATTR_INCOMPAT(compress_lzo, COMPRESS_LZO);
|
||||
BTRFS_FEAT_ATTR_INCOMPAT(compress_lzov2, COMPRESS_LZOv2);
|
||||
BTRFS_FEAT_ATTR_INCOMPAT(big_metadata, BIG_METADATA);
|
||||
BTRFS_FEAT_ATTR_INCOMPAT(extended_iref, EXTENDED_IREF);
|
||||
BTRFS_FEAT_ATTR_INCOMPAT(raid56, RAID56);
|
||||
BTRFS_FEAT_ATTR_INCOMPAT(skinny_metadata, SKINNY_METADATA);
|
||||
|
||||
static struct attribute *btrfs_supported_feature_attrs[] = {
|
||||
BTRFS_FEAT_ATTR_PTR(mixed_backref),
|
||||
BTRFS_FEAT_ATTR_PTR(default_subvol),
|
||||
BTRFS_FEAT_ATTR_PTR(mixed_groups),
|
||||
BTRFS_FEAT_ATTR_PTR(compress_lzo),
|
||||
BTRFS_FEAT_ATTR_PTR(compress_lzov2),
|
||||
BTRFS_FEAT_ATTR_PTR(big_metadata),
|
||||
BTRFS_FEAT_ATTR_PTR(extended_iref),
|
||||
BTRFS_FEAT_ATTR_PTR(raid56),
|
||||
BTRFS_FEAT_ATTR_PTR(skinny_metadata),
|
||||
NULL
|
||||
};
|
||||
|
||||
static const struct attribute_group btrfs_feature_attr_group = {
|
||||
.name = "features",
|
||||
.attrs = btrfs_supported_feature_attrs,
|
||||
};
|
||||
|
||||
/* /sys/fs/btrfs/ entry */
|
||||
static struct kset *btrfs_kset;
|
||||
|
||||
int btrfs_init_sysfs(void)
|
||||
{
|
||||
int ret;
|
||||
btrfs_kset = kset_create_and_add("btrfs", NULL, fs_kobj);
|
||||
if (!btrfs_kset)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = sysfs_create_group(&btrfs_kset->kobj, &btrfs_feature_attr_group);
|
||||
if (ret) {
|
||||
kset_unregister(btrfs_kset);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void btrfs_exit_sysfs(void)
|
||||
{
|
||||
sysfs_remove_group(&btrfs_kset->kobj, &btrfs_feature_attr_group);
|
||||
kset_unregister(btrfs_kset);
|
||||
}
|
||||
|
||||
|
43
fs/btrfs/sysfs.h
Normal file
43
fs/btrfs/sysfs.h
Normal file
@ -0,0 +1,43 @@
|
||||
#ifndef _BTRFS_SYSFS_H_
|
||||
#define _BTRFS_SYSFS_H_
|
||||
|
||||
enum btrfs_feature_set {
|
||||
FEAT_COMPAT,
|
||||
FEAT_COMPAT_RO,
|
||||
FEAT_INCOMPAT,
|
||||
FEAT_MAX
|
||||
};
|
||||
|
||||
#define __INIT_KOBJ_ATTR(_name, _mode, _show, _store) \
|
||||
{ \
|
||||
.attr = { .name = __stringify(_name), .mode = _mode }, \
|
||||
.show = _show, \
|
||||
.store = _store, \
|
||||
}
|
||||
|
||||
struct btrfs_feature_attr {
|
||||
struct kobj_attribute kobj_attr;
|
||||
enum btrfs_feature_set feature_set;
|
||||
u64 feature_bit;
|
||||
};
|
||||
|
||||
#define BTRFS_FEAT_ATTR(_name, _feature_set, _prefix, _feature_bit) \
|
||||
static struct btrfs_feature_attr btrfs_attr_##_name = { \
|
||||
.kobj_attr = __INIT_KOBJ_ATTR(_name, S_IRUGO, \
|
||||
btrfs_feature_attr_show, NULL), \
|
||||
.feature_set = _feature_set, \
|
||||
.feature_bit = _prefix ##_## _feature_bit, \
|
||||
}
|
||||
#define BTRFS_FEAT_ATTR_PTR(_name) (&btrfs_attr_##_name.kobj_attr.attr)
|
||||
|
||||
#define BTRFS_FEAT_ATTR_COMPAT(name, feature) \
|
||||
BTRFS_FEAT_ATTR(name, FEAT_COMPAT, BTRFS_FEATURE_COMPAT, feature)
|
||||
#define BTRFS_FEAT_ATTR_COMPAT_RO(name, feature) \
|
||||
BTRFS_FEAT_ATTR(name, FEAT_COMPAT_RO, BTRFS_FEATURE_COMPAT, feature)
|
||||
#define BTRFS_FEAT_ATTR_INCOMPAT(name, feature) \
|
||||
BTRFS_FEAT_ATTR(name, FEAT_INCOMPAT, BTRFS_FEATURE_INCOMPAT, feature)
|
||||
|
||||
/* convert from attribute */
|
||||
#define to_btrfs_feature_attr(a) \
|
||||
container_of(a, struct btrfs_feature_attr, kobj_attr)
|
||||
#endif /* _BTRFS_SYSFS_H_ */
|
Loading…
Reference in New Issue
Block a user