Skip to content

Commit 0f77b29

Browse files
YuKuai-huaweiaxboe
authored andcommitted
block: Revert "block: Do not reread partition table on exclusively open device"
This reverts commit 36369f4. This patch can't fix the problem in a corner case that device can be opened exclusively after the checking and before blkdev_get_by_dev(). We'll use a new solution to fix the problem in the next patch, and the new solution doesn't need to change apis. Signed-off-by: Yu Kuai <[email protected]> Acked-by: Jan Kara <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jens Axboe <[email protected]>
1 parent 9ec041e commit 0f77b29

File tree

3 files changed

+9
-13
lines changed

3 files changed

+9
-13
lines changed

block/blk.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -427,7 +427,7 @@ int bio_add_hw_page(struct request_queue *q, struct bio *bio,
427427

428428
struct request_queue *blk_alloc_queue(int node_id);
429429

430-
int disk_scan_partitions(struct gendisk *disk, fmode_t mode, void *owner);
430+
int disk_scan_partitions(struct gendisk *disk, fmode_t mode);
431431

432432
int disk_alloc_events(struct gendisk *disk);
433433
void disk_add_events(struct gendisk *disk);

block/genhd.c

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -356,7 +356,7 @@ void disk_uevent(struct gendisk *disk, enum kobject_action action)
356356
}
357357
EXPORT_SYMBOL_GPL(disk_uevent);
358358

359-
int disk_scan_partitions(struct gendisk *disk, fmode_t mode, void *owner)
359+
int disk_scan_partitions(struct gendisk *disk, fmode_t mode)
360360
{
361361
struct block_device *bdev;
362362

@@ -366,9 +366,6 @@ int disk_scan_partitions(struct gendisk *disk, fmode_t mode, void *owner)
366366
return -EINVAL;
367367
if (disk->open_partitions)
368368
return -EBUSY;
369-
/* Someone else has bdev exclusively open? */
370-
if (disk->part0->bd_holder && disk->part0->bd_holder != owner)
371-
return -EBUSY;
372369

373370
set_bit(GD_NEED_PART_SCAN, &disk->state);
374371
bdev = blkdev_get_by_dev(disk_devt(disk), mode, NULL);
@@ -499,7 +496,7 @@ int __must_check device_add_disk(struct device *parent, struct gendisk *disk,
499496

500497
bdev_add(disk->part0, ddev->devt);
501498
if (get_capacity(disk))
502-
disk_scan_partitions(disk, FMODE_READ, NULL);
499+
disk_scan_partitions(disk, FMODE_READ);
503500

504501
/*
505502
* Announce the disk and partitions after all partitions are

block/ioctl.c

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -467,10 +467,10 @@ static int blkdev_bszset(struct block_device *bdev, fmode_t mode,
467467
* user space. Note the separate arg/argp parameters that are needed
468468
* to deal with the compat_ptr() conversion.
469469
*/
470-
static int blkdev_common_ioctl(struct file *file, fmode_t mode, unsigned cmd,
471-
unsigned long arg, void __user *argp)
470+
static int blkdev_common_ioctl(struct block_device *bdev, fmode_t mode,
471+
unsigned int cmd, unsigned long arg,
472+
void __user *argp)
472473
{
473-
struct block_device *bdev = I_BDEV(file->f_mapping->host);
474474
unsigned int max_sectors;
475475

476476
switch (cmd) {
@@ -528,8 +528,7 @@ static int blkdev_common_ioctl(struct file *file, fmode_t mode, unsigned cmd,
528528
return -EACCES;
529529
if (bdev_is_partition(bdev))
530530
return -EINVAL;
531-
return disk_scan_partitions(bdev->bd_disk, mode & ~FMODE_EXCL,
532-
file);
531+
return disk_scan_partitions(bdev->bd_disk, mode & ~FMODE_EXCL);
533532
case BLKTRACESTART:
534533
case BLKTRACESTOP:
535534
case BLKTRACETEARDOWN:
@@ -607,7 +606,7 @@ long blkdev_ioctl(struct file *file, unsigned cmd, unsigned long arg)
607606
break;
608607
}
609608

610-
ret = blkdev_common_ioctl(file, mode, cmd, arg, argp);
609+
ret = blkdev_common_ioctl(bdev, mode, cmd, arg, argp);
611610
if (ret != -ENOIOCTLCMD)
612611
return ret;
613612

@@ -676,7 +675,7 @@ long compat_blkdev_ioctl(struct file *file, unsigned cmd, unsigned long arg)
676675
break;
677676
}
678677

679-
ret = blkdev_common_ioctl(file, mode, cmd, arg, argp);
678+
ret = blkdev_common_ioctl(bdev, mode, cmd, arg, argp);
680679
if (ret == -ENOIOCTLCMD && disk->fops->compat_ioctl)
681680
ret = disk->fops->compat_ioctl(bdev, mode, cmd, arg);
682681

0 commit comments

Comments
 (0)