From: Christoph Hellwig <hch@lst.de>
To: "Matthew Wilcox (Oracle)" <willy@infradead.org>
Cc: linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, hch@lst.de,
kent.overstreet@gmail.com
Subject: Re: [PATCH v2 11/18] mm/filemap: Convert filemap_update_page to return an errno
Date: Fri, 6 Nov 2020 09:37:46 +0100 [thread overview]
Message-ID: <20201106083746.GA720@lst.de> (raw)
In-Reply-To: <20201106081420.GF31585@lst.de>
On Fri, Nov 06, 2020 at 09:14:20AM +0100, Christoph Hellwig wrote:
> We could still consolidate the page unlocking by having another label.
> Or even better move the put_page into the caller like I did in my
> series, which would conceputally fit in pretty nicely here:
FYI, this is what we should do for putting the page (on top of your
whole series), which also catches the leak for the readahead NOIO case:
diff --git a/mm/filemap.c b/mm/filemap.c
index 500e9fd4232cf9..dacee60b92d3d9 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -2268,40 +2268,35 @@ static int filemap_update_page(struct kiocb *iocb,
struct address_space *mapping, struct iov_iter *iter,
struct page *page)
{
- int error = -EAGAIN;
+ int error = 0;
if (!trylock_page(page)) {
if (iocb->ki_flags & (IOCB_NOWAIT | IOCB_NOIO))
- goto error;
+ 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)
- goto error;
+ return error;
}
- error = AOP_TRUNCATED_PAGE;
- if (!page->mapping)
- goto unlock;
- if (filemap_range_uptodate(iocb, mapping, iter, page)) {
+ if (!page->mapping) {
unlock_page(page);
- return 0;
+ put_page(page);
+ return AOP_TRUNCATED_PAGE;
}
- error = -EAGAIN;
- if (iocb->ki_flags & (IOCB_NOIO | IOCB_NOWAIT | IOCB_WAITQ))
- goto unlock;
+ if (!filemap_range_uptodate(iocb, mapping, iter, page)) {
+ error = -EAGAIN;
+ if (iocb->ki_flags & (IOCB_NOIO | IOCB_NOWAIT | IOCB_WAITQ))
+ goto unlock;
+ return filemap_read_page(iocb->ki_filp, mapping, page);
+ }
- error = filemap_read_page(iocb->ki_filp, mapping, page);
- if (error)
- goto error;
- return 0;
unlock:
unlock_page(page);
-error:
- put_page(page);
return error;
}
@@ -2396,8 +2391,9 @@ static int filemap_get_pages(struct kiocb *iocb, struct iov_iter *iter,
return 0;
err:
- pvec->nr--;
- if (likely(pvec->nr))
+ if (err < 0)
+ put_page(page);
+ if (likely(--pvec->nr))
return 0;
if (err == AOP_TRUNCATED_PAGE)
goto retry;
next prev parent reply other threads:[~2020-11-06 8:37 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-11-04 20:42 [PATCH v2 00/18] Refactor generic_file_buffered_read Matthew Wilcox (Oracle)
2020-11-04 20:42 ` [PATCH v2 01/18] mm/filemap: Rename generic_file_buffered_read subfunctions Matthew Wilcox (Oracle)
2020-11-06 8:07 ` Christoph Hellwig
2020-11-04 20:42 ` [PATCH v2 02/18] mm/filemap: Remove dynamically allocated array from filemap_read Matthew Wilcox (Oracle)
2020-11-04 21:30 ` Kent Overstreet
2020-11-04 21:43 ` Amy Parker
2020-11-05 0:13 ` Matthew Wilcox
2020-11-06 8:08 ` Christoph Hellwig
2020-11-06 12:30 ` [PATCH 1/4] pagevec: Allow pagevecs to be different sizes Matthew Wilcox (Oracle)
2020-11-06 12:30 ` [PATCH 2/4] pagevec: Increase the size of LRU pagevecs Matthew Wilcox (Oracle)
2020-11-06 12:30 ` [PATCH 3/4] pagevec: Add dynamically allocated pagevecs Matthew Wilcox (Oracle)
2020-11-06 12:30 ` [PATCH 4/4] mm/filemap: Use a dynamically allocated pagevec in filemap_read Matthew Wilcox (Oracle)
2020-11-07 17:08 ` [PATCH 1/4] pagevec: Allow pagevecs to be different sizes Kent Overstreet
2020-11-07 17:20 ` Matthew Wilcox
2020-11-05 4:52 ` [PATCH v2 02/18] mm/filemap: Remove dynamically allocated array from filemap_read Matthew Wilcox
2020-11-06 8:07 ` Christoph Hellwig
2020-11-04 20:42 ` [PATCH v2 03/18] mm/filemap: Convert filemap_get_pages to take a pagevec Matthew Wilcox (Oracle)
2020-11-06 8:08 ` Christoph Hellwig
2020-11-04 20:42 ` [PATCH v2 04/18] mm/filemap: Use THPs in generic_file_buffered_read Matthew Wilcox (Oracle)
2020-11-04 20:42 ` [PATCH v2 05/18] mm/filemap: Pass a sleep state to put_and_wait_on_page_locked Matthew Wilcox (Oracle)
2020-11-04 20:42 ` [PATCH v2 06/18] mm/filemap: Support readpage splitting a page Matthew Wilcox (Oracle)
2020-11-04 20:42 ` [PATCH v2 07/18] mm/filemap: Inline __wait_on_page_locked_async into caller Matthew Wilcox (Oracle)
2020-11-04 20:42 ` [PATCH v2 08/18] mm/filemap: Don't call ->readpage if IOCB_WAITQ is set Matthew Wilcox (Oracle)
2020-11-04 20:42 ` [PATCH v2 09/18] mm/filemap: Change filemap_read_page calling conventions Matthew Wilcox (Oracle)
2020-11-06 8:11 ` Christoph Hellwig
2020-11-04 20:42 ` [PATCH v2 10/18] mm/filemap: Change filemap_create_page " Matthew Wilcox (Oracle)
2020-11-04 20:42 ` [PATCH v2 11/18] mm/filemap: Convert filemap_update_page to return an errno Matthew Wilcox (Oracle)
2020-11-06 8:14 ` Christoph Hellwig
2020-11-06 8:37 ` Christoph Hellwig [this message]
2020-11-09 13:29 ` Matthew Wilcox
2020-11-04 20:42 ` [PATCH v2 12/18] mm/filemap: Move the iocb checks into filemap_update_page Matthew Wilcox (Oracle)
2020-11-04 20:42 ` [PATCH v2 13/18] mm/filemap: Add filemap_range_uptodate Matthew Wilcox (Oracle)
2020-11-06 8:16 ` Christoph Hellwig
2020-11-04 20:42 ` [PATCH v2 14/18] mm/filemap: Split filemap_readahead out of filemap_get_pages Matthew Wilcox (Oracle)
2020-11-06 8:19 ` Christoph Hellwig
2020-11-04 20:42 ` [PATCH v2 15/18] mm/filemap: Restructure filemap_get_pages Matthew Wilcox (Oracle)
2020-11-06 8:21 ` Christoph Hellwig
2020-11-04 20:42 ` [PATCH v2 16/18] mm/filemap: Don't relock the page after calling readpage Matthew Wilcox (Oracle)
2020-11-06 8:21 ` Christoph Hellwig
2020-11-04 20:42 ` [PATCH v2 17/18] mm/filemap: Rename generic_file_buffered_read to filemap_read Matthew Wilcox (Oracle)
2020-11-04 20:42 ` [PATCH v2 18/18] mm/filemap: Simplify generic_file_read_iter Matthew Wilcox (Oracle)
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20201106083746.GA720@lst.de \
--to=hch@lst.de \
--cc=kent.overstreet@gmail.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=willy@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.