diff options
author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2012-05-01 12:49:58 -0400 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2012-05-01 15:42:22 -0400 |
commit | 4bd8b010136afa0df9122a08bad361686bda0a1d (patch) | |
tree | a23c23299e4468baa0927d44992d2bd9da59579c /fs/nfs/read.c | |
parent | 25b11dcdbfcad69a5ec03265e2dce19e5eca936b (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.c | 44 |
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 | } |
211 | out: | 203 | out: |
212 | hdr->release(hdr); | 204 | hdr->release(hdr); |