Skip to content

Commit

Permalink
mm: mark async iocb read as NOWAIT once some data has been copied
Browse files Browse the repository at this point in the history
Once we've copied some data for an iocb that is marked with IOCB_WAITQ,
we should no longer attempt to async lock a new page. Instead make sure
we return the copied amount, and let the caller retry, instead of
returning -EIOCBQUEUED for a new page.

This should only be possible with read-ahead disabled on the below
device, and multiple threads racing on the same file. Haven't been able
to reproduce on anything else.

Cc: [email protected] # v5.9
Fixes: 1a0a785 ("mm: support async buffered reads in generic_file_buffered_read()")
Reported-by: Kent Overstreet <[email protected]>
Signed-off-by: Jens Axboe <[email protected]>
  • Loading branch information
axboe committed Oct 17, 2020
1 parent 58852d4 commit 13bd691
Showing 1 changed file with 8 additions and 0 deletions.
8 changes: 8 additions & 0 deletions mm/filemap.c
Original file line number Diff line number Diff line change
Expand Up @@ -2199,6 +2199,14 @@ ssize_t generic_file_buffered_read(struct kiocb *iocb,
last_index = (*ppos + iter->count + PAGE_SIZE-1) >> PAGE_SHIFT;
offset = *ppos & ~PAGE_MASK;

/*
* If we've already successfully copied some data, then we
* can no longer safely return -EIOCBQUEUED. Hence mark
* an async read NOWAIT at that point.
*/
if (written && (iocb->ki_flags & IOCB_WAITQ))
iocb->ki_flags |= IOCB_NOWAIT;

for (;;) {
struct page *page;
pgoff_t end_index;
Expand Down

0 comments on commit 13bd691

Please sign in to comment.