Message ID | 20181119093817.9291-4-jthumshirn@suse.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | btrfs: fix compiler warning with make W=1 | expand |
On Mon, Nov 19, 2018 at 10:38:15AM +0100, Johannes Thumshirn wrote: > btrfs_sysfs_feature_update() was introduced with commit 444e75169872 (btrfs: > sysfs: introduce helper for syncing bits with sysfs files) to provide a helper > which was used in 14e46e04958d (btrfs: synchronize incompat feature bits with > sysfs files). > > But commit e410e34fad91 (Revert "btrfs: synchronize incompat feature bits with > sysfs files") reverted 14e46e04958d so btrfs_sysfs_feature_update() ended up > as an unused function. This ends up doing sysfs operations from deep in balance (where we should be GFP_NOFS) and under heavy balance load, we're making races against sysfs internals. Revert it for now while we figure things out. With the memalloc_nofs_save/memalloc_nofs_restore we can get address the GFP_NOFS problem, but I don't remember what was the other part about sysfs internals. The sysfs bits for features should be match the internal state so this is a (low priority) bug, I'd prefer fixing it instead of removing the code.
diff --git a/fs/btrfs/sysfs.c b/fs/btrfs/sysfs.c index 3717c864ba23..a22a7c5f75eb 100644 --- a/fs/btrfs/sysfs.c +++ b/fs/btrfs/sysfs.c @@ -858,39 +858,6 @@ int btrfs_sysfs_add_mounted(struct btrfs_fs_info *fs_info) return error; } - -/* - * Change per-fs features in /sys/fs/btrfs/UUID/features to match current - * values in superblock. Call after any changes to incompat/compat_ro flags - */ -void btrfs_sysfs_feature_update(struct btrfs_fs_info *fs_info, - u64 bit, enum btrfs_feature_set set) -{ - struct btrfs_fs_devices *fs_devs; - struct kobject *fsid_kobj; - u64 features; - int ret; - - if (!fs_info) - return; - - features = get_features(fs_info, set); - ASSERT(bit & supported_feature_masks[set]); - - fs_devs = fs_info->fs_devices; - fsid_kobj = &fs_devs->fsid_kobj; - - if (!fsid_kobj->state_initialized) - return; - - /* - * FIXME: this is too heavy to update just one value, ideally we'd like - * to use sysfs_update_group but some refactoring is needed first. - */ - sysfs_remove_group(fsid_kobj, &btrfs_feature_attr_group); - ret = sysfs_create_group(fsid_kobj, &btrfs_feature_attr_group); -} - static int btrfs_init_debugfs(void) { #ifdef CONFIG_DEBUG_FS diff --git a/fs/btrfs/sysfs.h b/fs/btrfs/sysfs.h index c6ee600aff89..93feedde8485 100644 --- a/fs/btrfs/sysfs.h +++ b/fs/btrfs/sysfs.h @@ -88,7 +88,5 @@ int btrfs_sysfs_add_fsid(struct btrfs_fs_devices *fs_devs, struct kobject *parent); int btrfs_sysfs_add_device(struct btrfs_fs_devices *fs_devs); void btrfs_sysfs_remove_fsid(struct btrfs_fs_devices *fs_devs); -void btrfs_sysfs_feature_update(struct btrfs_fs_info *fs_info, - u64 bit, enum btrfs_feature_set set); #endif