Skip to content

Commit 977b1ef

Browse files
committed
Merge tag 'block-6.9-20240420' of git://git.kernel.dk/linux
Pull block fixes from Jens Axboe: "Just two minor fixes that should go into the 6.9 kernel release, one fixing a regression with partition scanning errors, and one fixing a WARN_ON() that can get triggered if we race with a timer" * tag 'block-6.9-20240420' of git://git.kernel.dk/linux: blk-iocost: do not WARN if iocg was already offlined block: propagate partition scanning errors to the BLKRRPART ioctl
2 parents 39316e5 + 01bc4fd commit 977b1ef

File tree

4 files changed

+28
-13
lines changed

4 files changed

+28
-13
lines changed

block/bdev.c

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -645,6 +645,14 @@ static void blkdev_flush_mapping(struct block_device *bdev)
645645
bdev_write_inode(bdev);
646646
}
647647

648+
static void blkdev_put_whole(struct block_device *bdev)
649+
{
650+
if (atomic_dec_and_test(&bdev->bd_openers))
651+
blkdev_flush_mapping(bdev);
652+
if (bdev->bd_disk->fops->release)
653+
bdev->bd_disk->fops->release(bdev->bd_disk);
654+
}
655+
648656
static int blkdev_get_whole(struct block_device *bdev, blk_mode_t mode)
649657
{
650658
struct gendisk *disk = bdev->bd_disk;
@@ -663,20 +671,21 @@ static int blkdev_get_whole(struct block_device *bdev, blk_mode_t mode)
663671

664672
if (!atomic_read(&bdev->bd_openers))
665673
set_init_blocksize(bdev);
666-
if (test_bit(GD_NEED_PART_SCAN, &disk->state))
667-
bdev_disk_changed(disk, false);
668674
atomic_inc(&bdev->bd_openers);
675+
if (test_bit(GD_NEED_PART_SCAN, &disk->state)) {
676+
/*
677+
* Only return scanning errors if we are called from contexts
678+
* that explicitly want them, e.g. the BLKRRPART ioctl.
679+
*/
680+
ret = bdev_disk_changed(disk, false);
681+
if (ret && (mode & BLK_OPEN_STRICT_SCAN)) {
682+
blkdev_put_whole(bdev);
683+
return ret;
684+
}
685+
}
669686
return 0;
670687
}
671688

672-
static void blkdev_put_whole(struct block_device *bdev)
673-
{
674-
if (atomic_dec_and_test(&bdev->bd_openers))
675-
blkdev_flush_mapping(bdev);
676-
if (bdev->bd_disk->fops->release)
677-
bdev->bd_disk->fops->release(bdev->bd_disk);
678-
}
679-
680689
static int blkdev_get_part(struct block_device *part, blk_mode_t mode)
681690
{
682691
struct gendisk *disk = part->bd_disk;

block/blk-iocost.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1439,8 +1439,11 @@ static void iocg_pay_debt(struct ioc_gq *iocg, u64 abs_vpay,
14391439
lockdep_assert_held(&iocg->ioc->lock);
14401440
lockdep_assert_held(&iocg->waitq.lock);
14411441

1442-
/* make sure that nobody messed with @iocg */
1443-
WARN_ON_ONCE(list_empty(&iocg->active_list));
1442+
/*
1443+
* make sure that nobody messed with @iocg. Check iocg->pd.online
1444+
* to avoid warn when removing blkcg or disk.
1445+
*/
1446+
WARN_ON_ONCE(list_empty(&iocg->active_list) && iocg->pd.online);
14441447
WARN_ON_ONCE(iocg->inuse > 1);
14451448

14461449
iocg->abs_vdebt -= min(abs_vpay, iocg->abs_vdebt);

block/ioctl.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -563,7 +563,8 @@ static int blkdev_common_ioctl(struct block_device *bdev, blk_mode_t mode,
563563
return -EACCES;
564564
if (bdev_is_partition(bdev))
565565
return -EINVAL;
566-
return disk_scan_partitions(bdev->bd_disk, mode);
566+
return disk_scan_partitions(bdev->bd_disk,
567+
mode | BLK_OPEN_STRICT_SCAN);
567568
case BLKTRACESTART:
568569
case BLKTRACESTOP:
569570
case BLKTRACETEARDOWN:

include/linux/blkdev.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,8 @@ typedef unsigned int __bitwise blk_mode_t;
128128
#define BLK_OPEN_WRITE_IOCTL ((__force blk_mode_t)(1 << 4))
129129
/* open is exclusive wrt all other BLK_OPEN_WRITE opens to the device */
130130
#define BLK_OPEN_RESTRICT_WRITES ((__force blk_mode_t)(1 << 5))
131+
/* return partition scanning errors */
132+
#define BLK_OPEN_STRICT_SCAN ((__force blk_mode_t)(1 << 6))
131133

132134
struct gendisk {
133135
/*

0 commit comments

Comments
 (0)