diff options
Diffstat (limited to 'fs/nfs/nfs4filelayout.c')
-rw-r--r-- | fs/nfs/nfs4filelayout.c | 39 |
1 files changed, 31 insertions, 8 deletions
diff --git a/fs/nfs/nfs4filelayout.c b/fs/nfs/nfs4filelayout.c index 17ed87ef9de8..b86464ba25e1 100644 --- a/fs/nfs/nfs4filelayout.c +++ b/fs/nfs/nfs4filelayout.c | |||
@@ -39,6 +39,7 @@ | |||
39 | #include "internal.h" | 39 | #include "internal.h" |
40 | #include "delegation.h" | 40 | #include "delegation.h" |
41 | #include "nfs4filelayout.h" | 41 | #include "nfs4filelayout.h" |
42 | #include "nfs4trace.h" | ||
42 | 43 | ||
43 | #define NFSDBG_FACILITY NFSDBG_PNFS_LD | 44 | #define NFSDBG_FACILITY NFSDBG_PNFS_LD |
44 | 45 | ||
@@ -247,6 +248,7 @@ static int filelayout_read_done_cb(struct rpc_task *task, | |||
247 | struct nfs_pgio_header *hdr = data->header; | 248 | struct nfs_pgio_header *hdr = data->header; |
248 | int err; | 249 | int err; |
249 | 250 | ||
251 | trace_nfs4_pnfs_read(data, task->tk_status); | ||
250 | err = filelayout_async_handle_error(task, data->args.context->state, | 252 | err = filelayout_async_handle_error(task, data->args.context->state, |
251 | data->ds_clp, hdr->lseg); | 253 | data->ds_clp, hdr->lseg); |
252 | 254 | ||
@@ -363,6 +365,7 @@ static int filelayout_write_done_cb(struct rpc_task *task, | |||
363 | struct nfs_pgio_header *hdr = data->header; | 365 | struct nfs_pgio_header *hdr = data->header; |
364 | int err; | 366 | int err; |
365 | 367 | ||
368 | trace_nfs4_pnfs_write(data, task->tk_status); | ||
366 | err = filelayout_async_handle_error(task, data->args.context->state, | 369 | err = filelayout_async_handle_error(task, data->args.context->state, |
367 | data->ds_clp, hdr->lseg); | 370 | data->ds_clp, hdr->lseg); |
368 | 371 | ||
@@ -395,6 +398,7 @@ static int filelayout_commit_done_cb(struct rpc_task *task, | |||
395 | { | 398 | { |
396 | int err; | 399 | int err; |
397 | 400 | ||
401 | trace_nfs4_pnfs_commit_ds(data, task->tk_status); | ||
398 | err = filelayout_async_handle_error(task, NULL, data->ds_clp, | 402 | err = filelayout_async_handle_error(task, NULL, data->ds_clp, |
399 | data->lseg); | 403 | data->lseg); |
400 | 404 | ||
@@ -524,6 +528,7 @@ filelayout_read_pagelist(struct nfs_read_data *data) | |||
524 | struct nfs_pgio_header *hdr = data->header; | 528 | struct nfs_pgio_header *hdr = data->header; |
525 | struct pnfs_layout_segment *lseg = hdr->lseg; | 529 | struct pnfs_layout_segment *lseg = hdr->lseg; |
526 | struct nfs4_pnfs_ds *ds; | 530 | struct nfs4_pnfs_ds *ds; |
531 | struct rpc_clnt *ds_clnt; | ||
527 | loff_t offset = data->args.offset; | 532 | loff_t offset = data->args.offset; |
528 | u32 j, idx; | 533 | u32 j, idx; |
529 | struct nfs_fh *fh; | 534 | struct nfs_fh *fh; |
@@ -538,6 +543,11 @@ filelayout_read_pagelist(struct nfs_read_data *data) | |||
538 | ds = nfs4_fl_prepare_ds(lseg, idx); | 543 | ds = nfs4_fl_prepare_ds(lseg, idx); |
539 | if (!ds) | 544 | if (!ds) |
540 | return PNFS_NOT_ATTEMPTED; | 545 | return PNFS_NOT_ATTEMPTED; |
546 | |||
547 | ds_clnt = nfs4_find_or_create_ds_client(ds->ds_clp, hdr->inode); | ||
548 | if (IS_ERR(ds_clnt)) | ||
549 | return PNFS_NOT_ATTEMPTED; | ||
550 | |||
541 | dprintk("%s USE DS: %s cl_count %d\n", __func__, | 551 | dprintk("%s USE DS: %s cl_count %d\n", __func__, |
542 | ds->ds_remotestr, atomic_read(&ds->ds_clp->cl_count)); | 552 | ds->ds_remotestr, atomic_read(&ds->ds_clp->cl_count)); |
543 | 553 | ||
@@ -552,7 +562,7 @@ filelayout_read_pagelist(struct nfs_read_data *data) | |||
552 | data->mds_offset = offset; | 562 | data->mds_offset = offset; |
553 | 563 | ||
554 | /* Perform an asynchronous read to ds */ | 564 | /* Perform an asynchronous read to ds */ |
555 | nfs_initiate_read(ds->ds_clp->cl_rpcclient, data, | 565 | nfs_initiate_read(ds_clnt, data, |
556 | &filelayout_read_call_ops, RPC_TASK_SOFTCONN); | 566 | &filelayout_read_call_ops, RPC_TASK_SOFTCONN); |
557 | return PNFS_ATTEMPTED; | 567 | return PNFS_ATTEMPTED; |
558 | } | 568 | } |
@@ -564,6 +574,7 @@ filelayout_write_pagelist(struct nfs_write_data *data, int sync) | |||
564 | struct nfs_pgio_header *hdr = data->header; | 574 | struct nfs_pgio_header *hdr = data->header; |
565 | struct pnfs_layout_segment *lseg = hdr->lseg; | 575 | struct pnfs_layout_segment *lseg = hdr->lseg; |
566 | struct nfs4_pnfs_ds *ds; | 576 | struct nfs4_pnfs_ds *ds; |
577 | struct rpc_clnt *ds_clnt; | ||
567 | loff_t offset = data->args.offset; | 578 | loff_t offset = data->args.offset; |
568 | u32 j, idx; | 579 | u32 j, idx; |
569 | struct nfs_fh *fh; | 580 | struct nfs_fh *fh; |
@@ -574,6 +585,11 @@ filelayout_write_pagelist(struct nfs_write_data *data, int sync) | |||
574 | ds = nfs4_fl_prepare_ds(lseg, idx); | 585 | ds = nfs4_fl_prepare_ds(lseg, idx); |
575 | if (!ds) | 586 | if (!ds) |
576 | return PNFS_NOT_ATTEMPTED; | 587 | return PNFS_NOT_ATTEMPTED; |
588 | |||
589 | ds_clnt = nfs4_find_or_create_ds_client(ds->ds_clp, hdr->inode); | ||
590 | if (IS_ERR(ds_clnt)) | ||
591 | return PNFS_NOT_ATTEMPTED; | ||
592 | |||
577 | dprintk("%s ino %lu sync %d req %Zu@%llu DS: %s cl_count %d\n", | 593 | dprintk("%s ino %lu sync %d req %Zu@%llu DS: %s cl_count %d\n", |
578 | __func__, hdr->inode->i_ino, sync, (size_t) data->args.count, | 594 | __func__, hdr->inode->i_ino, sync, (size_t) data->args.count, |
579 | offset, ds->ds_remotestr, atomic_read(&ds->ds_clp->cl_count)); | 595 | offset, ds->ds_remotestr, atomic_read(&ds->ds_clp->cl_count)); |
@@ -591,7 +607,7 @@ filelayout_write_pagelist(struct nfs_write_data *data, int sync) | |||
591 | data->args.offset = filelayout_get_dserver_offset(lseg, offset); | 607 | data->args.offset = filelayout_get_dserver_offset(lseg, offset); |
592 | 608 | ||
593 | /* Perform an asynchronous write */ | 609 | /* Perform an asynchronous write */ |
594 | nfs_initiate_write(ds->ds_clp->cl_rpcclient, data, | 610 | nfs_initiate_write(ds_clnt, data, |
595 | &filelayout_write_call_ops, sync, | 611 | &filelayout_write_call_ops, sync, |
596 | RPC_TASK_SOFTCONN); | 612 | RPC_TASK_SOFTCONN); |
597 | return PNFS_ATTEMPTED; | 613 | return PNFS_ATTEMPTED; |
@@ -1101,16 +1117,19 @@ static int filelayout_initiate_commit(struct nfs_commit_data *data, int how) | |||
1101 | { | 1117 | { |
1102 | struct pnfs_layout_segment *lseg = data->lseg; | 1118 | struct pnfs_layout_segment *lseg = data->lseg; |
1103 | struct nfs4_pnfs_ds *ds; | 1119 | struct nfs4_pnfs_ds *ds; |
1120 | struct rpc_clnt *ds_clnt; | ||
1104 | u32 idx; | 1121 | u32 idx; |
1105 | struct nfs_fh *fh; | 1122 | struct nfs_fh *fh; |
1106 | 1123 | ||
1107 | idx = calc_ds_index_from_commit(lseg, data->ds_commit_index); | 1124 | idx = calc_ds_index_from_commit(lseg, data->ds_commit_index); |
1108 | ds = nfs4_fl_prepare_ds(lseg, idx); | 1125 | ds = nfs4_fl_prepare_ds(lseg, idx); |
1109 | if (!ds) { | 1126 | if (!ds) |
1110 | prepare_to_resend_writes(data); | 1127 | goto out_err; |
1111 | filelayout_commit_release(data); | 1128 | |
1112 | return -EAGAIN; | 1129 | ds_clnt = nfs4_find_or_create_ds_client(ds->ds_clp, data->inode); |
1113 | } | 1130 | if (IS_ERR(ds_clnt)) |
1131 | goto out_err; | ||
1132 | |||
1114 | dprintk("%s ino %lu, how %d cl_count %d\n", __func__, | 1133 | dprintk("%s ino %lu, how %d cl_count %d\n", __func__, |
1115 | data->inode->i_ino, how, atomic_read(&ds->ds_clp->cl_count)); | 1134 | data->inode->i_ino, how, atomic_read(&ds->ds_clp->cl_count)); |
1116 | data->commit_done_cb = filelayout_commit_done_cb; | 1135 | data->commit_done_cb = filelayout_commit_done_cb; |
@@ -1119,9 +1138,13 @@ static int filelayout_initiate_commit(struct nfs_commit_data *data, int how) | |||
1119 | fh = select_ds_fh_from_commit(lseg, data->ds_commit_index); | 1138 | fh = select_ds_fh_from_commit(lseg, data->ds_commit_index); |
1120 | if (fh) | 1139 | if (fh) |
1121 | data->args.fh = fh; | 1140 | data->args.fh = fh; |
1122 | return nfs_initiate_commit(ds->ds_clp->cl_rpcclient, data, | 1141 | return nfs_initiate_commit(ds_clnt, data, |
1123 | &filelayout_commit_call_ops, how, | 1142 | &filelayout_commit_call_ops, how, |
1124 | RPC_TASK_SOFTCONN); | 1143 | RPC_TASK_SOFTCONN); |
1144 | out_err: | ||
1145 | prepare_to_resend_writes(data); | ||
1146 | filelayout_commit_release(data); | ||
1147 | return -EAGAIN; | ||
1125 | } | 1148 | } |
1126 | 1149 | ||
1127 | static int | 1150 | static int |