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 --- |