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?