read.c (fdd1e74c89fe39259a29c494209abad63ff76f82) | read.c (dbae4c73f08b8a7980cc912954ade3d4c1fb6147) |
---|---|
1/* 2 * linux/fs/nfs/read.c 3 * 4 * Block I/O for NFS 5 * 6 * Partial copy of Linus' read cache modifications to fs/nfs/file.c 7 * modified for async RPC by okir@monad.swb.de 8 */ --- 139 unchanged lines hidden (view full) --- 148 (long long)req_offset(req)); 149 nfs_clear_request(req); 150 nfs_release_request(req); 151} 152 153/* 154 * Set up the NFS read request struct 155 */ | 1/* 2 * linux/fs/nfs/read.c 3 * 4 * Block I/O for NFS 5 * 6 * Partial copy of Linus' read cache modifications to fs/nfs/file.c 7 * modified for async RPC by okir@monad.swb.de 8 */ --- 139 unchanged lines hidden (view full) --- 148 (long long)req_offset(req)); 149 nfs_clear_request(req); 150 nfs_release_request(req); 151} 152 153/* 154 * Set up the NFS read request struct 155 */ |
156static void nfs_read_rpcsetup(struct nfs_page *req, struct nfs_read_data *data, | 156static int nfs_read_rpcsetup(struct nfs_page *req, struct nfs_read_data *data, |
157 const struct rpc_call_ops *call_ops, 158 unsigned int count, unsigned int offset) 159{ 160 struct inode *inode = req->wb_context->path.dentry->d_inode; 161 int swap_flags = IS_SWAPFILE(inode) ? NFS_RPC_SWAPFLAGS : 0; 162 struct rpc_task *task; 163 struct rpc_message msg = { 164 .rpc_argp = &data->args, --- 32 unchanged lines hidden (view full) --- 197 dprintk("NFS: %5u initiated read call (req %s/%Ld, %u bytes @ offset %Lu)\n", 198 data->task.tk_pid, 199 inode->i_sb->s_id, 200 (long long)NFS_FILEID(inode), 201 count, 202 (unsigned long long)data->args.offset); 203 204 task = rpc_run_task(&task_setup_data); | 157 const struct rpc_call_ops *call_ops, 158 unsigned int count, unsigned int offset) 159{ 160 struct inode *inode = req->wb_context->path.dentry->d_inode; 161 int swap_flags = IS_SWAPFILE(inode) ? NFS_RPC_SWAPFLAGS : 0; 162 struct rpc_task *task; 163 struct rpc_message msg = { 164 .rpc_argp = &data->args, --- 32 unchanged lines hidden (view full) --- 197 dprintk("NFS: %5u initiated read call (req %s/%Ld, %u bytes @ offset %Lu)\n", 198 data->task.tk_pid, 199 inode->i_sb->s_id, 200 (long long)NFS_FILEID(inode), 201 count, 202 (unsigned long long)data->args.offset); 203 204 task = rpc_run_task(&task_setup_data); |
205 if (!IS_ERR(task)) 206 rpc_put_task(task); | 205 if (IS_ERR(task)) 206 return PTR_ERR(task); 207 rpc_put_task(task); 208 return 0; |
207} 208 209static void 210nfs_async_read_error(struct list_head *head) 211{ 212 struct nfs_page *req; 213 214 while (!list_empty(head)) { --- 20 unchanged lines hidden (view full) --- 235static int nfs_pagein_multi(struct inode *inode, struct list_head *head, unsigned int npages, size_t count, int flags) 236{ 237 struct nfs_page *req = nfs_list_entry(head->next); 238 struct page *page = req->wb_page; 239 struct nfs_read_data *data; 240 size_t rsize = NFS_SERVER(inode)->rsize, nbytes; 241 unsigned int offset; 242 int requests = 0; | 209} 210 211static void 212nfs_async_read_error(struct list_head *head) 213{ 214 struct nfs_page *req; 215 216 while (!list_empty(head)) { --- 20 unchanged lines hidden (view full) --- 237static int nfs_pagein_multi(struct inode *inode, struct list_head *head, unsigned int npages, size_t count, int flags) 238{ 239 struct nfs_page *req = nfs_list_entry(head->next); 240 struct page *page = req->wb_page; 241 struct nfs_read_data *data; 242 size_t rsize = NFS_SERVER(inode)->rsize, nbytes; 243 unsigned int offset; 244 int requests = 0; |
245 int ret = 0; |
|
243 LIST_HEAD(list); 244 245 nfs_list_remove_request(req); 246 247 nbytes = count; 248 do { 249 size_t len = min(nbytes,rsize); 250 --- 5 unchanged lines hidden (view full) --- 256 nbytes -= len; 257 } while(nbytes != 0); 258 atomic_set(&req->wb_complete, requests); 259 260 ClearPageError(page); 261 offset = 0; 262 nbytes = count; 263 do { | 246 LIST_HEAD(list); 247 248 nfs_list_remove_request(req); 249 250 nbytes = count; 251 do { 252 size_t len = min(nbytes,rsize); 253 --- 5 unchanged lines hidden (view full) --- 259 nbytes -= len; 260 } while(nbytes != 0); 261 atomic_set(&req->wb_complete, requests); 262 263 ClearPageError(page); 264 offset = 0; 265 nbytes = count; 266 do { |
267 int ret2; 268 |
|
264 data = list_entry(list.next, struct nfs_read_data, pages); 265 list_del_init(&data->pages); 266 267 data->pagevec[0] = page; 268 269 if (nbytes < rsize) 270 rsize = nbytes; | 269 data = list_entry(list.next, struct nfs_read_data, pages); 270 list_del_init(&data->pages); 271 272 data->pagevec[0] = page; 273 274 if (nbytes < rsize) 275 rsize = nbytes; |
271 nfs_read_rpcsetup(req, data, &nfs_read_partial_ops, | 276 ret2 = nfs_read_rpcsetup(req, data, &nfs_read_partial_ops, |
272 rsize, offset); | 277 rsize, offset); |
278 if (ret == 0) 279 ret = ret2; |
|
273 offset += rsize; 274 nbytes -= rsize; 275 } while (nbytes != 0); 276 | 280 offset += rsize; 281 nbytes -= rsize; 282 } while (nbytes != 0); 283 |
277 return 0; | 284 return ret; |
278 279out_bad: 280 while (!list_empty(&list)) { 281 data = list_entry(list.next, struct nfs_read_data, pages); 282 list_del(&data->pages); 283 nfs_readdata_free(data); 284 } 285 SetPageError(page); 286 nfs_readpage_release(req); 287 return -ENOMEM; 288} 289 290static int nfs_pagein_one(struct inode *inode, struct list_head *head, unsigned int npages, size_t count, int flags) 291{ 292 struct nfs_page *req; 293 struct page **pages; 294 struct nfs_read_data *data; | 285 286out_bad: 287 while (!list_empty(&list)) { 288 data = list_entry(list.next, struct nfs_read_data, pages); 289 list_del(&data->pages); 290 nfs_readdata_free(data); 291 } 292 SetPageError(page); 293 nfs_readpage_release(req); 294 return -ENOMEM; 295} 296 297static int nfs_pagein_one(struct inode *inode, struct list_head *head, unsigned int npages, size_t count, int flags) 298{ 299 struct nfs_page *req; 300 struct page **pages; 301 struct nfs_read_data *data; |
302 int ret = -ENOMEM; |
|
295 296 data = nfs_readdata_alloc(npages); 297 if (!data) 298 goto out_bad; 299 300 pages = data->pagevec; 301 while (!list_empty(head)) { 302 req = nfs_list_entry(head->next); 303 nfs_list_remove_request(req); 304 nfs_list_add_request(req, &data->pages); 305 ClearPageError(req->wb_page); 306 *pages++ = req->wb_page; 307 } 308 req = nfs_list_entry(data->pages.next); 309 | 303 304 data = nfs_readdata_alloc(npages); 305 if (!data) 306 goto out_bad; 307 308 pages = data->pagevec; 309 while (!list_empty(head)) { 310 req = nfs_list_entry(head->next); 311 nfs_list_remove_request(req); 312 nfs_list_add_request(req, &data->pages); 313 ClearPageError(req->wb_page); 314 *pages++ = req->wb_page; 315 } 316 req = nfs_list_entry(data->pages.next); 317 |
310 nfs_read_rpcsetup(req, data, &nfs_read_full_ops, count, 0); 311 return 0; | 318 return nfs_read_rpcsetup(req, data, &nfs_read_full_ops, count, 0); |
312out_bad: 313 nfs_async_read_error(head); | 319out_bad: 320 nfs_async_read_error(head); |
314 return -ENOMEM; | 321 return ret; |
315} 316 317/* 318 * This is the callback from RPC telling us whether a reply was 319 * received or some error occurred (timeout or socket shutdown). 320 */ 321int nfs_readpage_result(struct rpc_task *task, struct nfs_read_data *data) 322{ --- 300 unchanged lines hidden --- | 322} 323 324/* 325 * This is the callback from RPC telling us whether a reply was 326 * received or some error occurred (timeout or socket shutdown). 327 */ 328int nfs_readpage_result(struct rpc_task *task, struct nfs_read_data *data) 329{ --- 300 unchanged lines hidden --- |