On Tue, Dec 17, 2019 at 07:39:43AM -0700, Jens Axboe wrote: > +static void buffered_put_page(struct page *page, bool clear_mapping) > +{ > + if (clear_mapping) > + page->mapping = NULL; > + put_page(page); > +} I'm not a huge fan of the variable name 'clear_mapping'. It describes what it does rather than why it does it. So maybe 'drop_immediate'? Or 'uncached'? > if (!page) { > if (iocb->ki_flags & IOCB_NOWAIT) > goto would_block; > + /* UNCACHED implies no read-ahead */ > + if (iocb->ki_flags & IOCB_UNCACHED) { > + did_dio_begin = true; > + /* block truncate for UNCACHED reads */ > + inode_dio_begin(inode); I think this needs to be: if (!did_dio_begin) inode_dio_begin(inode); did_dio_begin = true; otherwise inode->i_dio_count is going to be increased once per uncached page. Do you have a test in your test-suite that does I/O to more than one page at a time?