mirror of
https://github.com/torvalds/linux.git
synced 2026-04-18 06:44:00 -04:00
Merge tag 'for-6.10/block-20240511' of git://git.kernel.dk/linux
Pull block updates from Jens Axboe: - Add a partscan attribute in sysfs, fixing an issue with systemd relying on an internal interface that went away. - Attempt #2 at making long running discards interruptible. The previous attempt went into 6.9, but we ended up mostly reverting it as it had issues. - Remove old ida_simple API in bcache - Support for zoned write plugging, greatly improving the performance on zoned devices. - Remove the old throttle low interface, which has been experimental since 2017 and never made it beyond that and isn't being used. - Remove page->index debugging checks in brd, as it hasn't caught anything and prepares us for removing in struct page. - MD pull request from Song - Don't schedule block workers on isolated CPUs * tag 'for-6.10/block-20240511' of git://git.kernel.dk/linux: (84 commits) blk-throttle: delay initialization until configuration blk-throttle: remove CONFIG_BLK_DEV_THROTTLING_LOW block: fix that util can be greater than 100% block: support to account io_ticks precisely block: add plug while submitting IO bcache: fix variable length array abuse in btree_iter bcache: Remove usage of the deprecated ida_simple_xx() API md: Revert "md: Fix overflow in is_mddev_idle" blk-lib: check for kill signal in ioctl BLKDISCARD block: add a bio_await_chain helper block: add a blk_alloc_discard_bio helper block: add a bio_chain_and_submit helper block: move discard checks into the ioctl handler block: remove the discard_granularity check in __blkdev_issue_discard block/ioctl: prefer different overflow check null_blk: Fix the WARNING: modpost: missing MODULE_DESCRIPTION() block: fix and simplify blkdevparts= cmdline parsing block: refine the EOF check in blkdev_iomap_begin block: add a partscan sysfs attribute for disks block: add a disk_has_partscan helper ...
This commit is contained in:
@@ -33,7 +33,7 @@ static int blkpg_do_ioctl(struct block_device *bdev,
|
||||
if (op == BLKPG_DEL_PARTITION)
|
||||
return bdev_del_partition(disk, p.pno);
|
||||
|
||||
if (p.start < 0 || p.length <= 0 || p.start + p.length < 0)
|
||||
if (p.start < 0 || p.length <= 0 || LLONG_MAX - p.length < p.start)
|
||||
return -EINVAL;
|
||||
/* Check that the partition is aligned to the block size */
|
||||
if (!IS_ALIGNED(p.start | p.length, bdev_logical_block_size(bdev)))
|
||||
@@ -95,9 +95,12 @@ static int compat_blkpg_ioctl(struct block_device *bdev,
|
||||
static int blk_ioctl_discard(struct block_device *bdev, blk_mode_t mode,
|
||||
unsigned long arg)
|
||||
{
|
||||
uint64_t range[2];
|
||||
uint64_t start, len, end;
|
||||
unsigned int bs_mask = bdev_logical_block_size(bdev) - 1;
|
||||
struct inode *inode = bdev->bd_inode;
|
||||
uint64_t range[2], start, len, end;
|
||||
struct bio *prev = NULL, *bio;
|
||||
sector_t sector, nr_sects;
|
||||
struct blk_plug plug;
|
||||
int err;
|
||||
|
||||
if (!(mode & BLK_OPEN_WRITE))
|
||||
@@ -105,6 +108,8 @@ static int blk_ioctl_discard(struct block_device *bdev, blk_mode_t mode,
|
||||
|
||||
if (!bdev_max_discard_sectors(bdev))
|
||||
return -EOPNOTSUPP;
|
||||
if (bdev_read_only(bdev))
|
||||
return -EPERM;
|
||||
|
||||
if (copy_from_user(range, (void __user *)arg, sizeof(range)))
|
||||
return -EFAULT;
|
||||
@@ -112,9 +117,9 @@ static int blk_ioctl_discard(struct block_device *bdev, blk_mode_t mode,
|
||||
start = range[0];
|
||||
len = range[1];
|
||||
|
||||
if (start & 511)
|
||||
if (!len)
|
||||
return -EINVAL;
|
||||
if (len & 511)
|
||||
if ((start | len) & bs_mask)
|
||||
return -EINVAL;
|
||||
|
||||
if (check_add_overflow(start, len, &end) ||
|
||||
@@ -125,7 +130,32 @@ static int blk_ioctl_discard(struct block_device *bdev, blk_mode_t mode,
|
||||
err = truncate_bdev_range(bdev, mode, start, start + len - 1);
|
||||
if (err)
|
||||
goto fail;
|
||||
err = blkdev_issue_discard(bdev, start >> 9, len >> 9, GFP_KERNEL);
|
||||
|
||||
sector = start >> SECTOR_SHIFT;
|
||||
nr_sects = len >> SECTOR_SHIFT;
|
||||
|
||||
blk_start_plug(&plug);
|
||||
while (1) {
|
||||
if (fatal_signal_pending(current)) {
|
||||
if (prev)
|
||||
bio_await_chain(prev);
|
||||
err = -EINTR;
|
||||
goto out_unplug;
|
||||
}
|
||||
bio = blk_alloc_discard_bio(bdev, §or, &nr_sects,
|
||||
GFP_KERNEL);
|
||||
if (!bio)
|
||||
break;
|
||||
prev = bio_chain_and_submit(prev, bio);
|
||||
}
|
||||
if (prev) {
|
||||
err = submit_bio_wait(prev);
|
||||
if (err == -EOPNOTSUPP)
|
||||
err = 0;
|
||||
bio_put(prev);
|
||||
}
|
||||
out_unplug:
|
||||
blk_finish_plug(&plug);
|
||||
fail:
|
||||
filemap_invalidate_unlock(inode->i_mapping);
|
||||
return err;
|
||||
|
||||
Reference in New Issue
Block a user