--- x/block/bdev.c +++ y/block/bdev.c @@ -707,9 +707,16 @@ static void bd_end_claim(struct block_de static void blkdev_flush_mapping(struct block_device *bdev) { + struct address_space *mapping = bdev->bd_mapping; + WARN_ON_ONCE(bdev->bd_holders); sync_blockdev(bdev); - kill_bdev(bdev); + filemap_invalidate_lock(mapping); + if (!mapping_empty(mapping)) { + invalidate_bh_lrus(); + truncate_inode_pages(mapping, 0); + } + filemap_invalidate_unlock(mapping); bdev_write_inode(bdev); }