Fix XFRM-I support for nested ESP tunnels
[platform/kernel/linux-starfive.git] / block / genhd.c
index 0f9769d..c476568 100644 (file)
@@ -356,7 +356,7 @@ void disk_uevent(struct gendisk *disk, enum kobject_action action)
 }
 EXPORT_SYMBOL_GPL(disk_uevent);
 
-int disk_scan_partitions(struct gendisk *disk, fmode_t mode)
+int disk_scan_partitions(struct gendisk *disk, fmode_t mode, void *owner)
 {
        struct block_device *bdev;
 
@@ -366,6 +366,9 @@ int disk_scan_partitions(struct gendisk *disk, fmode_t mode)
                return -EINVAL;
        if (disk->open_partitions)
                return -EBUSY;
+       /* Someone else has bdev exclusively open? */
+       if (disk->part0->bd_holder && disk->part0->bd_holder != owner)
+               return -EBUSY;
 
        set_bit(GD_NEED_PART_SCAN, &disk->state);
        bdev = blkdev_get_by_dev(disk_devt(disk), mode, NULL);
@@ -500,7 +503,7 @@ int __must_check device_add_disk(struct device *parent, struct gendisk *disk,
 
                bdev_add(disk->part0, ddev->devt);
                if (get_capacity(disk))
-                       disk_scan_partitions(disk, FMODE_READ);
+                       disk_scan_partitions(disk, FMODE_READ, NULL);
 
                /*
                 * Announce the disk and partitions after all partitions are
@@ -530,6 +533,7 @@ out_unregister_queue:
        rq_qos_exit(disk->queue);
 out_put_slave_dir:
        kobject_put(disk->slave_dir);
+       disk->slave_dir = NULL;
 out_put_holder_dir:
        kobject_put(disk->part0->bd_holder_dir);
 out_del_integrity:
@@ -629,6 +633,7 @@ void del_gendisk(struct gendisk *disk)
 
        kobject_put(disk->part0->bd_holder_dir);
        kobject_put(disk->slave_dir);
+       disk->slave_dir = NULL;
 
        part_stat_set_all(disk->part0, 0);
        disk->part0->bd_stamp = 0;