diff options
author | Andy Adamson <andros@netapp.com> | 2012-04-27 17:53:51 -0400 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2012-05-19 17:55:32 -0400 |
commit | 3a7936c3fc469c196d9163abfea6b7aa9572d443 (patch) | |
tree | 0c3d2cf6bc9bb97cbdb9c2dc296f1224669e2524 /fs | |
parent | 0a57cdac3fb9d249f4fbbc745c01b9292ef8c1b7 (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')
-rw-r--r-- | fs/nfs/nfs4filelayout.c | 26 |
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 | ||
106 | static void filelayout_reset_read(struct nfs_read_data *data) | 109 | static 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 | ||
127 | static int filelayout_async_handle_error(struct rpc_task *task, | 133 | static 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) |