direct.c (bdc7f021f3a1fade77adf3c2d7f65690566fddfe) direct.c (0773769191d943358a8392fa86abd756d004c4b6)
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

--- 258 unchanged lines hidden (view full) ---

267 const struct iovec *iov,
268 loff_t pos)
269{
270 struct nfs_open_context *ctx = dreq->ctx;
271 struct inode *inode = ctx->path.dentry->d_inode;
272 unsigned long user_addr = (unsigned long)iov->iov_base;
273 size_t count = iov->iov_len;
274 size_t rsize = NFS_SERVER(inode)->rsize;
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

--- 258 unchanged lines hidden (view full) ---

267 const struct iovec *iov,
268 loff_t pos)
269{
270 struct nfs_open_context *ctx = dreq->ctx;
271 struct inode *inode = ctx->path.dentry->d_inode;
272 unsigned long user_addr = (unsigned long)iov->iov_base;
273 size_t count = iov->iov_len;
274 size_t rsize = NFS_SERVER(inode)->rsize;
275 struct rpc_task *task;
275 struct rpc_message msg = {
276 .rpc_cred = ctx->cred,
277 };
278 struct rpc_task_setup task_setup_data = {
279 .rpc_client = NFS_CLIENT(inode),
280 .rpc_message = &msg,
281 .callback_ops = &nfs_read_direct_ops,
282 .flags = RPC_TASK_ASYNC,

--- 45 unchanged lines hidden (view full) ---

328 data->args.pages = data->pagevec;
329 data->args.count = bytes;
330 data->res.fattr = &data->fattr;
331 data->res.eof = 0;
332 data->res.count = bytes;
333 msg.rpc_argp = &data->args;
334 msg.rpc_resp = &data->res;
335
276 struct rpc_message msg = {
277 .rpc_cred = ctx->cred,
278 };
279 struct rpc_task_setup task_setup_data = {
280 .rpc_client = NFS_CLIENT(inode),
281 .rpc_message = &msg,
282 .callback_ops = &nfs_read_direct_ops,
283 .flags = RPC_TASK_ASYNC,

--- 45 unchanged lines hidden (view full) ---

329 data->args.pages = data->pagevec;
330 data->args.count = bytes;
331 data->res.fattr = &data->fattr;
332 data->res.eof = 0;
333 data->res.count = bytes;
334 msg.rpc_argp = &data->args;
335 msg.rpc_resp = &data->res;
336
337 task_setup_data.task = &data->task;
336 task_setup_data.callback_data = data;
337 NFS_PROTO(inode)->read_setup(data, &msg);
338 task_setup_data.callback_data = data;
339 NFS_PROTO(inode)->read_setup(data, &msg);
338 rpc_init_task(&data->task, &task_setup_data);
339
340
340 rpc_execute(&data->task);
341 task = rpc_run_task(&task_setup_data);
342 if (!IS_ERR(task))
343 rpc_put_task(task);
341
342 dprintk("NFS: %5u initiated direct read call "
343 "(req %s/%Ld, %zu bytes @ offset %Lu)\n",
344 data->task.tk_pid,
345 inode->i_sb->s_id,
346 (long long)NFS_FILEID(inode),
347 bytes,
348 (unsigned long long)data->args.offset);

--- 86 unchanged lines hidden (view full) ---

435}
436
437#if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4)
438static void nfs_direct_write_reschedule(struct nfs_direct_req *dreq)
439{
440 struct inode *inode = dreq->inode;
441 struct list_head *p;
442 struct nfs_write_data *data;
344
345 dprintk("NFS: %5u initiated direct read call "
346 "(req %s/%Ld, %zu bytes @ offset %Lu)\n",
347 data->task.tk_pid,
348 inode->i_sb->s_id,
349 (long long)NFS_FILEID(inode),
350 bytes,
351 (unsigned long long)data->args.offset);

--- 86 unchanged lines hidden (view full) ---

438}
439
440#if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4)
441static void nfs_direct_write_reschedule(struct nfs_direct_req *dreq)
442{
443 struct inode *inode = dreq->inode;
444 struct list_head *p;
445 struct nfs_write_data *data;
446 struct rpc_task *task;
443 struct rpc_message msg = {
444 .rpc_cred = dreq->ctx->cred,
445 };
446 struct rpc_task_setup task_setup_data = {
447 .rpc_client = NFS_CLIENT(inode),
448 .callback_ops = &nfs_write_direct_ops,
449 .flags = RPC_TASK_ASYNC,
450 };

--- 15 unchanged lines hidden (view full) ---

466 nfs_fattr_init(&data->fattr);
467 data->res.count = data->args.count;
468 memset(&data->verf, 0, sizeof(data->verf));
469
470 /*
471 * Reuse data->task; data->args should not have changed
472 * since the original request was sent.
473 */
447 struct rpc_message msg = {
448 .rpc_cred = dreq->ctx->cred,
449 };
450 struct rpc_task_setup task_setup_data = {
451 .rpc_client = NFS_CLIENT(inode),
452 .callback_ops = &nfs_write_direct_ops,
453 .flags = RPC_TASK_ASYNC,
454 };

--- 15 unchanged lines hidden (view full) ---

470 nfs_fattr_init(&data->fattr);
471 data->res.count = data->args.count;
472 memset(&data->verf, 0, sizeof(data->verf));
473
474 /*
475 * Reuse data->task; data->args should not have changed
476 * since the original request was sent.
477 */
478 task_setup_data.task = &data->task;
474 task_setup_data.callback_data = data;
475 msg.rpc_argp = &data->args;
476 msg.rpc_resp = &data->res;
477 NFS_PROTO(inode)->write_setup(data, &msg);
479 task_setup_data.callback_data = data;
480 msg.rpc_argp = &data->args;
481 msg.rpc_resp = &data->res;
482 NFS_PROTO(inode)->write_setup(data, &msg);
478 rpc_init_task(&data->task, &task_setup_data);
479
480 /*
481 * We're called via an RPC callback, so BKL is already held.
482 */
483
484 /*
485 * We're called via an RPC callback, so BKL is already held.
486 */
483 rpc_execute(&data->task);
487 task = rpc_run_task(&task_setup_data);
488 if (!IS_ERR(task))
489 rpc_put_task(task);
484
485 dprintk("NFS: %5u rescheduled direct write call (req %s/%Ld, %u bytes @ offset %Lu)\n",
486 data->task.tk_pid,
487 inode->i_sb->s_id,
488 (long long)NFS_FILEID(inode),
489 data->args.count,
490 (unsigned long long)data->args.offset);
491 }

--- 26 unchanged lines hidden (view full) ---

518static const struct rpc_call_ops nfs_commit_direct_ops = {
519 .rpc_call_done = nfs_direct_commit_result,
520 .rpc_release = nfs_commit_release,
521};
522
523static void nfs_direct_commit_schedule(struct nfs_direct_req *dreq)
524{
525 struct nfs_write_data *data = dreq->commit_data;
490
491 dprintk("NFS: %5u rescheduled direct write call (req %s/%Ld, %u bytes @ offset %Lu)\n",
492 data->task.tk_pid,
493 inode->i_sb->s_id,
494 (long long)NFS_FILEID(inode),
495 data->args.count,
496 (unsigned long long)data->args.offset);
497 }

--- 26 unchanged lines hidden (view full) ---

524static const struct rpc_call_ops nfs_commit_direct_ops = {
525 .rpc_call_done = nfs_direct_commit_result,
526 .rpc_release = nfs_commit_release,
527};
528
529static void nfs_direct_commit_schedule(struct nfs_direct_req *dreq)
530{
531 struct nfs_write_data *data = dreq->commit_data;
532 struct rpc_task *task;
526 struct rpc_message msg = {
527 .rpc_argp = &data->args,
528 .rpc_resp = &data->res,
529 .rpc_cred = dreq->ctx->cred,
530 };
531 struct rpc_task_setup task_setup_data = {
533 struct rpc_message msg = {
534 .rpc_argp = &data->args,
535 .rpc_resp = &data->res,
536 .rpc_cred = dreq->ctx->cred,
537 };
538 struct rpc_task_setup task_setup_data = {
539 .task = &data->task,
532 .rpc_client = NFS_CLIENT(dreq->inode),
533 .rpc_message = &msg,
534 .callback_ops = &nfs_commit_direct_ops,
535 .callback_data = data,
536 .flags = RPC_TASK_ASYNC,
537 };
538
539 data->inode = dreq->inode;
540 data->cred = msg.rpc_cred;
541
542 data->args.fh = NFS_FH(data->inode);
543 data->args.offset = 0;
544 data->args.count = 0;
545 data->res.count = 0;
546 data->res.fattr = &data->fattr;
547 data->res.verf = &data->verf;
548
549 NFS_PROTO(data->inode)->commit_setup(data, &msg);
540 .rpc_client = NFS_CLIENT(dreq->inode),
541 .rpc_message = &msg,
542 .callback_ops = &nfs_commit_direct_ops,
543 .callback_data = data,
544 .flags = RPC_TASK_ASYNC,
545 };
546
547 data->inode = dreq->inode;
548 data->cred = msg.rpc_cred;
549
550 data->args.fh = NFS_FH(data->inode);
551 data->args.offset = 0;
552 data->args.count = 0;
553 data->res.count = 0;
554 data->res.fattr = &data->fattr;
555 data->res.verf = &data->verf;
556
557 NFS_PROTO(data->inode)->commit_setup(data, &msg);
550 rpc_init_task(&data->task, &task_setup_data);
551
552 /* Note: task.tk_ops->rpc_release will free dreq->commit_data */
553 dreq->commit_data = NULL;
554
555 dprintk("NFS: %5u initiated commit call\n", data->task.tk_pid);
556
558
559 /* Note: task.tk_ops->rpc_release will free dreq->commit_data */
560 dreq->commit_data = NULL;
561
562 dprintk("NFS: %5u initiated commit call\n", data->task.tk_pid);
563
557 rpc_execute(&data->task);
564 task = rpc_run_task(&task_setup_data);
565 if (!IS_ERR(task))
566 rpc_put_task(task);
558}
559
560static void nfs_direct_write_complete(struct nfs_direct_req *dreq, struct inode *inode)
561{
562 int flags = dreq->flags;
563
564 dreq->flags = 0;
565 switch (flags) {

--- 98 unchanged lines hidden (view full) ---

664static ssize_t nfs_direct_write_schedule_segment(struct nfs_direct_req *dreq,
665 const struct iovec *iov,
666 loff_t pos, int sync)
667{
668 struct nfs_open_context *ctx = dreq->ctx;
669 struct inode *inode = ctx->path.dentry->d_inode;
670 unsigned long user_addr = (unsigned long)iov->iov_base;
671 size_t count = iov->iov_len;
567}
568
569static void nfs_direct_write_complete(struct nfs_direct_req *dreq, struct inode *inode)
570{
571 int flags = dreq->flags;
572
573 dreq->flags = 0;
574 switch (flags) {

--- 98 unchanged lines hidden (view full) ---

673static ssize_t nfs_direct_write_schedule_segment(struct nfs_direct_req *dreq,
674 const struct iovec *iov,
675 loff_t pos, int sync)
676{
677 struct nfs_open_context *ctx = dreq->ctx;
678 struct inode *inode = ctx->path.dentry->d_inode;
679 unsigned long user_addr = (unsigned long)iov->iov_base;
680 size_t count = iov->iov_len;
681 struct rpc_task *task;
672 struct rpc_message msg = {
673 .rpc_cred = ctx->cred,
674 };
675 struct rpc_task_setup task_setup_data = {
676 .rpc_client = NFS_CLIENT(inode),
677 .rpc_message = &msg,
678 .callback_ops = &nfs_write_direct_ops,
679 .flags = RPC_TASK_ASYNC,

--- 47 unchanged lines hidden (view full) ---

727 data->args.pgbase = pgbase;
728 data->args.pages = data->pagevec;
729 data->args.count = bytes;
730 data->args.stable = sync;
731 data->res.fattr = &data->fattr;
732 data->res.count = bytes;
733 data->res.verf = &data->verf;
734
682 struct rpc_message msg = {
683 .rpc_cred = ctx->cred,
684 };
685 struct rpc_task_setup task_setup_data = {
686 .rpc_client = NFS_CLIENT(inode),
687 .rpc_message = &msg,
688 .callback_ops = &nfs_write_direct_ops,
689 .flags = RPC_TASK_ASYNC,

--- 47 unchanged lines hidden (view full) ---

737 data->args.pgbase = pgbase;
738 data->args.pages = data->pagevec;
739 data->args.count = bytes;
740 data->args.stable = sync;
741 data->res.fattr = &data->fattr;
742 data->res.count = bytes;
743 data->res.verf = &data->verf;
744
745 task_setup_data.task = &data->task;
735 task_setup_data.callback_data = data;
736 msg.rpc_argp = &data->args;
737 msg.rpc_resp = &data->res;
738 NFS_PROTO(inode)->write_setup(data, &msg);
746 task_setup_data.callback_data = data;
747 msg.rpc_argp = &data->args;
748 msg.rpc_resp = &data->res;
749 NFS_PROTO(inode)->write_setup(data, &msg);
739 rpc_init_task(&data->task, &task_setup_data);
740
750
741 rpc_execute(&data->task);
751 task = rpc_run_task(&task_setup_data);
752 if (!IS_ERR(task))
753 rpc_put_task(task);
742
743 dprintk("NFS: %5u initiated direct write call "
744 "(req %s/%Ld, %zu bytes @ offset %Lu)\n",
745 data->task.tk_pid,
746 inode->i_sb->s_id,
747 (long long)NFS_FILEID(inode),
748 bytes,
749 (unsigned long long)data->args.offset);

--- 230 unchanged lines hidden ---
754
755 dprintk("NFS: %5u initiated direct write call "
756 "(req %s/%Ld, %zu bytes @ offset %Lu)\n",
757 data->task.tk_pid,
758 inode->i_sb->s_id,
759 (long long)NFS_FILEID(inode),
760 bytes,
761 (unsigned long long)data->args.offset);

--- 230 unchanged lines hidden ---