mirror of
https://github.com/torvalds/linux.git
synced 2026-04-18 06:44:00 -04:00
block: add a bio_submit_or_kill helper
Factor the common logic for the ioctl helpers to either submit a bio or end if the process is being killed. As this is now the only user of bio_await_chain, open code that. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Damien Le Moal <dlemoal@kernel.org> Link: https://patch.msgid.link/20260407140538.633364-5-hch@lst.de Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
committed by
Jens Axboe
parent
6fa747550e
commit
92c3737a24
23
block/bio.c
23
block/bio.c
@@ -1520,6 +1520,20 @@ static void bio_endio_cb(struct bio *bio, void *priv)
|
||||
bio_endio(bio);
|
||||
}
|
||||
|
||||
/*
|
||||
* Submit @bio synchronously, or call bio_endio on it if the current process
|
||||
* is being killed.
|
||||
*/
|
||||
int bio_submit_or_kill(struct bio *bio, unsigned int flags)
|
||||
{
|
||||
if ((flags & BLKDEV_ZERO_KILLABLE) && fatal_signal_pending(current)) {
|
||||
bio_await(bio, NULL, bio_endio_cb);
|
||||
return -EINTR;
|
||||
}
|
||||
|
||||
return submit_bio_wait(bio);
|
||||
}
|
||||
|
||||
/**
|
||||
* bdev_rw_virt - synchronously read into / write from kernel mapping
|
||||
* @bdev: block device to access
|
||||
@@ -1550,15 +1564,6 @@ int bdev_rw_virt(struct block_device *bdev, sector_t sector, void *data,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(bdev_rw_virt);
|
||||
|
||||
/*
|
||||
* bio_await_chain - ends @bio and waits for every chained bio to complete
|
||||
*/
|
||||
void bio_await_chain(struct bio *bio)
|
||||
{
|
||||
bio_await(bio, NULL, bio_endio_cb);
|
||||
bio_put(bio);
|
||||
}
|
||||
|
||||
void __bio_advance(struct bio *bio, unsigned bytes)
|
||||
{
|
||||
if (bio_integrity(bio))
|
||||
|
||||
@@ -155,13 +155,7 @@ static int blkdev_issue_write_zeroes(struct block_device *bdev, sector_t sector,
|
||||
__blkdev_issue_write_zeroes(bdev, sector, nr_sects, gfp, &bio,
|
||||
flags, limit);
|
||||
if (bio) {
|
||||
if ((flags & BLKDEV_ZERO_KILLABLE) &&
|
||||
fatal_signal_pending(current)) {
|
||||
bio_await_chain(bio);
|
||||
blk_finish_plug(&plug);
|
||||
return -EINTR;
|
||||
}
|
||||
ret = submit_bio_wait(bio);
|
||||
ret = bio_submit_or_kill(bio, flags);
|
||||
bio_put(bio);
|
||||
}
|
||||
blk_finish_plug(&plug);
|
||||
@@ -236,13 +230,7 @@ static int blkdev_issue_zero_pages(struct block_device *bdev, sector_t sector,
|
||||
blk_start_plug(&plug);
|
||||
__blkdev_issue_zero_pages(bdev, sector, nr_sects, gfp, &bio, flags);
|
||||
if (bio) {
|
||||
if ((flags & BLKDEV_ZERO_KILLABLE) &&
|
||||
fatal_signal_pending(current)) {
|
||||
bio_await_chain(bio);
|
||||
blk_finish_plug(&plug);
|
||||
return -EINTR;
|
||||
}
|
||||
ret = submit_bio_wait(bio);
|
||||
ret = bio_submit_or_kill(bio, flags);
|
||||
bio_put(bio);
|
||||
}
|
||||
blk_finish_plug(&plug);
|
||||
|
||||
@@ -55,7 +55,7 @@ bool __blk_freeze_queue_start(struct request_queue *q,
|
||||
struct task_struct *owner);
|
||||
int __bio_queue_enter(struct request_queue *q, struct bio *bio);
|
||||
void submit_bio_noacct_nocheck(struct bio *bio, bool split);
|
||||
void bio_await_chain(struct bio *bio);
|
||||
int bio_submit_or_kill(struct bio *bio, unsigned int flags);
|
||||
|
||||
static inline bool blk_try_enter_queue(struct request_queue *q, bool pm)
|
||||
{
|
||||
|
||||
@@ -153,13 +153,7 @@ static int blk_ioctl_discard(struct block_device *bdev, blk_mode_t mode,
|
||||
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;
|
||||
}
|
||||
while (!fatal_signal_pending(current)) {
|
||||
bio = blk_alloc_discard_bio(bdev, §or, &nr_sects,
|
||||
GFP_KERNEL);
|
||||
if (!bio)
|
||||
@@ -167,12 +161,11 @@ static int blk_ioctl_discard(struct block_device *bdev, blk_mode_t mode,
|
||||
prev = bio_chain_and_submit(prev, bio);
|
||||
}
|
||||
if (prev) {
|
||||
err = submit_bio_wait(prev);
|
||||
err = bio_submit_or_kill(prev, BLKDEV_ZERO_KILLABLE);
|
||||
if (err == -EOPNOTSUPP)
|
||||
err = 0;
|
||||
bio_put(prev);
|
||||
}
|
||||
out_unplug:
|
||||
blk_finish_plug(&plug);
|
||||
fail:
|
||||
filemap_invalidate_unlock(bdev->bd_mapping);
|
||||
|
||||
Reference in New Issue
Block a user