On Fri, Aug 04, 2023 at 04:49:23PM +0200, Christian Brauner wrote: > On Fri, Aug 04, 2023 at 04:43:43PM +0200, Christoph Hellwig wrote: > > On Fri, Aug 04, 2023 at 04:36:49PM +0200, Christian Brauner wrote: > > > FFS > > > > Good spot, this explains the missing dropping of s_umount. > > > > But I don't think it's doing the right thing for MTD mount romfs, > > we'll need something like this: > > I'll fold a fix into Jan's patch. Folding: diff --git a/fs/romfs/super.c b/fs/romfs/super.c index c59b230d55b4..2b9f3e3c052a 100644 --- a/fs/romfs/super.c +++ b/fs/romfs/super.c @@ -583,16 +583,20 @@ static int romfs_init_fs_context(struct fs_context *fc) */ static void romfs_kill_sb(struct super_block *sb) { + generic_shutdown_super(sb); + #ifdef CONFIG_ROMFS_ON_MTD if (sb->s_mtd) { - kill_mtd_super(sb); - return; + put_mtd_device(sb->s_mtd); + sb->s_mtd = NULL; } #endif #ifdef CONFIG_ROMFS_ON_BLOCK if (sb->s_bdev) { - kill_block_super(sb); - return; + sb->s_bdev->bd_super = NULL; + sync_blockdev(sb->s_bdev); + blkdev_put(sb->s_bdev, sb->s_type); } #endif } diff --git a/fs/cramfs/inode.c b/fs/cramfs/inode.c index 27c6597aa1be..0b6cc8a03b54 100644 --- a/fs/cramfs/inode.c +++ b/fs/cramfs/inode.c @@ -485,12 +485,17 @@ static void cramfs_kill_sb(struct super_block *sb) { struct cramfs_sb_info *sbi = CRAMFS_SB(sb); + generic_shutdown_super(sb); + if (IS_ENABLED(CONFIG_CRAMFS_MTD) && sb->s_mtd) { if (sbi && sbi->mtd_point_size) mtd_unpoint(sb->s_mtd, 0, sbi->mtd_point_size); - kill_mtd_super(sb); + put_mtd_device(sb->s_mtd); + sb->s_mtd = NULL; } else if (IS_ENABLED(CONFIG_CRAMFS_BLOCKDEV) && sb->s_bdev) { - kill_block_super(sb); + sb->s_bdev->bd_super = NULL; + sync_blockdev(sb->s_bdev); + blkdev_put(sb->s_bdev, sb->s_type); } kfree(sbi); }