It is better not to directly access the internal members of the kobject object, especially kobject_init_and_add() may failure. BTW remove unnecessary kobject_del(), kobject_put() actually covers kobject removal automatically, which is single stage removal.
Signed-off-by: Yangtao Li <[email protected]> --- fs/erofs/internal.h | 1 + fs/erofs/sysfs.c | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/fs/erofs/internal.h b/fs/erofs/internal.h index f675050af2bb..f364b1e9b35b 100644 --- a/fs/erofs/internal.h +++ b/fs/erofs/internal.h @@ -177,6 +177,7 @@ struct erofs_sb_info { /* sysfs support */ struct kobject s_kobj; /* /sys/fs/erofs/<devname> */ struct completion s_kobj_unregister; + bool sysfs_registered; /* fscache support */ struct fscache_volume *volume; diff --git a/fs/erofs/sysfs.c b/fs/erofs/sysfs.c index 435e515c0792..c38018d3c442 100644 --- a/fs/erofs/sysfs.c +++ b/fs/erofs/sysfs.c @@ -228,6 +228,7 @@ int erofs_register_sysfs(struct super_block *sb) kfree(str); if (err) goto put_sb_kobj; + sbi->sysfs_registered = true; return 0; put_sb_kobj: @@ -240,8 +241,7 @@ void erofs_unregister_sysfs(struct super_block *sb) { struct erofs_sb_info *sbi = EROFS_SB(sb); - if (sbi->s_kobj.state_in_sysfs) { - kobject_del(&sbi->s_kobj); + if (sbi->sysfs_registered) { kobject_put(&sbi->s_kobj); wait_for_completion(&sbi->s_kobj_unregister); } -- 2.35.1
