fs/buffer: use sleeping lookup in __getblk_slowpath()
authorDavidlohr Bueso <dave@stgolabs.net>
Thu, 15 May 2025 17:39:22 +0000 (10:39 -0700)
committerChristian Brauner <brauner@kernel.org>
Wed, 21 May 2025 07:34:28 +0000 (09:34 +0200)
Just as with the fast path, call the lookup variant depending
on the gfp flags.

Signed-off-by: Davidlohr Bueso <dave@stgolabs.net>
Link: https://lore.kernel.org/20250515173925.147823-2-dave@stgolabs.net
Reviewed-by: Jan Kara <jack@suse.cz>
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/buffer.c

index 7ba1807145aa8bacb80043402f6e329e73b7ece9..8563d949cd2c89bc936a85a54cc8955112d0aeef 100644 (file)
@@ -1122,6 +1122,8 @@ static struct buffer_head *
 __getblk_slow(struct block_device *bdev, sector_t block,
             unsigned size, gfp_t gfp)
 {
+       bool blocking = gfpflags_allow_blocking(gfp);
+
        /* Size must be multiple of hard sectorsize */
        if (unlikely(size & (bdev_logical_block_size(bdev)-1) ||
                        (size < 512 || size > PAGE_SIZE))) {
@@ -1137,7 +1139,10 @@ __getblk_slow(struct block_device *bdev, sector_t block,
        for (;;) {
                struct buffer_head *bh;
 
-               bh = __find_get_block(bdev, block, size);
+               if (blocking)
+                       bh = __find_get_block_nonatomic(bdev, block, size);
+               else
+                       bh = __find_get_block(bdev, block, size);
                if (bh)
                        return bh;