Commit 92c3737a authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Jens Axboe
Browse files

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: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarDamien Le Moal <dlemoal@kernel.org>
Link: https://patch.msgid.link/20260407140538.633364-5-hch@lst.de


Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 6fa74755
Loading
Loading
Loading
Loading
+14 −9
Original line number Diff line number Diff line
@@ -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))
+2 −14
Original line number Diff line number Diff line
@@ -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);
+1 −1
Original line number Diff line number Diff line
@@ -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)
{
+2 −9
Original line number Diff line number Diff line
@@ -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, &sector, &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);