lockdep_assert_held(&bdev->bd_mutex);
 
-       return rescan_partitions(disk, bdev);
+       return rescan_partitions(disk, bdev, false);
 }
 EXPORT_SYMBOL(__blkdev_reread_part);
 
 
        return ret;
 }
 
-int rescan_partitions(struct gendisk *disk, struct block_device *bdev)
+int rescan_partitions(struct gendisk *disk, struct block_device *bdev,
+               bool invalidate)
 {
        int ret;
 
        if (ret)
                return ret;
 
-       if (disk->fops->revalidate_disk)
+       if (invalidate)
+               set_capacity(disk, 0);
+       else if (disk->fops->revalidate_disk)
                disk->fops->revalidate_disk(disk);
-       check_disk_size_change(disk, bdev, true);
+
+       check_disk_size_change(disk, bdev, !invalidate);
        bdev->bd_invalidated = 0;
 
-       if (!get_capacity(disk))
+       if (!get_capacity(disk)) {
+               /*
+                * Tell userspace that the media / partition table may have
+                * changed.
+                */
+               kobject_uevent(&disk_to_dev(disk)->kobj, KOBJ_CHANGE);
                return 0;
+       }
 
        ret = blk_add_partitions(disk, bdev);
        if (ret == -EAGAIN)
        return ret;
 }
 
-int invalidate_partitions(struct gendisk *disk, struct block_device *bdev)
-{
-       int res;
-
-       if (!bdev->bd_invalidated)
-               return 0;
-
-       res = drop_partitions(disk, bdev);
-       if (res)
-               return res;
-
-       set_capacity(disk, 0);
-       check_disk_size_change(disk, bdev, false);
-       bdev->bd_invalidated = 0;
-       /* tell userspace that the media / partition table may have changed */
-       kobject_uevent(&disk_to_dev(disk)->kobj, KOBJ_CHANGE);
-
-       return 0;
-}
-
 unsigned char *read_dev_sector(struct block_device *bdev, sector_t n, Sector *p)
 {
        struct address_space *mapping = bdev->bd_inode->i_mapping;
 
 static void bdev_disk_changed(struct block_device *bdev, bool invalidate)
 {
        if (disk_part_scan_enabled(bdev->bd_disk)) {
-               if (invalidate)
-                       invalidate_partitions(bdev->bd_disk, bdev);
-               else
-                       rescan_partitions(bdev->bd_disk, bdev);
+               rescan_partitions(bdev->bd_disk, bdev, invalidate);
        } else {
                check_disk_size_change(bdev->bd_disk, bdev, !invalidate);
                bdev->bd_invalidated = 0;
 
 extern char *disk_name (struct gendisk *hd, int partno, char *buf);
 
 extern int disk_expand_part_tbl(struct gendisk *disk, int target);
-extern int rescan_partitions(struct gendisk *disk, struct block_device *bdev);
-extern int invalidate_partitions(struct gendisk *disk, struct block_device *bdev);
+int rescan_partitions(struct gendisk *disk, struct block_device *bdev,
+               bool invalidate);
 extern struct hd_struct * __must_check add_partition(struct gendisk *disk,
                                                     int partno, sector_t start,
                                                     sector_t len, int flags,