mirror of
https://gitee.com/bianbu-linux/linux-6.6
synced 2025-04-24 14:07:52 -04:00
btrfs: factor sysfs code out of link_block_group
The part of link_block_group that just creates the sysfs object is independent and can be factored out to a helper. Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
89439109bc
commit
32a9991f15
3 changed files with 49 additions and 35 deletions
|
@ -4,7 +4,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/sched/mm.h>
|
|
||||||
#include <linux/sched/signal.h>
|
#include <linux/sched/signal.h>
|
||||||
#include <linux/pagemap.h>
|
#include <linux/pagemap.h>
|
||||||
#include <linux/writeback.h>
|
#include <linux/writeback.h>
|
||||||
|
@ -7573,7 +7572,6 @@ int btrfs_free_block_groups(struct btrfs_fs_info *info)
|
||||||
static void link_block_group(struct btrfs_block_group_cache *cache)
|
static void link_block_group(struct btrfs_block_group_cache *cache)
|
||||||
{
|
{
|
||||||
struct btrfs_space_info *space_info = cache->space_info;
|
struct btrfs_space_info *space_info = cache->space_info;
|
||||||
struct btrfs_fs_info *fs_info = cache->fs_info;
|
|
||||||
int index = btrfs_bg_flags_to_raid_index(cache->flags);
|
int index = btrfs_bg_flags_to_raid_index(cache->flags);
|
||||||
bool first = false;
|
bool first = false;
|
||||||
|
|
||||||
|
@ -7583,39 +7581,8 @@ static void link_block_group(struct btrfs_block_group_cache *cache)
|
||||||
list_add_tail(&cache->list, &space_info->block_groups[index]);
|
list_add_tail(&cache->list, &space_info->block_groups[index]);
|
||||||
up_write(&space_info->groups_sem);
|
up_write(&space_info->groups_sem);
|
||||||
|
|
||||||
if (first) {
|
if (first)
|
||||||
struct raid_kobject *rkobj;
|
btrfs_sysfs_add_block_group_type(cache);
|
||||||
unsigned int nofs_flag;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Setup a NOFS context because kobject_add(), deep in its call
|
|
||||||
* chain, does GFP_KERNEL allocations, and we are often called
|
|
||||||
* in a context where if reclaim is triggered we can deadlock
|
|
||||||
* (we are either holding a transaction handle or some lock
|
|
||||||
* required for a transaction commit).
|
|
||||||
*/
|
|
||||||
nofs_flag = memalloc_nofs_save();
|
|
||||||
rkobj = kzalloc(sizeof(*rkobj), GFP_KERNEL);
|
|
||||||
if (!rkobj) {
|
|
||||||
memalloc_nofs_restore(nofs_flag);
|
|
||||||
btrfs_warn(cache->fs_info,
|
|
||||||
"couldn't alloc memory for raid level kobject");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
rkobj->flags = cache->flags;
|
|
||||||
kobject_init(&rkobj->kobj, &btrfs_raid_ktype);
|
|
||||||
ret = kobject_add(&rkobj->kobj, &space_info->kobj, "%s",
|
|
||||||
btrfs_bg_type_to_raid_name(rkobj->flags));
|
|
||||||
memalloc_nofs_restore(nofs_flag);
|
|
||||||
if (ret) {
|
|
||||||
kobject_put(&rkobj->kobj);
|
|
||||||
btrfs_warn(fs_info,
|
|
||||||
"failed to add kobject for block cache, ignoring");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
space_info->block_group_kobjs[index] = &rkobj->kobj;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct btrfs_block_group_cache *
|
static struct btrfs_block_group_cache *
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
|
#include <linux/sched/mm.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
#include <linux/completion.h>
|
#include <linux/completion.h>
|
||||||
|
@ -749,6 +750,51 @@ static void init_feature_attrs(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Create a sysfs entry for a given block group type at path
|
||||||
|
* /sys/fs/btrfs/UUID/allocation/data/TYPE
|
||||||
|
*/
|
||||||
|
void btrfs_sysfs_add_block_group_type(struct btrfs_block_group_cache *cache)
|
||||||
|
{
|
||||||
|
struct btrfs_fs_info *fs_info = cache->fs_info;
|
||||||
|
struct btrfs_space_info *space_info = cache->space_info;
|
||||||
|
struct raid_kobject *rkobj;
|
||||||
|
const int index = btrfs_bg_flags_to_raid_index(cache->flags);
|
||||||
|
unsigned int nofs_flag;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Setup a NOFS context because kobject_add(), deep in its call chain,
|
||||||
|
* does GFP_KERNEL allocations, and we are often called in a context
|
||||||
|
* where if reclaim is triggered we can deadlock (we are either holding
|
||||||
|
* a transaction handle or some lock required for a transaction
|
||||||
|
* commit).
|
||||||
|
*/
|
||||||
|
nofs_flag = memalloc_nofs_save();
|
||||||
|
|
||||||
|
rkobj = kzalloc(sizeof(*rkobj), GFP_NOFS);
|
||||||
|
if (!rkobj) {
|
||||||
|
memalloc_nofs_restore(nofs_flag);
|
||||||
|
btrfs_warn(cache->fs_info,
|
||||||
|
"couldn't alloc memory for raid level kobject");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
rkobj->flags = cache->flags;
|
||||||
|
kobject_init(&rkobj->kobj, &btrfs_raid_ktype);
|
||||||
|
ret = kobject_add(&rkobj->kobj, &space_info->kobj, "%s",
|
||||||
|
btrfs_bg_type_to_raid_name(rkobj->flags));
|
||||||
|
memalloc_nofs_restore(nofs_flag);
|
||||||
|
if (ret) {
|
||||||
|
kobject_put(&rkobj->kobj);
|
||||||
|
btrfs_warn(fs_info,
|
||||||
|
"failed to add kobject for block cache, ignoring");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
space_info->block_group_kobjs[index] = &rkobj->kobj;
|
||||||
|
}
|
||||||
|
|
||||||
/* when one_device is NULL, it removes all device links */
|
/* when one_device is NULL, it removes all device links */
|
||||||
|
|
||||||
int btrfs_sysfs_rm_device_link(struct btrfs_fs_devices *fs_devices,
|
int btrfs_sysfs_rm_device_link(struct btrfs_fs_devices *fs_devices,
|
||||||
|
|
|
@ -96,5 +96,6 @@ int __init btrfs_init_sysfs(void);
|
||||||
void __cold btrfs_exit_sysfs(void);
|
void __cold btrfs_exit_sysfs(void);
|
||||||
int btrfs_sysfs_add_mounted(struct btrfs_fs_info *fs_info);
|
int btrfs_sysfs_add_mounted(struct btrfs_fs_info *fs_info);
|
||||||
void btrfs_sysfs_remove_mounted(struct btrfs_fs_info *fs_info);
|
void btrfs_sysfs_remove_mounted(struct btrfs_fs_info *fs_info);
|
||||||
|
void btrfs_sysfs_add_block_group_type(struct btrfs_block_group_cache *cache);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue