On Fri, Feb 26, 2021 at 10:32:50AM +1100, Stephen Rothwell wrote: > > > - return filemap_read(iocb, to, ret); > > > + if (iocb->ki_flags & IOCB_NOWAIT) > > > + iocb->ki_flags |= IOCB_NOIO; > > > + > > > - ret = generic_file_buffered_read(iocb, to, ret); > > > ++ ret = filemap_read(iocb, to, ret); > > > + > > > + if (iocb->ki_flags & IOCB_NOWAIT) { > > > + iocb->ki_flags &= ~IOCB_NOIO; > > > + if (ret == 0) > > > + ret = -EAGAIN; > > > + } > > > + > > > + return ret; > > > } I think the above code looks completely bogus. Instead whatever code in btrfs hecks for IOCB_NOIO to avoid blocking readahead should also check IOCB_NOWAIT.