aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs/read.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/read.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/read.c')
-rw-r--r--fs/nfs/read.c44
1 files changed, 18 insertions, 26 deletions
diff --git a/fs/nfs/read.c b/fs/nfs/read.c
index 1961a192f1cb..37c9eb2930b0 100644
--- a/fs/nfs/read.c
+++ b/fs/nfs/read.c
@@ -179,34 +179,26 @@ static void nfs_read_completion(struct nfs_pgio_header *hdr)
179 179
180 if (test_bit(NFS_IOHDR_REDO, &hdr->flags)) 180 if (test_bit(NFS_IOHDR_REDO, &hdr->flags))
181 goto out; 181 goto out;
182 if (!test_bit(NFS_IOHDR_ERROR, &hdr->flags)) { 182 while (!list_empty(&hdr->pages)) {
183 while (!list_empty(&hdr->pages)) { 183 struct nfs_page *req = nfs_list_entry(hdr->pages.next);
184 struct nfs_page *req = nfs_list_entry(hdr->pages.next); 184 struct page *page = req->wb_page;
185 struct page *page = req->wb_page; 185
186 186 if (test_bit(NFS_IOHDR_EOF, &hdr->flags)) {
187 if (test_bit(NFS_IOHDR_EOF, &hdr->flags)) { 187 if (bytes > hdr->good_bytes)
188 if (bytes > hdr->good_bytes) 188 zero_user(page, 0, PAGE_SIZE);
189 zero_user(page, 0, PAGE_SIZE); 189 else if (hdr->good_bytes - bytes < PAGE_SIZE)
190 else if (hdr->good_bytes - bytes < PAGE_SIZE) 190 zero_user_segment(page,
191 zero_user_segment(page, 191 hdr->good_bytes & ~PAGE_MASK,
192 hdr->good_bytes & ~PAGE_MASK, 192 PAGE_SIZE);
193 PAGE_SIZE);
194 }
195 SetPageUptodate(page);
196 nfs_list_remove_request(req);
197 nfs_readpage_release(req);
198 bytes += PAGE_SIZE;
199 } 193 }
200 } else { 194 bytes += req->wb_bytes;
201 while (!list_empty(&hdr->pages)) { 195 if (test_bit(NFS_IOHDR_ERROR, &hdr->flags)) {
202 struct nfs_page *req = nfs_list_entry(hdr->pages.next);
203
204 bytes += req->wb_bytes;
205 if (bytes <= hdr->good_bytes) 196 if (bytes <= hdr->good_bytes)
206 SetPageUptodate(req->wb_page); 197 SetPageUptodate(page);
207 nfs_list_remove_request(req); 198 } else
208 nfs_readpage_release(req); 199 SetPageUptodate(page);
209 } 200 nfs_list_remove_request(req);
201 nfs_readpage_release(req);
210 } 202 }
211out: 203out:
212 hdr->release(hdr); 204 hdr->release(hdr);