From: Yu Kuai blk_alloc_discard_bio() and blk_rq_map_bio_alloc() can be used with non-blocking GFP masks. Their bio allocation now handles bdev association in nowait mode, so the helpers can pass the target bdev directly and avoid local open-coded association paths. The discard helper can also be reached from io_uring with GFP_NOWAIT. Keep its long-loop cond_resched() only for blocking callers. Signed-off-by: Yu Kuai --- block/blk-lib.c | 3 ++- block/blk-map.c | 7 +------ 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/block/blk-lib.c b/block/blk-lib.c index 688bc67cbf73..b5645f8f69b6 100644 --- a/block/blk-lib.c +++ b/block/blk-lib.c @@ -56,7 +56,8 @@ struct bio *blk_alloc_discard_bio(struct block_device *bdev, * discards (like mkfs). Be nice and allow us to schedule out to avoid * softlocking if preempt is disabled. */ - cond_resched(); + if (gfpflags_allow_blocking(gfp_mask)) + cond_resched(); return bio; } diff --git a/block/blk-map.c b/block/blk-map.c index 768549f19f97..75c7b864c15a 100644 --- a/block/blk-map.c +++ b/block/blk-map.c @@ -46,14 +46,9 @@ static struct bio *blk_rq_map_bio_alloc(struct request *rq, unsigned int nr_vecs, gfp_t gfp_mask) { struct block_device *bdev = rq->q->disk ? rq->q->disk->part0 : NULL; - struct bio *bio; - bio = bio_alloc_bioset(bdev, nr_vecs, rq->cmd_flags, gfp_mask, + return bio_alloc_bioset(bdev, nr_vecs, rq->cmd_flags, gfp_mask, &fs_bio_set); - if (!bio) - return NULL; - - return bio; } /** -- 2.51.0