• Tejun Heo's avatar
    vfs: don't hold s_umount over close_bdev_exclusive() call · 4f331f01
    Tejun Heo authored
    Fix an obscure AB-BA deadlock in get_sb_bdev().
    
    When a superblock is mounted more than once get_sb_bdev() calls
    close_bdev_exclusive() to drop the extra bdev reference while holding
    s_umount.  However, sb->s_umount nests inside bd_mutex during
    __invalidate_device() and close_bdev_exclusive() acquires bd_mutex during
    blkdev_put(); thus creating an AB-BA deadlock.
    
    This condition doesn't trigger frequently.  For this condition to be
    visible to lockdep, the filesystem must occupy the whole device (as
    __invalidate_device() only grabs bd_mutex for the whole device), the FS
    must be mounted more than once and partition rescan should be issued while
    the FS is still mounted.
    
    Fix it by dropping s_umount over close_bdev_exclusive().
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Reported-by: default avatarCiprian Docan <docan@eden.rutgers.edu>
    Cc: Al Viro <viro@zeniv.linux.org.uk>
    Acked-by: default avatarJens Axboe <axboe@kernel.dk>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
    4f331f01
super.c 25.1 KB