Skip to content

Commit 444e751

Browse files
committed
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 <[email protected]>
1 parent 3b5bb73 commit 444e751

File tree

2 files changed

+33
-0
lines changed

2 files changed

+33
-0
lines changed

fs/btrfs/sysfs.c

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -782,6 +782,36 @@ int btrfs_sysfs_add_mounted(struct btrfs_fs_info *fs_info)
782782
return error;
783783
}
784784

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+
785815
static int btrfs_init_debugfs(void)
786816
{
787817
#ifdef CONFIG_DEBUG_FS

fs/btrfs/sysfs.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,4 +90,7 @@ int btrfs_sysfs_add_fsid(struct btrfs_fs_devices *fs_devs,
9090
struct kobject *parent);
9191
int btrfs_sysfs_add_device(struct btrfs_fs_devices *fs_devs);
9292
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+
9396
#endif /* _BTRFS_SYSFS_H_ */

0 commit comments

Comments
 (0)