Commit 6d74743b authored by Trond Myklebust's avatar Trond Myklebust

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: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
Cc: Fred Isaman <iisaman@netapp.com>
parent 3e9e0ca3
...@@ -268,10 +268,9 @@ static void nfs_direct_read_completion(struct nfs_pgio_header *hdr) ...@@ -268,10 +268,9 @@ static void nfs_direct_read_completion(struct nfs_pgio_header *hdr)
} }
bytes += req->wb_bytes; bytes += req->wb_bytes;
nfs_list_remove_request(req); nfs_list_remove_request(req);
nfs_direct_readpage_release(req);
if (!PageCompound(page)) if (!PageCompound(page))
set_page_dirty(page); set_page_dirty(page);
page_cache_release(page); nfs_direct_readpage_release(req);
} }
} else { } else {
while (!list_empty(&hdr->pages)) { while (!list_empty(&hdr->pages)) {
...@@ -281,7 +280,6 @@ static void nfs_direct_read_completion(struct nfs_pgio_header *hdr) ...@@ -281,7 +280,6 @@ static void nfs_direct_read_completion(struct nfs_pgio_header *hdr)
if (!PageCompound(req->wb_page)) if (!PageCompound(req->wb_page))
set_page_dirty(req->wb_page); set_page_dirty(req->wb_page);
bytes += req->wb_bytes; bytes += req->wb_bytes;
page_cache_release(req->wb_page);
nfs_list_remove_request(req); nfs_list_remove_request(req);
nfs_direct_readpage_release(req); nfs_direct_readpage_release(req);
} }
...@@ -375,8 +373,6 @@ static ssize_t nfs_direct_read_schedule_segment(struct nfs_pageio_descriptor *de ...@@ -375,8 +373,6 @@ static ssize_t nfs_direct_read_schedule_segment(struct nfs_pageio_descriptor *de
pagevec[i], pagevec[i],
pgbase, req_len); pgbase, req_len);
if (IS_ERR(req)) { if (IS_ERR(req)) {
nfs_direct_release_pages(pagevec + i,
npages - i);
result = PTR_ERR(req); result = PTR_ERR(req);
break; break;
} }
...@@ -385,8 +381,6 @@ static ssize_t nfs_direct_read_schedule_segment(struct nfs_pageio_descriptor *de ...@@ -385,8 +381,6 @@ static ssize_t nfs_direct_read_schedule_segment(struct nfs_pageio_descriptor *de
if (!nfs_pageio_add_request(desc, req)) { if (!nfs_pageio_add_request(desc, req)) {
result = desc->pg_error; result = desc->pg_error;
nfs_release_request(req); nfs_release_request(req);
nfs_direct_release_pages(pagevec + i,
npages - i);
break; break;
} }
pgbase = 0; pgbase = 0;
...@@ -396,6 +390,8 @@ static ssize_t nfs_direct_read_schedule_segment(struct nfs_pageio_descriptor *de ...@@ -396,6 +390,8 @@ static ssize_t nfs_direct_read_schedule_segment(struct nfs_pageio_descriptor *de
pos += req_len; pos += req_len;
count -= 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); } while (count != 0 && result >= 0);
kfree(pagevec); kfree(pagevec);
...@@ -509,7 +505,6 @@ static void nfs_direct_write_reschedule(struct nfs_direct_req *dreq) ...@@ -509,7 +505,6 @@ static void nfs_direct_write_reschedule(struct nfs_direct_req *dreq)
nfs_pageio_complete(&desc); nfs_pageio_complete(&desc);
while (!list_empty(&failed)) { while (!list_empty(&failed)) {
page_cache_release(req->wb_page);
nfs_release_request(req); nfs_release_request(req);
nfs_unlock_request(req); nfs_unlock_request(req);
} }
...@@ -542,10 +537,8 @@ static void nfs_direct_commit_complete(struct nfs_commit_data *data) ...@@ -542,10 +537,8 @@ static void nfs_direct_commit_complete(struct nfs_commit_data *data)
if (dreq->flags == NFS_ODIRECT_RESCHED_WRITES) { if (dreq->flags == NFS_ODIRECT_RESCHED_WRITES) {
/* Note the rewrite will go through mds */ /* Note the rewrite will go through mds */
nfs_mark_request_commit(req, NULL, &cinfo); nfs_mark_request_commit(req, NULL, &cinfo);
} else { } else
page_cache_release(req->wb_page);
nfs_release_request(req); nfs_release_request(req);
}
nfs_unlock_request(req); nfs_unlock_request(req);
} }
...@@ -678,8 +671,6 @@ static ssize_t nfs_direct_write_schedule_segment(struct nfs_pageio_descriptor *d ...@@ -678,8 +671,6 @@ static ssize_t nfs_direct_write_schedule_segment(struct nfs_pageio_descriptor *d
pagevec[i], pagevec[i],
pgbase, req_len); pgbase, req_len);
if (IS_ERR(req)) { if (IS_ERR(req)) {
nfs_direct_release_pages(pagevec + i,
npages - i);
result = PTR_ERR(req); result = PTR_ERR(req);
break; break;
} }
...@@ -690,8 +681,6 @@ static ssize_t nfs_direct_write_schedule_segment(struct nfs_pageio_descriptor *d ...@@ -690,8 +681,6 @@ static ssize_t nfs_direct_write_schedule_segment(struct nfs_pageio_descriptor *d
result = desc->pg_error; result = desc->pg_error;
nfs_unlock_request(req); nfs_unlock_request(req);
nfs_release_request(req); nfs_release_request(req);
nfs_direct_release_pages(pagevec + i,
npages - i);
break; break;
} }
pgbase = 0; pgbase = 0;
...@@ -701,6 +690,8 @@ static ssize_t nfs_direct_write_schedule_segment(struct nfs_pageio_descriptor *d ...@@ -701,6 +690,8 @@ static ssize_t nfs_direct_write_schedule_segment(struct nfs_pageio_descriptor *d
pos += req_len; pos += req_len;
count -= 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); } while (count != 0 && result >= 0);
kfree(pagevec); kfree(pagevec);
...@@ -763,7 +754,6 @@ static void nfs_direct_write_completion(struct nfs_pgio_header *hdr) ...@@ -763,7 +754,6 @@ static void nfs_direct_write_completion(struct nfs_pgio_header *hdr)
nfs_mark_request_commit(req, hdr->lseg, &cinfo); nfs_mark_request_commit(req, hdr->lseg, &cinfo);
break; break;
default: default:
page_cache_release(req->wb_page);
nfs_release_request(req); nfs_release_request(req);
} }
nfs_unlock_request(req); nfs_unlock_request(req);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment