]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
mpage: terminate read-ahead on read error
authorChi Zhiling <chizhiling@kylinos.cn>
Tue, 12 Aug 2025 07:22:23 +0000 (15:22 +0800)
committerAndrew Morton <akpm@linux-foundation.org>
Mon, 18 Aug 2025 05:09:07 +0000 (22:09 -0700)
For exFAT filesystems with 4MB read_ahead_size, removing the storage
device during read operations can delay EIO error reporting by several
minutes.  This occurs because the read-ahead implementation in mpage
doesn't handle errors.

Another reason for the delay is that the filesystem requires metadata to
issue file read request.  When the storage device is removed, the metadata
buffers are invalidated, causing mpage to repeatedly attempt to fetch
metadata during each get_block call.

The original purpose of this patch is terminate read ahead when we fail to
get metadata, to make the patch more generic, implement it by checking
folio status, instead of checking the return of get_block().

Link: https://lkml.kernel.org/r/20250812072225.181798-1-chizhiling@163.com
Signed-off-by: Chi Zhiling <chizhiling@kylinos.cn>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Christian Brauner <brauner@kernel.org>
Cc: Jan Kara <jack@suse.cz>
Cc: Matthew Wilcox (Oracle) <willy@infradead.org>
Cc: Namjae Jeon <linkinjeon@kernel.org>
Cc: Sungjong Seo <sj1557.seo@samsung.com>
Cc: Yuezhang Mo <Yuezhang.Mo@sony.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
fs/mpage.c

index c5fd821fd30e5349aeb838eaeebea6827d5b4443..b6510b8dfa2bd79da00cd8b451b6f884866d9d16 100644 (file)
@@ -369,6 +369,9 @@ void mpage_readahead(struct readahead_control *rac, get_block_t get_block)
                args.folio = folio;
                args.nr_pages = readahead_count(rac);
                args.bio = do_mpage_readpage(&args);
+               if (!folio_test_locked(folio) &&
+                   !folio_test_uptodate(folio))
+                       break;
        }
        if (args.bio)
                mpage_bio_submit_read(args.bio);