From 6d74743b088d116e31fe1b73f47e782ee2016b94 Mon Sep 17 00:00:00 2001 From: Trond Myklebust Date: Mon, 30 Apr 2012 13:27:31 -0400 Subject: NFS: Simplify O_DIRECT page referencing The O_DIRECT code shouldn't need to hold 2 references to each page. The reference held by the struct nfs_page should suffice. Signed-off-by: Trond Myklebust Cc: Fred Isaman --- fs/nfs/direct.c | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) (limited to 'fs/nfs/direct.c') diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c index af02bde7741..78d1ead8bc3 100644 --- a/fs/nfs/direct.c +++ b/fs/nfs/direct.c @@ -268,10 +268,9 @@ static void nfs_direct_read_completion(struct nfs_pgio_header *hdr) } bytes += req->wb_bytes; nfs_list_remove_request(req); - nfs_direct_readpage_release(req); if (!PageCompound(page)) set_page_dirty(page); - page_cache_release(page); + nfs_direct_readpage_release(req); } } else { while (!list_empty(&hdr->pages)) { @@ -281,7 +280,6 @@ static void nfs_direct_read_completion(struct nfs_pgio_header *hdr) if (!PageCompound(req->wb_page)) set_page_dirty(req->wb_page); bytes += req->wb_bytes; - page_cache_release(req->wb_page); nfs_list_remove_request(req); nfs_direct_readpage_release(req); } @@ -375,8 +373,6 @@ static ssize_t nfs_direct_read_schedule_segment(struct nfs_pageio_descriptor *de pagevec[i], pgbase, req_len); if (IS_ERR(req)) { - nfs_direct_release_pages(pagevec + i, - npages - i); result = PTR_ERR(req); break; } @@ -385,8 +381,6 @@ static ssize_t nfs_direct_read_schedule_segment(struct nfs_pageio_descriptor *de if (!nfs_pageio_add_request(desc, req)) { result = desc->pg_error; nfs_release_request(req); - nfs_direct_release_pages(pagevec + i, - npages - i); break; } pgbase = 0; @@ -396,6 +390,8 @@ static ssize_t nfs_direct_read_schedule_segment(struct nfs_pageio_descriptor *de pos += req_len; count -= req_len; } + /* The nfs_page now hold references to these pages */ + nfs_direct_release_pages(pagevec, npages); } while (count != 0 && result >= 0); kfree(pagevec); @@ -509,7 +505,6 @@ static void nfs_direct_write_reschedule(struct nfs_direct_req *dreq) nfs_pageio_complete(&desc); while (!list_empty(&failed)) { - page_cache_release(req->wb_page); nfs_release_request(req); nfs_unlock_request(req); } @@ -542,10 +537,8 @@ static void nfs_direct_commit_complete(struct nfs_commit_data *data) if (dreq->flags == NFS_ODIRECT_RESCHED_WRITES) { /* Note the rewrite will go through mds */ nfs_mark_request_commit(req, NULL, &cinfo); - } else { - page_cache_release(req->wb_page); + } else nfs_release_request(req); - } nfs_unlock_request(req); } @@ -678,8 +671,6 @@ static ssize_t nfs_direct_write_schedule_segment(struct nfs_pageio_descriptor *d pagevec[i], pgbase, req_len); if (IS_ERR(req)) { - nfs_direct_release_pages(pagevec + i, - npages - i); result = PTR_ERR(req); break; } @@ -690,8 +681,6 @@ static ssize_t nfs_direct_write_schedule_segment(struct nfs_pageio_descriptor *d result = desc->pg_error; nfs_unlock_request(req); nfs_release_request(req); - nfs_direct_release_pages(pagevec + i, - npages - i); break; } pgbase = 0; @@ -701,6 +690,8 @@ static ssize_t nfs_direct_write_schedule_segment(struct nfs_pageio_descriptor *d pos += req_len; count -= req_len; } + /* The nfs_page now hold references to these pages */ + nfs_direct_release_pages(pagevec, npages); } while (count != 0 && result >= 0); kfree(pagevec); @@ -763,7 +754,6 @@ static void nfs_direct_write_completion(struct nfs_pgio_header *hdr) nfs_mark_request_commit(req, hdr->lseg, &cinfo); break; default: - page_cache_release(req->wb_page); nfs_release_request(req); } nfs_unlock_request(req); -- cgit v1.2.3