aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs/nfs4filelayout.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/nfs/nfs4filelayout.c')
-rw-r--r--fs/nfs/nfs4filelayout.c39
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);
1144out_err:
1145 prepare_to_resend_writes(data);
1146 filelayout_commit_release(data);
1147 return -EAGAIN;
1125} 1148}
1126 1149
1127static int 1150static int