direct.c (bd072111e7319d90a7b8127f91c2806b9a6f279e) | direct.c (1ae88b2e446261c038f2c0c3150ffae142b227a2) |
---|---|
1/* 2 * linux/fs/nfs/direct.c 3 * 4 * Copyright (C) 2003 by Chuck Lever <cel@netapp.com> 5 * 6 * High-performance uncached I/O for the Linux NFS client 7 * 8 * There are important applications whose performance or correctness --- 241 unchanged lines hidden (view full) --- 250 nfs_direct_dirty_pages(data->pagevec, 251 data->args.pgbase, 252 data->res.count); 253 } 254 nfs_direct_release_pages(data->pagevec, data->npages); 255 256 if (put_dreq(dreq)) 257 nfs_direct_complete(dreq); | 1/* 2 * linux/fs/nfs/direct.c 3 * 4 * Copyright (C) 2003 by Chuck Lever <cel@netapp.com> 5 * 6 * High-performance uncached I/O for the Linux NFS client 7 * 8 * There are important applications whose performance or correctness --- 241 unchanged lines hidden (view full) --- 250 nfs_direct_dirty_pages(data->pagevec, 251 data->args.pgbase, 252 data->res.count); 253 } 254 nfs_direct_release_pages(data->pagevec, data->npages); 255 256 if (put_dreq(dreq)) 257 nfs_direct_complete(dreq); |
258 nfs_readdata_release(calldata); | 258 nfs_readdata_free(data); |
259} 260 261static const struct rpc_call_ops nfs_read_direct_ops = { 262#if defined(CONFIG_NFS_V4_1) 263 .rpc_call_prepare = nfs_read_prepare, 264#endif /* CONFIG_NFS_V4_1 */ 265 .rpc_call_done = nfs_direct_read_result, 266 .rpc_release = nfs_direct_read_release, --- 42 unchanged lines hidden (view full) --- 309 if (unlikely(!data)) 310 break; 311 312 down_read(¤t->mm->mmap_sem); 313 result = get_user_pages(current, current->mm, user_addr, 314 data->npages, 1, 0, data->pagevec, NULL); 315 up_read(¤t->mm->mmap_sem); 316 if (result < 0) { | 259} 260 261static const struct rpc_call_ops nfs_read_direct_ops = { 262#if defined(CONFIG_NFS_V4_1) 263 .rpc_call_prepare = nfs_read_prepare, 264#endif /* CONFIG_NFS_V4_1 */ 265 .rpc_call_done = nfs_direct_read_result, 266 .rpc_release = nfs_direct_read_release, --- 42 unchanged lines hidden (view full) --- 309 if (unlikely(!data)) 310 break; 311 312 down_read(¤t->mm->mmap_sem); 313 result = get_user_pages(current, current->mm, user_addr, 314 data->npages, 1, 0, data->pagevec, NULL); 315 up_read(¤t->mm->mmap_sem); 316 if (result < 0) { |
317 nfs_readdata_release(data); | 317 nfs_readdata_free(data); |
318 break; 319 } 320 if ((unsigned)result < data->npages) { 321 bytes = result * PAGE_SIZE; 322 if (bytes <= pgbase) { 323 nfs_direct_release_pages(data->pagevec, result); | 318 break; 319 } 320 if ((unsigned)result < data->npages) { 321 bytes = result * PAGE_SIZE; 322 if (bytes <= pgbase) { 323 nfs_direct_release_pages(data->pagevec, result); |
324 nfs_readdata_release(data); | 324 nfs_readdata_free(data); |
325 break; 326 } 327 bytes -= pgbase; 328 data->npages = result; 329 } 330 331 get_dreq(dreq); 332 333 data->req = (struct nfs_page *) dreq; 334 data->inode = inode; 335 data->cred = msg.rpc_cred; 336 data->args.fh = NFS_FH(inode); | 325 break; 326 } 327 bytes -= pgbase; 328 data->npages = result; 329 } 330 331 get_dreq(dreq); 332 333 data->req = (struct nfs_page *) dreq; 334 data->inode = inode; 335 data->cred = msg.rpc_cred; 336 data->args.fh = NFS_FH(inode); |
337 data->args.context = get_nfs_open_context(ctx); | 337 data->args.context = ctx; |
338 data->args.offset = pos; 339 data->args.pgbase = pgbase; 340 data->args.pages = data->pagevec; 341 data->args.count = bytes; 342 data->res.fattr = &data->fattr; 343 data->res.eof = 0; 344 data->res.count = bytes; 345 msg.rpc_argp = &data->args; --- 90 unchanged lines hidden (view full) --- 436} 437 438static void nfs_direct_free_writedata(struct nfs_direct_req *dreq) 439{ 440 while (!list_empty(&dreq->rewrite_list)) { 441 struct nfs_write_data *data = list_entry(dreq->rewrite_list.next, struct nfs_write_data, pages); 442 list_del(&data->pages); 443 nfs_direct_release_pages(data->pagevec, data->npages); | 338 data->args.offset = pos; 339 data->args.pgbase = pgbase; 340 data->args.pages = data->pagevec; 341 data->args.count = bytes; 342 data->res.fattr = &data->fattr; 343 data->res.eof = 0; 344 data->res.count = bytes; 345 msg.rpc_argp = &data->args; --- 90 unchanged lines hidden (view full) --- 436} 437 438static void nfs_direct_free_writedata(struct nfs_direct_req *dreq) 439{ 440 while (!list_empty(&dreq->rewrite_list)) { 441 struct nfs_write_data *data = list_entry(dreq->rewrite_list.next, struct nfs_write_data, pages); 442 list_del(&data->pages); 443 nfs_direct_release_pages(data->pagevec, data->npages); |
444 nfs_writedata_release(data); | 444 nfs_writedata_free(data); |
445 } 446} 447 448#if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4) 449static void nfs_direct_write_reschedule(struct nfs_direct_req *dreq) 450{ 451 struct inode *inode = dreq->inode; 452 struct list_head *p; --- 76 unchanged lines hidden (view full) --- 529 dreq->flags = NFS_ODIRECT_RESCHED_WRITES; 530 } else if (memcmp(&dreq->verf, &data->verf, sizeof(data->verf))) { 531 dprintk("NFS: %5u commit verify failed\n", data->task.tk_pid); 532 dreq->flags = NFS_ODIRECT_RESCHED_WRITES; 533 } 534 535 dprintk("NFS: %5u commit returned %d\n", data->task.tk_pid, status); 536 nfs_direct_write_complete(dreq, data->inode); | 445 } 446} 447 448#if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4) 449static void nfs_direct_write_reschedule(struct nfs_direct_req *dreq) 450{ 451 struct inode *inode = dreq->inode; 452 struct list_head *p; --- 76 unchanged lines hidden (view full) --- 529 dreq->flags = NFS_ODIRECT_RESCHED_WRITES; 530 } else if (memcmp(&dreq->verf, &data->verf, sizeof(data->verf))) { 531 dprintk("NFS: %5u commit verify failed\n", data->task.tk_pid); 532 dreq->flags = NFS_ODIRECT_RESCHED_WRITES; 533 } 534 535 dprintk("NFS: %5u commit returned %d\n", data->task.tk_pid, status); 536 nfs_direct_write_complete(dreq, data->inode); |
537 nfs_commitdata_release(calldata); | 537 nfs_commit_free(data); |
538} 539 540static const struct rpc_call_ops nfs_commit_direct_ops = { 541#if defined(CONFIG_NFS_V4_1) 542 .rpc_call_prepare = nfs_write_prepare, 543#endif /* CONFIG_NFS_V4_1 */ 544 .rpc_call_done = nfs_direct_commit_result, 545 .rpc_release = nfs_direct_commit_release, --- 19 unchanged lines hidden (view full) --- 565 }; 566 567 data->inode = dreq->inode; 568 data->cred = msg.rpc_cred; 569 570 data->args.fh = NFS_FH(data->inode); 571 data->args.offset = 0; 572 data->args.count = 0; | 538} 539 540static const struct rpc_call_ops nfs_commit_direct_ops = { 541#if defined(CONFIG_NFS_V4_1) 542 .rpc_call_prepare = nfs_write_prepare, 543#endif /* CONFIG_NFS_V4_1 */ 544 .rpc_call_done = nfs_direct_commit_result, 545 .rpc_release = nfs_direct_commit_release, --- 19 unchanged lines hidden (view full) --- 565 }; 566 567 data->inode = dreq->inode; 568 data->cred = msg.rpc_cred; 569 570 data->args.fh = NFS_FH(data->inode); 571 data->args.offset = 0; 572 data->args.count = 0; |
573 data->args.context = get_nfs_open_context(dreq->ctx); | 573 data->args.context = dreq->ctx; |
574 data->res.count = 0; 575 data->res.fattr = &data->fattr; 576 data->res.verf = &data->verf; 577 578 NFS_PROTO(data->inode)->commit_setup(data, &msg); 579 580 /* Note: task.tk_ops->rpc_release will free dreq->commit_data */ 581 dreq->commit_data = NULL; --- 147 unchanged lines hidden (view full) --- 729 if (unlikely(!data)) 730 break; 731 732 down_read(¤t->mm->mmap_sem); 733 result = get_user_pages(current, current->mm, user_addr, 734 data->npages, 0, 0, data->pagevec, NULL); 735 up_read(¤t->mm->mmap_sem); 736 if (result < 0) { | 574 data->res.count = 0; 575 data->res.fattr = &data->fattr; 576 data->res.verf = &data->verf; 577 578 NFS_PROTO(data->inode)->commit_setup(data, &msg); 579 580 /* Note: task.tk_ops->rpc_release will free dreq->commit_data */ 581 dreq->commit_data = NULL; --- 147 unchanged lines hidden (view full) --- 729 if (unlikely(!data)) 730 break; 731 732 down_read(¤t->mm->mmap_sem); 733 result = get_user_pages(current, current->mm, user_addr, 734 data->npages, 0, 0, data->pagevec, NULL); 735 up_read(¤t->mm->mmap_sem); 736 if (result < 0) { |
737 nfs_writedata_release(data); | 737 nfs_writedata_free(data); |
738 break; 739 } 740 if ((unsigned)result < data->npages) { 741 bytes = result * PAGE_SIZE; 742 if (bytes <= pgbase) { 743 nfs_direct_release_pages(data->pagevec, result); | 738 break; 739 } 740 if ((unsigned)result < data->npages) { 741 bytes = result * PAGE_SIZE; 742 if (bytes <= pgbase) { 743 nfs_direct_release_pages(data->pagevec, result); |
744 nfs_writedata_release(data); | 744 nfs_writedata_free(data); |
745 break; 746 } 747 bytes -= pgbase; 748 data->npages = result; 749 } 750 751 get_dreq(dreq); 752 753 list_move_tail(&data->pages, &dreq->rewrite_list); 754 755 data->req = (struct nfs_page *) dreq; 756 data->inode = inode; 757 data->cred = msg.rpc_cred; 758 data->args.fh = NFS_FH(inode); | 745 break; 746 } 747 bytes -= pgbase; 748 data->npages = result; 749 } 750 751 get_dreq(dreq); 752 753 list_move_tail(&data->pages, &dreq->rewrite_list); 754 755 data->req = (struct nfs_page *) dreq; 756 data->inode = inode; 757 data->cred = msg.rpc_cred; 758 data->args.fh = NFS_FH(inode); |
759 data->args.context = get_nfs_open_context(ctx); | 759 data->args.context = ctx; |
760 data->args.offset = pos; 761 data->args.pgbase = pgbase; 762 data->args.pages = data->pagevec; 763 data->args.count = bytes; 764 data->args.stable = sync; 765 data->res.fattr = &data->fattr; 766 data->res.count = bytes; 767 data->res.verf = &data->verf; --- 245 unchanged lines hidden --- | 760 data->args.offset = pos; 761 data->args.pgbase = pgbase; 762 data->args.pages = data->pagevec; 763 data->args.count = bytes; 764 data->args.stable = sync; 765 data->res.fattr = &data->fattr; 766 data->res.count = bytes; 767 data->res.verf = &data->verf; --- 245 unchanged lines hidden --- |