Merge tag 'staging-5.14-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh...
[linux-2.6-microblaze.git] / block / partitions / core.c
index 347c56a..4230d4f 100644 (file)
@@ -453,17 +453,26 @@ int bdev_add_partition(struct block_device *bdev, int partno,
                sector_t start, sector_t length)
 {
        struct block_device *part;
+       struct gendisk *disk = bdev->bd_disk;
+       int ret;
 
-       mutex_lock(&bdev->bd_disk->open_mutex);
-       if (partition_overlaps(bdev->bd_disk, start, length, -1)) {
-               mutex_unlock(&bdev->bd_disk->open_mutex);
-               return -EBUSY;
+       mutex_lock(&disk->open_mutex);
+       if (!(disk->flags & GENHD_FL_UP)) {
+               ret = -ENXIO;
+               goto out;
+       }
+
+       if (partition_overlaps(disk, start, length, -1)) {
+               ret = -EBUSY;
+               goto out;
        }
 
-       part = add_partition(bdev->bd_disk, partno, start, length,
+       part = add_partition(disk, partno, start, length,
                        ADDPART_FLAG_NONE, NULL);
-       mutex_unlock(&bdev->bd_disk->open_mutex);
-       return PTR_ERR_OR_ZERO(part);
+       ret = PTR_ERR_OR_ZERO(part);
+out:
+       mutex_unlock(&disk->open_mutex);
+       return ret;
 }
 
 int bdev_del_partition(struct block_device *bdev, int partno)
@@ -537,12 +546,8 @@ void blk_drop_partitions(struct gendisk *disk)
 
        lockdep_assert_held(&disk->open_mutex);
 
-       xa_for_each_start(&disk->part_tbl, idx, part, 1) {
-               if (!bdgrab(part))
-                       continue;
+       xa_for_each_start(&disk->part_tbl, idx, part, 1)
                delete_partition(part);
-               bdput(part);
-       }
 }
 
 static bool blk_add_partition(struct gendisk *disk,