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(&current->mm->mmap_sem);
313 result = get_user_pages(current, current->mm, user_addr,
314 data->npages, 1, 0, data->pagevec, NULL);
315 up_read(&current->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(&current->mm->mmap_sem);
313 result = get_user_pages(current, current->mm, user_addr,
314 data->npages, 1, 0, data->pagevec, NULL);
315 up_read(&current->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(&current->mm->mmap_sem);
733 result = get_user_pages(current, current->mm, user_addr,
734 data->npages, 0, 0, data->pagevec, NULL);
735 up_read(&current->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(&current->mm->mmap_sem);
733 result = get_user_pages(current, current->mm, user_addr,
734 data->npages, 0, 0, data->pagevec, NULL);
735 up_read(&current->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 ---