Skip to content

Commit 7af2ae1

Browse files
braunerhsiangkao
authored andcommitted
erofs: reliably distinguish block based and fscache mode
When erofs_kill_sb() is called in block dev based mode, s_bdev may not have been initialised yet, and if CONFIG_EROFS_FS_ONDEMAND is enabled, it will be mistaken for fscache mode, and then attempt to free an anon_dev that has never been allocated, triggering the following warning: ============================================ ida_free called for id=0 which is not allocated. WARNING: CPU: 14 PID: 926 at lib/idr.c:525 ida_free+0x134/0x140 Modules linked in: CPU: 14 PID: 926 Comm: mount Not tainted 6.9.0-rc3-dirty #630 RIP: 0010:ida_free+0x134/0x140 Call Trace: <TASK> erofs_kill_sb+0x81/0x90 deactivate_locked_super+0x35/0x80 get_tree_bdev+0x136/0x1e0 vfs_get_tree+0x2c/0xf0 do_new_mount+0x190/0x2f0 [...] ============================================ Now when erofs_kill_sb() is called, erofs_sb_info must have been initialised, so use sbi->fsid to distinguish between the two modes. Signed-off-by: Christian Brauner <[email protected]> Signed-off-by: Baokun Li <[email protected]> Reviewed-by: Jingbo Xu <[email protected]> Reviewed-by: Gao Xiang <[email protected]> Reviewed-by: Chao Yu <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Gao Xiang <[email protected]>
1 parent 07abe43 commit 7af2ae1

File tree

1 file changed

+2
-6
lines changed

1 file changed

+2
-6
lines changed

fs/erofs/super.c

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -789,17 +789,13 @@ static int erofs_init_fs_context(struct fs_context *fc)
789789

790790
static void erofs_kill_sb(struct super_block *sb)
791791
{
792-
struct erofs_sb_info *sbi;
792+
struct erofs_sb_info *sbi = EROFS_SB(sb);
793793

794-
if (erofs_is_fscache_mode(sb))
794+
if (IS_ENABLED(CONFIG_EROFS_FS_ONDEMAND) && sbi->fsid)
795795
kill_anon_super(sb);
796796
else
797797
kill_block_super(sb);
798798

799-
sbi = EROFS_SB(sb);
800-
if (!sbi)
801-
return;
802-
803799
erofs_free_dev_context(sbi->devs);
804800
fs_put_dax(sbi->dax_dev, NULL);
805801
erofs_fscache_unregister_fs(sb);

0 commit comments

Comments
 (0)