• Jan Kara's avatar
    block: Revalidate i_bdev reference in bd_aquire() · cccd9fb9
    Jan Kara authored
    When a device gets removed, block device inode unhashed so that it is not
    used anymore (bdget() will not find it anymore). Later when a new device
    gets created with the same device number, we create new block device
    inode. However there may be file system device inodes whose i_bdev still
    points to the original block device inode and thus we get two active
    block device inodes for the same device. They will share the same
    gendisk so the only visible differences will be that page caches will
    not be coherent and BDIs will be different (the old block device inode
    still points to unregistered BDI).
    
    Fix the problem by checking in bd_acquire() whether i_bdev still points
    to active block device inode and re-lookup the block device if not. That
    way any open of a block device happening after the old device has been
    removed will get correct block device inode.
    Tested-by: default avatarLekshmi Pillai <lekshmicpillai@in.ibm.com>
    Acked-by: default avatarTejun Heo <tj@kernel.org>
    Signed-off-by: default avatarJan Kara <jack@suse.cz>
    Signed-off-by: default avatarJens Axboe <axboe@fb.com>
    cccd9fb9
block_dev.c 56.2 KB