|
@@ -885,6 +885,8 @@ static void bdev_evict_inode(struct inode *inode)
|
|
|
spin_lock(&bdev_lock);
|
|
|
list_del_init(&bdev->bd_list);
|
|
|
spin_unlock(&bdev_lock);
|
|
|
+ /* Detach inode from wb early as bdi_put() may free bdi->wb */
|
|
|
+ inode_detach_wb(inode);
|
|
|
if (bdev->bd_bdi != &noop_backing_dev_info) {
|
|
|
bdi_put(bdev->bd_bdi);
|
|
|
bdev->bd_bdi = &noop_backing_dev_info;
|
|
@@ -1875,12 +1877,6 @@ static void __blkdev_put(struct block_device *bdev, fmode_t mode, int for_part)
|
|
|
kill_bdev(bdev);
|
|
|
|
|
|
bdev_write_inode(bdev);
|
|
|
- /*
|
|
|
- * Detaching bdev inode from its wb in __destroy_inode()
|
|
|
- * is too late: the queue which embeds its bdi (along with
|
|
|
- * root wb) can be gone as soon as we put_disk() below.
|
|
|
- */
|
|
|
- inode_detach_wb(bdev->bd_inode);
|
|
|
}
|
|
|
if (bdev->bd_contains == bdev) {
|
|
|
if (disk->fops->release)
|