]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - fs/block_dev.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
[mirror_ubuntu-artful-kernel.git] / fs / block_dev.c
index 73031ec54a7be5ff34be619581cb20cef81cb8f5..77c30f15a02c3101c0dc4a96008c159c429b7441 100644 (file)
@@ -989,7 +989,7 @@ struct block_device *bdget(dev_t dev)
                bdev->bd_super = NULL;
                bdev->bd_inode = inode;
                bdev->bd_bdi = &noop_backing_dev_info;
-               bdev->bd_block_size = (1 << inode->i_blkbits);
+               bdev->bd_block_size = i_blocksize(inode);
                bdev->bd_part_count = 0;
                bdev->bd_invalidated = 0;
                inode->i_mode = S_IFBLK;
@@ -1043,13 +1043,22 @@ static struct block_device *bd_acquire(struct inode *inode)
 
        spin_lock(&bdev_lock);
        bdev = inode->i_bdev;
-       if (bdev) {
+       if (bdev && !inode_unhashed(bdev->bd_inode)) {
                bdgrab(bdev);
                spin_unlock(&bdev_lock);
                return bdev;
        }
        spin_unlock(&bdev_lock);
 
+       /*
+        * i_bdev references block device inode that was already shut down
+        * (corresponding device got removed).  Remove the reference and look
+        * up block device inode again just in case new device got
+        * reestablished under the same device number.
+        */
+       if (bdev)
+               bd_forget(inode);
+
        bdev = bdget(inode->i_rdev);
        if (bdev) {
                spin_lock(&bdev_lock);