aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs
diff options
context:
space:
mode:
authorAndy Adamson <andros@netapp.com>2012-04-27 17:53:51 -0400
committerTrond Myklebust <Trond.Myklebust@netapp.com>2012-05-19 17:55:32 -0400
commit3a7936c3fc469c196d9163abfea6b7aa9572d443 (patch)
tree0c3d2cf6bc9bb97cbdb9c2dc296f1224669e2524 /fs/nfs
parent0a57cdac3fb9d249f4fbbc745c01b9292ef8c1b7 (diff)
NFSv4.1 ref count nfs_client across filelayout data server io
Prepare to put a dis-connected DS client record. Signed-off-by: Andy Adamson <andros@netapp.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/nfs')
-rw-r--r--fs/nfs/nfs4filelayout.c26
1 files changed, 21 insertions, 5 deletions
diff --git a/fs/nfs/nfs4filelayout.c b/fs/nfs/nfs4filelayout.c
index c6b7c1834947..eb8eb00f3b52 100644
--- a/fs/nfs/nfs4filelayout.c
+++ b/fs/nfs/nfs4filelayout.c
@@ -101,6 +101,9 @@ static void filelayout_reset_write(struct nfs_write_data *data)
101 &hdr->pages, 101 &hdr->pages,
102 hdr->completion_ops); 102 hdr->completion_ops);
103 } 103 }
104 /* balance nfs_get_client in filelayout_write_pagelist */
105 nfs_put_client(data->ds_clp);
106 data->ds_clp = NULL;
104} 107}
105 108
106static void filelayout_reset_read(struct nfs_read_data *data) 109static void filelayout_reset_read(struct nfs_read_data *data)
@@ -122,6 +125,9 @@ static void filelayout_reset_read(struct nfs_read_data *data)
122 &hdr->pages, 125 &hdr->pages,
123 hdr->completion_ops); 126 hdr->completion_ops);
124 } 127 }
128 /* balance nfs_get_client in filelayout_read_pagelist */
129 nfs_put_client(data->ds_clp);
130 data->ds_clp = NULL;
125} 131}
126 132
127static int filelayout_async_handle_error(struct rpc_task *task, 133static int filelayout_async_handle_error(struct rpc_task *task,
@@ -298,6 +304,8 @@ static void filelayout_read_release(void *data)
298{ 304{
299 struct nfs_read_data *rdata = data; 305 struct nfs_read_data *rdata = data;
300 306
307 if (!test_bit(NFS_IOHDR_REDO, &rdata->header->flags))
308 nfs_put_client(rdata->ds_clp);
301 rdata->header->mds_ops->rpc_release(data); 309 rdata->header->mds_ops->rpc_release(data);
302} 310}
303 311
@@ -395,6 +403,8 @@ static void filelayout_write_release(void *data)
395{ 403{
396 struct nfs_write_data *wdata = data; 404 struct nfs_write_data *wdata = data;
397 405
406 if (!test_bit(NFS_IOHDR_REDO, &wdata->header->flags))
407 nfs_put_client(wdata->ds_clp);
398 wdata->header->mds_ops->rpc_release(data); 408 wdata->header->mds_ops->rpc_release(data);
399} 409}
400 410
@@ -431,6 +441,7 @@ static void filelayout_commit_release(void *calldata)
431 441
432 data->completion_ops->completion(data); 442 data->completion_ops->completion(data);
433 put_lseg(data->lseg); 443 put_lseg(data->lseg);
444 nfs_put_client(data->ds_clp);
434 nfs_commitdata_release(data); 445 nfs_commitdata_release(data);
435} 446}
436 447
@@ -476,9 +487,11 @@ filelayout_read_pagelist(struct nfs_read_data *data)
476 ds = nfs4_fl_prepare_ds(lseg, idx); 487 ds = nfs4_fl_prepare_ds(lseg, idx);
477 if (!ds) 488 if (!ds)
478 return PNFS_NOT_ATTEMPTED; 489 return PNFS_NOT_ATTEMPTED;
479 dprintk("%s USE DS: %s\n", __func__, ds->ds_remotestr); 490 dprintk("%s USE DS: %s cl_count %d\n", __func__,
491 ds->ds_remotestr, atomic_read(&ds->ds_clp->cl_count));
480 492
481 /* No multipath support. Use first DS */ 493 /* No multipath support. Use first DS */
494 atomic_inc(&ds->ds_clp->cl_count);
482 data->ds_clp = ds->ds_clp; 495 data->ds_clp = ds->ds_clp;
483 fh = nfs4_fl_select_ds_fh(lseg, j); 496 fh = nfs4_fl_select_ds_fh(lseg, j);
484 if (fh) 497 if (fh)
@@ -512,11 +525,12 @@ filelayout_write_pagelist(struct nfs_write_data *data, int sync)
512 ds = nfs4_fl_prepare_ds(lseg, idx); 525 ds = nfs4_fl_prepare_ds(lseg, idx);
513 if (!ds) 526 if (!ds)
514 return PNFS_NOT_ATTEMPTED; 527 return PNFS_NOT_ATTEMPTED;
515 dprintk("%s ino %lu sync %d req %Zu@%llu DS: %s\n", __func__, 528 dprintk("%s ino %lu sync %d req %Zu@%llu DS: %s cl_count %d\n",
516 hdr->inode->i_ino, sync, (size_t) data->args.count, offset, 529 __func__, hdr->inode->i_ino, sync, (size_t) data->args.count,
517 ds->ds_remotestr); 530 offset, ds->ds_remotestr, atomic_read(&ds->ds_clp->cl_count));
518 531
519 data->write_done_cb = filelayout_write_done_cb; 532 data->write_done_cb = filelayout_write_done_cb;
533 atomic_inc(&ds->ds_clp->cl_count);
520 data->ds_clp = ds->ds_clp; 534 data->ds_clp = ds->ds_clp;
521 fh = nfs4_fl_select_ds_fh(lseg, j); 535 fh = nfs4_fl_select_ds_fh(lseg, j);
522 if (fh) 536 if (fh)
@@ -1048,8 +1062,10 @@ static int filelayout_initiate_commit(struct nfs_commit_data *data, int how)
1048 filelayout_commit_release(data); 1062 filelayout_commit_release(data);
1049 return -EAGAIN; 1063 return -EAGAIN;
1050 } 1064 }
1051 dprintk("%s ino %lu, how %d\n", __func__, data->inode->i_ino, how); 1065 dprintk("%s ino %lu, how %d cl_count %d\n", __func__,
1066 data->inode->i_ino, how, atomic_read(&ds->ds_clp->cl_count));
1052 data->commit_done_cb = filelayout_commit_done_cb; 1067 data->commit_done_cb = filelayout_commit_done_cb;
1068 atomic_inc(&ds->ds_clp->cl_count);
1053 data->ds_clp = ds->ds_clp; 1069 data->ds_clp = ds->ds_clp;
1054 fh = select_ds_fh_from_commit(lseg, data->ds_commit_index); 1070 fh = select_ds_fh_from_commit(lseg, data->ds_commit_index);
1055 if (fh) 1071 if (fh)