On Tue, 12 Aug 2025 15:22:23 +0800 Chi Zhiling <chizhiling@xxxxxxx> wrote: > From: Chi Zhiling <chizhiling@xxxxxxxxxx> > > 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(). > > ... > > --- a/fs/mpage.c > +++ b/fs/mpage.c > @@ -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); So... this is what the fs does when the device is unplugged? Synchronously return an unlocked !uptodate folio? Or is this specific to FAT? I think a comment here telling readers why we're doing this would be helpful. It isn't obvious that we're dealing with e removed device! Also, boy this is old code. Basically akpm code from pre-git times. It was quite innovative back then, but everybody who understood it has since moved on, got senile or probably died. Oh well. Also, that if statement didn't need a newline ;)