Commit 87d1d7b6 authored by Matthew Wilcox (Oracle)'s avatar Matthew Wilcox (Oracle) Committed by Linus Torvalds
Browse files

mm/filemap: move the iocb checks into filemap_update_page

We don't need to give up when a non-blocking request sees a !Uptodate
page.  We may be able to satisfy the read from a partially-uptodate page.

Link: https://lkml.kernel.org/r/20210122160140.223228-13-willy@infradead.org


Signed-off-by: default avatarMatthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: default avatarKent Overstreet <kent.overstreet@gmail.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Cc: Miaohe Lin <linmiaohe@huawei.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 4612aeef
Loading
Loading
Loading
Loading
+10 −14
Original line number Diff line number Diff line
@@ -2240,15 +2240,16 @@ static int filemap_update_page(struct kiocb *iocb,
	struct inode *inode = mapping->host;
	int error;

	if (iocb->ki_flags & IOCB_WAITQ) {
		error = lock_page_async(page, iocb->ki_waitq);
		if (error)
			return error;
	} else {
	if (!trylock_page(page)) {
		if (iocb->ki_flags & (IOCB_NOWAIT | IOCB_NOIO))
			return -EAGAIN;
		if (!(iocb->ki_flags & IOCB_WAITQ)) {
			put_and_wait_on_page_locked(page, TASK_KILLABLE);
			return AOP_TRUNCATED_PAGE;
		}
		error = __lock_page_async(page, iocb->ki_waitq);
		if (error)
			return error;
	}

	if (!page->mapping)
@@ -2366,14 +2367,9 @@ static int filemap_get_pages(struct kiocb *iocb, struct iov_iter *iter,
		}

		if (!PageUptodate(page)) {
			if ((iocb->ki_flags & IOCB_NOWAIT) ||
			    ((iocb->ki_flags & IOCB_WAITQ) && pvec->nr > 1)) {
				put_page(page);
				pvec->nr--;
				err = -EAGAIN;
				goto err;
			}

			if ((iocb->ki_flags & IOCB_WAITQ) &&
			    pagevec_count(pvec) > 1)
				iocb->ki_flags |= IOCB_NOWAIT;
			err = filemap_update_page(iocb, mapping, iter, page,
					pg_pos, pg_count);
			if (err) {