diff options
| author | David Sterba <dsterba@suse.com> | 2016-01-21 12:50:40 -0500 |
|---|---|---|
| committer | David Sterba <dsterba@suse.com> | 2016-01-21 12:50:40 -0500 |
| commit | 444e75169872f668eb890f19ec1f32dfc632e704 (patch) | |
| tree | fcc120a9b3ec12c3398908b9bb4491ef6cb3f603 /fs | |
| parent | 3b5bb73bd88d1d90163c91e7cad50b12725dbb1c (diff) | |
btrfs: sysfs: introduce helper for syncing bits with sysfs files
The files under /sys/fs/UUID/features get out of sync with the actual
incompat bits set for the filesystem if they change after mount. We're
going to sync them and need a helper to do that.
Signed-off-by: David Sterba <dsterba@suse.com>
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/btrfs/sysfs.c | 30 | ||||
| -rw-r--r-- | fs/btrfs/sysfs.h | 3 |
2 files changed, 33 insertions, 0 deletions
diff --git a/fs/btrfs/sysfs.c b/fs/btrfs/sysfs.c index 906f7ed6fc80..6986886243bf 100644 --- a/fs/btrfs/sysfs.c +++ b/fs/btrfs/sysfs.c | |||
| @@ -782,6 +782,36 @@ failure: | |||
| 782 | return error; | 782 | return error; |
| 783 | } | 783 | } |
| 784 | 784 | ||
| 785 | |||
| 786 | /* | ||
| 787 | * Change per-fs features in /sys/fs/btrfs/UUID/features to match current | ||
| 788 | * values in superblock. Call after any changes to incompat/compat_ro flags | ||
| 789 | */ | ||
| 790 | void btrfs_sysfs_feature_update(struct btrfs_fs_info *fs_info, | ||
| 791 | u64 bit, enum btrfs_feature_set set) | ||
| 792 | { | ||
| 793 | struct btrfs_fs_devices *fs_devs; | ||
| 794 | struct kobject *fsid_kobj; | ||
| 795 | u64 features; | ||
| 796 | int ret; | ||
| 797 | |||
| 798 | if (!fs_info) | ||
| 799 | return; | ||
| 800 | |||
| 801 | features = get_features(fs_info, set); | ||
| 802 | ASSERT(bit & supported_feature_masks[set]); | ||
| 803 | |||
| 804 | fs_devs = fs_info->fs_devices; | ||
| 805 | fsid_kobj = &fs_devs->fsid_kobj; | ||
| 806 | |||
| 807 | /* | ||
| 808 | * FIXME: this is too heavy to update just one value, ideally we'd like | ||
| 809 | * to use sysfs_update_group but some refactoring is needed first. | ||
| 810 | */ | ||
| 811 | sysfs_remove_group(fsid_kobj, &btrfs_feature_attr_group); | ||
| 812 | ret = sysfs_create_group(fsid_kobj, &btrfs_feature_attr_group); | ||
| 813 | } | ||
| 814 | |||
| 785 | static int btrfs_init_debugfs(void) | 815 | static int btrfs_init_debugfs(void) |
| 786 | { | 816 | { |
| 787 | #ifdef CONFIG_DEBUG_FS | 817 | #ifdef CONFIG_DEBUG_FS |
diff --git a/fs/btrfs/sysfs.h b/fs/btrfs/sysfs.h index 72408e2c4ea8..d7da1a4c2f6c 100644 --- a/fs/btrfs/sysfs.h +++ b/fs/btrfs/sysfs.h | |||
| @@ -90,4 +90,7 @@ int btrfs_sysfs_add_fsid(struct btrfs_fs_devices *fs_devs, | |||
| 90 | struct kobject *parent); | 90 | struct kobject *parent); |
| 91 | int btrfs_sysfs_add_device(struct btrfs_fs_devices *fs_devs); | 91 | int btrfs_sysfs_add_device(struct btrfs_fs_devices *fs_devs); |
| 92 | void btrfs_sysfs_remove_fsid(struct btrfs_fs_devices *fs_devs); | 92 | void btrfs_sysfs_remove_fsid(struct btrfs_fs_devices *fs_devs); |
| 93 | void btrfs_sysfs_feature_update(struct btrfs_fs_info *fs_info, | ||
| 94 | u64 bit, enum btrfs_feature_set set); | ||
| 95 | |||
| 93 | #endif /* _BTRFS_SYSFS_H_ */ | 96 | #endif /* _BTRFS_SYSFS_H_ */ |
