bdev_write_inode(bdev);
 }
 
+static void blkdev_put_whole(struct block_device *bdev)
+{
+       if (atomic_dec_and_test(&bdev->bd_openers))
+               blkdev_flush_mapping(bdev);
+       if (bdev->bd_disk->fops->release)
+               bdev->bd_disk->fops->release(bdev->bd_disk);
+}
+
 static int blkdev_get_whole(struct block_device *bdev, blk_mode_t mode)
 {
        struct gendisk *disk = bdev->bd_disk;
 
        if (!atomic_read(&bdev->bd_openers))
                set_init_blocksize(bdev);
-       if (test_bit(GD_NEED_PART_SCAN, &disk->state))
-               bdev_disk_changed(disk, false);
        atomic_inc(&bdev->bd_openers);
+       if (test_bit(GD_NEED_PART_SCAN, &disk->state)) {
+               /*
+                * Only return scanning errors if we are called from contexts
+                * that explicitly want them, e.g. the BLKRRPART ioctl.
+                */
+               ret = bdev_disk_changed(disk, false);
+               if (ret && (mode & BLK_OPEN_STRICT_SCAN)) {
+                       blkdev_put_whole(bdev);
+                       return ret;
+               }
+       }
        return 0;
 }
 
-static void blkdev_put_whole(struct block_device *bdev)
-{
-       if (atomic_dec_and_test(&bdev->bd_openers))
-               blkdev_flush_mapping(bdev);
-       if (bdev->bd_disk->fops->release)
-               bdev->bd_disk->fops->release(bdev->bd_disk);
-}
-
 static int blkdev_get_part(struct block_device *part, blk_mode_t mode)
 {
        struct gendisk *disk = part->bd_disk;
 
                        return -EACCES;
                if (bdev_is_partition(bdev))
                        return -EINVAL;
-               return disk_scan_partitions(bdev->bd_disk, mode);
+               return disk_scan_partitions(bdev->bd_disk,
+                               mode | BLK_OPEN_STRICT_SCAN);
        case BLKTRACESTART:
        case BLKTRACESTOP:
        case BLKTRACETEARDOWN:
 
 #define BLK_OPEN_WRITE_IOCTL   ((__force blk_mode_t)(1 << 4))
 /* open is exclusive wrt all other BLK_OPEN_WRITE opens to the device */
 #define BLK_OPEN_RESTRICT_WRITES       ((__force blk_mode_t)(1 << 5))
+/* return partition scanning errors */
+#define BLK_OPEN_STRICT_SCAN   ((__force blk_mode_t)(1 << 6))
 
 struct gendisk {
        /*