• Christian Brauner's avatar
    super: ensure valid info · dc3216b1
    Christian Brauner authored
    For keyed filesystems that recycle superblocks based on s_fs_info or
    information contained therein s_fs_info must be kept as long as the
    superblock is on the filesystem type super list. This isn't guaranteed
    as s_fs_info will be freed latest in sb->kill_sb().
    
    The fix is simply to perform notification and list removal in
    kill_anon_super(). Any filesystem needs to free s_fs_info after they
    call the kill_*() helpers. If they don't they risk use-after-free right
    now so fixing it here is guaranteed that s_fs_info remain valid.
    
    For block backed filesystems notifying in pass sb->kill_sb() in
    deactivate_locked_super() remains unproblematic and is required because
    multiple other block devices can be shut down after kill_block_super()
    has been called from a filesystem's sb->kill_sb() handler. For example,
    ext4 and xfs close additional devices. Block based filesystems don't
    depend on s_fs_info (btrfs does use s_fs_info but also uses
    kill_anon_super() and not kill_block_super().).
    
    Sorry for that braino. Goal should be to unify this behavior during this
    cycle obviously. But let's please do a simple bugfix now.
    
    Fixes: 2c18a63b ("super: wait until we passed kill super")
    Fixes: syzbot+5b64180f8d9e39d3f061@syzkaller.appspotmail.com
    Reviewed-by: default avatarJan Kara <jack@suse.cz>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    Reported-by: syzbot+5b64180f8d9e39d3f061@syzkaller.appspotmail.com
    Message-Id: <20230828-vfs-super-fixes-v1-2-b37a4a04a88f@kernel.org>
    Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
    dc3216b1
super.c 54.9 KB