From: Yu Kuai <[email protected]>

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 <[email protected]>
---
 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


Reply via email to