]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
block: only restrict bio allocation gfp mask asked to block
authorChristoph Hellwig <hch@lst.de>
Wed, 15 Apr 2026 06:08:07 +0000 (08:08 +0200)
committerJens Axboe <axboe@kernel.dk>
Tue, 21 Apr 2026 17:42:12 +0000 (11:42 -0600)
If the caller is asking for a non-blocking allocation, we should not
further restrict the gfp mask, which just increases the likelihood
of failures.

Fixes: b520c4eef83d ("block: split bio_alloc_bioset more clearly into a fast and slowpath")
Reported-by: Shin'ichiro Kawasaki <shinichiro.kawasaki@wdc.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Link: https://patch.msgid.link/20260415060813.807659-3-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/bio.c

index 4d46af0cd25633b29fc97b1eaa6c30d25a24680c..b8972dba68a09060e29350972ea2271f39e82686 100644 (file)
@@ -544,7 +544,8 @@ struct bio *bio_alloc_bioset(struct block_device *bdev, unsigned short nr_vecs,
        if (WARN_ON_ONCE(!mempool_initialized(&bs->bvec_pool) && nr_vecs > 0))
                return NULL;
 
-       gfp = try_alloc_gfp(gfp);
+       if (saved_gfp & __GFP_DIRECT_RECLAIM)
+               gfp = try_alloc_gfp(gfp);
        if (bs->cache && nr_vecs <= BIO_INLINE_VECS) {
                /*
                 * Set REQ_ALLOC_CACHE even if no cached bio is available to