diff options
author | Jérôme Glisse <jglisse@redhat.com> | 2019-04-17 13:01:51 -0400 |
---|---|---|
committer | Jérôme Glisse <jglisse@redhat.com> | 2019-04-17 15:07:09 -0400 |
commit | bd31fd29a07ef4a0f41e03731baff23543b77423 (patch) | |
tree | 7a630544eb57c59cf5496ca3045190fb94683bc3 | |
parent | 003bb2173e783602faa165f233015e03fec907a5 (diff) |
fs/nfs: differentiate GUPed pages from iov_iter_get_pages*()
We want to handle differently pages that are coming from GUP
(get_user_pages*()) as they will need to be release through
new put_user_page() function and not with put_page().
Signed-off-by: Jérôme Glisse <jglisse@redhat.com>
Cc: linux-fsdevel@vger.kernel.org
Cc: linux-block@vger.kernel.org
Cc: linux-mm@kvack.org
Cc: linux-nfs@vger.kernel.org
Cc: John Hubbard <jhubbard@nvidia.com>
Cc: Jan Kara <jack@suse.cz>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Alexander Viro <viro@zeniv.linux.org.uk>
Cc: Johannes Thumshirn <jthumshirn@suse.de>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Jens Axboe <axboe@kernel.dk>
Cc: Ming Lei <ming.lei@redhat.com>
Cc: Dave Chinner <david@fromorbit.com>
Cc: Jason Gunthorpe <jgg@ziepe.ca>
Cc: Matthew Wilcox <willy@infradead.org>
Cc: Boaz Harrosh <boaz@plexistor.com>
Cc: Trond Myklebust <trond.myklebust@hammerspace.com>
Cc: Anna Schumaker <anna.schumaker@netapp.com>
-rw-r--r-- | fs/nfs/direct.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c index 0fd811ac08b5..066cbbc30381 100644 --- a/fs/nfs/direct.c +++ b/fs/nfs/direct.c @@ -511,7 +511,10 @@ static ssize_t nfs_direct_read_schedule_iovec(struct nfs_direct_req *dreq, pos += req_len; dreq->bytes_left -= req_len; } - nfs_direct_release_pages(pagevec, npages); + if (iov_iter_get_pages_use_gup(iter)) + put_user_pages(pagevec, npages); + else + nfs_direct_release_pages(pagevec, npages); kvfree(pagevec); if (result < 0) break; @@ -927,7 +930,10 @@ static ssize_t nfs_direct_write_schedule_iovec(struct nfs_direct_req *dreq, pos += req_len; dreq->bytes_left -= req_len; } - nfs_direct_release_pages(pagevec, npages); + if (iov_iter_get_pages_use_gup(iter)) + put_user_pages(pagevec, npages); + else + nfs_direct_release_pages(pagevec, npages); kvfree(pagevec); if (result < 0) break; |