aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs/direct.c
diff options
context:
space:
mode:
authorTrond Myklebust <Trond.Myklebust@netapp.com>2012-05-01 12:49:58 -0400
committerTrond Myklebust <Trond.Myklebust@netapp.com>2012-05-01 15:42:22 -0400
commit4bd8b010136afa0df9122a08bad361686bda0a1d (patch)
treea23c23299e4468baa0927d44992d2bd9da59579c /fs/nfs/direct.c
parent25b11dcdbfcad69a5ec03265e2dce19e5eca936b (diff)
NFS: Simplify the nfs_read_completion functions
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com> Cc: Fred Isaman <iisaman@netapp.com>
Diffstat (limited to 'fs/nfs/direct.c')
-rw-r--r--fs/nfs/direct.c48
1 files changed, 20 insertions, 28 deletions
diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c
index f17e4695c842..aab3016c437c 100644
--- a/fs/nfs/direct.c
+++ b/fs/nfs/direct.c
@@ -243,36 +243,28 @@ static void nfs_direct_read_completion(struct nfs_pgio_header *hdr)
243 dreq->count += hdr->good_bytes; 243 dreq->count += hdr->good_bytes;
244 spin_unlock(&dreq->lock); 244 spin_unlock(&dreq->lock);
245 245
246 if (!test_bit(NFS_IOHDR_ERROR, &hdr->flags)) { 246 while (!list_empty(&hdr->pages)) {
247 while (!list_empty(&hdr->pages)) { 247 struct nfs_page *req = nfs_list_entry(hdr->pages.next);
248 struct nfs_page *req = nfs_list_entry(hdr->pages.next); 248 struct page *page = req->wb_page;
249 struct page *page = req->wb_page; 249
250 250 if (test_bit(NFS_IOHDR_EOF, &hdr->flags)) {
251 if (test_bit(NFS_IOHDR_EOF, &hdr->flags)) { 251 if (bytes > hdr->good_bytes)
252 if (bytes > hdr->good_bytes) 252 zero_user(page, 0, PAGE_SIZE);
253 zero_user(page, 0, PAGE_SIZE); 253 else if (hdr->good_bytes - bytes < PAGE_SIZE)
254 else if (hdr->good_bytes - bytes < PAGE_SIZE) 254 zero_user_segment(page,
255 zero_user_segment(page, 255 hdr->good_bytes & ~PAGE_MASK,
256 hdr->good_bytes & ~PAGE_MASK, 256 PAGE_SIZE);
257 PAGE_SIZE);
258 }
259 bytes += req->wb_bytes;
260 nfs_list_remove_request(req);
261 if (!PageCompound(page))
262 set_page_dirty(page);
263 nfs_direct_readpage_release(req);
264 } 257 }
265 } else { 258 if (!PageCompound(page)) {
266 while (!list_empty(&hdr->pages)) { 259 if (test_bit(NFS_IOHDR_ERROR, &hdr->flags)) {
267 struct nfs_page *req = nfs_list_entry(hdr->pages.next); 260 if (bytes < hdr->good_bytes)
268 261 set_page_dirty(page);
269 if (bytes < hdr->good_bytes) 262 } else
270 if (!PageCompound(req->wb_page)) 263 set_page_dirty(page);
271 set_page_dirty(req->wb_page);
272 bytes += req->wb_bytes;
273 nfs_list_remove_request(req);
274 nfs_direct_readpage_release(req);
275 } 264 }
265 bytes += req->wb_bytes;
266 nfs_list_remove_request(req);
267 nfs_direct_readpage_release(req);
276 } 268 }
277out_put: 269out_put:
278 if (put_dreq(dreq)) 270 if (put_dreq(dreq))