• Christian Brauner's avatar
    super: wait for nascent superblocks · 5e874914
    Christian Brauner authored
    Recent patches experiment with making it possible to allocate a new
    superblock before opening the relevant block device. Naturally this has
    intricate side-effects that we get to learn about while developing this.
    
    Superblock allocators such as sget{_fc}() return with s_umount of the
    new superblock held and lock ordering currently requires that block
    level locks such as bdev_lock and open_mutex rank above s_umount.
    
    Before aca740ce ("fs: open block device after superblock creation")
    ordering was guaranteed to be correct as block devices were opened prior
    to superblock allocation and thus s_umount wasn't held. But now s_umount
    must be dropped before opening block devices to avoid locking
    violations.
    
    This has consequences. The main one being that iterators over
    @super_blocks and @fs_supers that grab a temporary reference to the
    superblock can now also grab s_umount before the caller has managed to
    open block devices and called fill_super(). So whereas before such
    iterators or concurrent mounts would have simply slept on s_umount until
    SB_BORN was set or the superblock was discard due to initalization
    failure they can now needlessly spin through sget{_fc}().
    
    If the caller is sleeping on bdev_lock or open_mutex one caller waiting
    on SB_BORN will always spin somewhere and potentially this can go on for
    quite a while.
    
    It should be possible to drop s_umount while allowing iterators to wait
    on a nascent superblock to either be born or discarded. This patch
    implements a wait_var_event() mechanism allowing iterators to sleep
    until they are woken when the superblock is born or discarded.
    
    This also allows us to avoid relooping through @fs_supers and
    @super_blocks if a superblock isn't yet born or dying.
    
    Link: aca740ce ("fs: open block device after superblock creation")
    Reviewed-by: default avatarJan Kara <jack@suse.cz>
    Message-Id: <20230818-vfs-super-fixes-v3-v3-3-9f0b1876e46b@kernel.org>
    Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
    5e874914
super.c 50.2 KB