Merge tag 'configfs-for-linus' of git://git.infradead.org/users/hch/configfs
[cascardo/linux.git] / fs / block_dev.c
index c25639e..01b8e0d 100644 (file)
@@ -1042,12 +1042,9 @@ EXPORT_SYMBOL_GPL(bd_unlink_disk_holder);
 static void flush_disk(struct block_device *bdev, bool kill_dirty)
 {
        if (__invalidate_device(bdev, kill_dirty)) {
-               char name[BDEVNAME_SIZE] = "";
-
-               if (bdev->bd_disk)
-                       disk_name(bdev->bd_disk, 0, name);
                printk(KERN_WARNING "VFS: busy inodes on changed media or "
-                      "resized disk %s\n", name);
+                      "resized disk %s\n",
+                      bdev->bd_disk ? bdev->bd_disk->disk_name : "");
        }
 
        if (!bdev->bd_disk)
@@ -1071,12 +1068,9 @@ void check_disk_size_change(struct gendisk *disk, struct block_device *bdev)
        disk_size = (loff_t)get_capacity(disk) << 9;
        bdev_size = i_size_read(bdev->bd_inode);
        if (disk_size != bdev_size) {
-               char name[BDEVNAME_SIZE];
-
-               disk_name(disk, 0, name);
                printk(KERN_INFO
                       "%s: detected capacity change from %lld to %lld\n",
-                      name, bdev_size, disk_size);
+                      disk->disk_name, bdev_size, disk_size);
                i_size_write(bdev->bd_inode, disk_size);
                flush_disk(bdev, false);
        }
@@ -1523,11 +1517,14 @@ static void __blkdev_put(struct block_device *bdev, fmode_t mode, int for_part)
                WARN_ON_ONCE(bdev->bd_holders);
                sync_blockdev(bdev);
                kill_bdev(bdev);
+
+               bdev_write_inode(bdev);
                /*
-                * ->release can cause the queue to disappear, so flush all
-                * dirty data before.
+                * 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.
                 */
-               bdev_write_inode(bdev);
+               inode_detach_wb(bdev->bd_inode);
        }
        if (bdev->bd_contains == bdev) {
                if (disk->fops->release)