Skip to content

Commit dcdd497

Browse files
braunergregkh
authored andcommitted
erofs: reliably distinguish block based and fscache mode
commit 7af2ae1 upstream. 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]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 2d1d3eb commit dcdd497

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
@@ -790,17 +790,13 @@ static int erofs_init_fs_context(struct fs_context *fc)
790790

791791
static void erofs_kill_sb(struct super_block *sb)
792792
{
793-
struct erofs_sb_info *sbi;
793+
struct erofs_sb_info *sbi = EROFS_SB(sb);
794794

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

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

0 commit comments

Comments
 (0)