diff options
| -rw-r--r-- | fs/nfs/internal.h | 10 | ||||
| -rw-r--r-- | fs/nfs/nfs4filelayout.c | 14 | ||||
| -rw-r--r-- | fs/nfs/nfs4proc.c | 17 | ||||
| -rw-r--r-- | fs/nfs/read.c | 2 | ||||
| -rw-r--r-- | fs/nfs/unlink.c | 4 | ||||
| -rw-r--r-- | fs/nfs/write.c | 2 | ||||
| -rw-r--r-- | net/sunrpc/clnt.c | 4 |
7 files changed, 19 insertions, 34 deletions
diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h index ab12913dd473..c1a1bd8ddf1c 100644 --- a/fs/nfs/internal.h +++ b/fs/nfs/internal.h | |||
| @@ -457,13 +457,3 @@ unsigned int nfs_page_array_len(unsigned int base, size_t len) | |||
| 457 | PAGE_SIZE - 1) >> PAGE_SHIFT; | 457 | PAGE_SIZE - 1) >> PAGE_SHIFT; |
| 458 | } | 458 | } |
| 459 | 459 | ||
| 460 | /* | ||
| 461 | * Helper for restarting RPC calls in the possible presence of NFSv4.1 | ||
| 462 | * sessions. | ||
| 463 | */ | ||
| 464 | static inline int nfs_restart_rpc(struct rpc_task *task, const struct nfs_client *clp) | ||
| 465 | { | ||
| 466 | if (nfs4_has_session(clp)) | ||
| 467 | return rpc_restart_call_prepare(task); | ||
| 468 | return rpc_restart_call(task); | ||
| 469 | } | ||
diff --git a/fs/nfs/nfs4filelayout.c b/fs/nfs/nfs4filelayout.c index 4c78c62639e6..09119418402f 100644 --- a/fs/nfs/nfs4filelayout.c +++ b/fs/nfs/nfs4filelayout.c | |||
| @@ -122,7 +122,6 @@ static int filelayout_async_handle_error(struct rpc_task *task, | |||
| 122 | static int filelayout_read_done_cb(struct rpc_task *task, | 122 | static int filelayout_read_done_cb(struct rpc_task *task, |
| 123 | struct nfs_read_data *data) | 123 | struct nfs_read_data *data) |
| 124 | { | 124 | { |
| 125 | struct nfs_client *clp = data->ds_clp; | ||
| 126 | int reset = 0; | 125 | int reset = 0; |
| 127 | 126 | ||
| 128 | dprintk("%s DS read\n", __func__); | 127 | dprintk("%s DS read\n", __func__); |
| @@ -134,9 +133,8 @@ static int filelayout_read_done_cb(struct rpc_task *task, | |||
| 134 | if (reset) { | 133 | if (reset) { |
| 135 | pnfs_set_lo_fail(data->lseg); | 134 | pnfs_set_lo_fail(data->lseg); |
| 136 | nfs4_reset_read(task, data); | 135 | nfs4_reset_read(task, data); |
| 137 | clp = NFS_SERVER(data->inode)->nfs_client; | ||
| 138 | } | 136 | } |
| 139 | nfs_restart_rpc(task, clp); | 137 | rpc_restart_call_prepare(task); |
| 140 | return -EAGAIN; | 138 | return -EAGAIN; |
| 141 | } | 139 | } |
| 142 | 140 | ||
| @@ -203,17 +201,13 @@ static int filelayout_write_done_cb(struct rpc_task *task, | |||
| 203 | 201 | ||
| 204 | if (filelayout_async_handle_error(task, data->args.context->state, | 202 | if (filelayout_async_handle_error(task, data->args.context->state, |
| 205 | data->ds_clp, &reset) == -EAGAIN) { | 203 | data->ds_clp, &reset) == -EAGAIN) { |
| 206 | struct nfs_client *clp; | ||
| 207 | |||
| 208 | dprintk("%s calling restart ds_clp %p ds_clp->cl_session %p\n", | 204 | dprintk("%s calling restart ds_clp %p ds_clp->cl_session %p\n", |
| 209 | __func__, data->ds_clp, data->ds_clp->cl_session); | 205 | __func__, data->ds_clp, data->ds_clp->cl_session); |
| 210 | if (reset) { | 206 | if (reset) { |
| 211 | pnfs_set_lo_fail(data->lseg); | 207 | pnfs_set_lo_fail(data->lseg); |
| 212 | nfs4_reset_write(task, data); | 208 | nfs4_reset_write(task, data); |
| 213 | clp = NFS_SERVER(data->inode)->nfs_client; | 209 | } |
| 214 | } else | 210 | rpc_restart_call_prepare(task); |
| 215 | clp = data->ds_clp; | ||
| 216 | nfs_restart_rpc(task, clp); | ||
| 217 | return -EAGAIN; | 211 | return -EAGAIN; |
| 218 | } | 212 | } |
| 219 | 213 | ||
| @@ -245,7 +239,7 @@ static int filelayout_commit_done_cb(struct rpc_task *task, | |||
| 245 | prepare_to_resend_writes(data); | 239 | prepare_to_resend_writes(data); |
| 246 | pnfs_set_lo_fail(data->lseg); | 240 | pnfs_set_lo_fail(data->lseg); |
| 247 | } else | 241 | } else |
| 248 | nfs_restart_rpc(task, data->ds_clp); | 242 | rpc_restart_call_prepare(task); |
| 249 | return -EAGAIN; | 243 | return -EAGAIN; |
| 250 | } | 244 | } |
| 251 | 245 | ||
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index ba0da50865fe..d2ae413c986a 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c | |||
| @@ -3191,7 +3191,7 @@ static int nfs4_read_done_cb(struct rpc_task *task, struct nfs_read_data *data) | |||
| 3191 | struct nfs_server *server = NFS_SERVER(data->inode); | 3191 | struct nfs_server *server = NFS_SERVER(data->inode); |
| 3192 | 3192 | ||
| 3193 | if (nfs4_async_handle_error(task, server, data->args.context->state) == -EAGAIN) { | 3193 | if (nfs4_async_handle_error(task, server, data->args.context->state) == -EAGAIN) { |
| 3194 | nfs_restart_rpc(task, server->nfs_client); | 3194 | rpc_restart_call_prepare(task); |
| 3195 | return -EAGAIN; | 3195 | return -EAGAIN; |
| 3196 | } | 3196 | } |
| 3197 | 3197 | ||
| @@ -3241,7 +3241,7 @@ static int nfs4_write_done_cb(struct rpc_task *task, struct nfs_write_data *data | |||
| 3241 | struct inode *inode = data->inode; | 3241 | struct inode *inode = data->inode; |
| 3242 | 3242 | ||
| 3243 | if (nfs4_async_handle_error(task, NFS_SERVER(inode), data->args.context->state) == -EAGAIN) { | 3243 | if (nfs4_async_handle_error(task, NFS_SERVER(inode), data->args.context->state) == -EAGAIN) { |
| 3244 | nfs_restart_rpc(task, NFS_SERVER(inode)->nfs_client); | 3244 | rpc_restart_call_prepare(task); |
| 3245 | return -EAGAIN; | 3245 | return -EAGAIN; |
| 3246 | } | 3246 | } |
| 3247 | if (task->tk_status >= 0) { | 3247 | if (task->tk_status >= 0) { |
| @@ -3298,7 +3298,7 @@ static int nfs4_commit_done_cb(struct rpc_task *task, struct nfs_write_data *dat | |||
| 3298 | struct inode *inode = data->inode; | 3298 | struct inode *inode = data->inode; |
| 3299 | 3299 | ||
| 3300 | if (nfs4_async_handle_error(task, NFS_SERVER(inode), NULL) == -EAGAIN) { | 3300 | if (nfs4_async_handle_error(task, NFS_SERVER(inode), NULL) == -EAGAIN) { |
| 3301 | nfs_restart_rpc(task, NFS_SERVER(inode)->nfs_client); | 3301 | rpc_restart_call_prepare(task); |
| 3302 | return -EAGAIN; | 3302 | return -EAGAIN; |
| 3303 | } | 3303 | } |
| 3304 | nfs_refresh_inode(inode, data->res.fattr); | 3304 | nfs_refresh_inode(inode, data->res.fattr); |
| @@ -3838,7 +3838,7 @@ static void nfs4_delegreturn_done(struct rpc_task *task, void *calldata) | |||
| 3838 | default: | 3838 | default: |
| 3839 | if (nfs4_async_handle_error(task, data->res.server, NULL) == | 3839 | if (nfs4_async_handle_error(task, data->res.server, NULL) == |
| 3840 | -EAGAIN) { | 3840 | -EAGAIN) { |
| 3841 | nfs_restart_rpc(task, data->res.server->nfs_client); | 3841 | rpc_restart_call_prepare(task); |
| 3842 | return; | 3842 | return; |
| 3843 | } | 3843 | } |
| 3844 | } | 3844 | } |
| @@ -4092,8 +4092,7 @@ static void nfs4_locku_done(struct rpc_task *task, void *data) | |||
| 4092 | break; | 4092 | break; |
| 4093 | default: | 4093 | default: |
| 4094 | if (nfs4_async_handle_error(task, calldata->server, NULL) == -EAGAIN) | 4094 | if (nfs4_async_handle_error(task, calldata->server, NULL) == -EAGAIN) |
| 4095 | nfs_restart_rpc(task, | 4095 | rpc_restart_call_prepare(task); |
| 4096 | calldata->server->nfs_client); | ||
| 4097 | } | 4096 | } |
| 4098 | } | 4097 | } |
| 4099 | 4098 | ||
| @@ -4926,7 +4925,7 @@ static void nfs4_get_lease_time_done(struct rpc_task *task, void *calldata) | |||
| 4926 | task->tk_status = 0; | 4925 | task->tk_status = 0; |
| 4927 | /* fall through */ | 4926 | /* fall through */ |
| 4928 | case -NFS4ERR_RETRY_UNCACHED_REP: | 4927 | case -NFS4ERR_RETRY_UNCACHED_REP: |
| 4929 | nfs_restart_rpc(task, data->clp); | 4928 | rpc_restart_call_prepare(task); |
| 4930 | return; | 4929 | return; |
| 4931 | } | 4930 | } |
| 4932 | dprintk("<-- %s\n", __func__); | 4931 | dprintk("<-- %s\n", __func__); |
| @@ -5767,7 +5766,7 @@ static void nfs4_layoutreturn_done(struct rpc_task *task, void *calldata) | |||
| 5767 | 5766 | ||
| 5768 | server = NFS_SERVER(lrp->args.inode); | 5767 | server = NFS_SERVER(lrp->args.inode); |
| 5769 | if (nfs4_async_handle_error(task, server, NULL) == -EAGAIN) { | 5768 | if (nfs4_async_handle_error(task, server, NULL) == -EAGAIN) { |
| 5770 | nfs_restart_rpc(task, lrp->clp); | 5769 | rpc_restart_call_prepare(task); |
| 5771 | return; | 5770 | return; |
| 5772 | } | 5771 | } |
| 5773 | spin_lock(&lo->plh_inode->i_lock); | 5772 | spin_lock(&lo->plh_inode->i_lock); |
| @@ -5938,7 +5937,7 @@ nfs4_layoutcommit_done(struct rpc_task *task, void *calldata) | |||
| 5938 | } | 5937 | } |
| 5939 | 5938 | ||
| 5940 | if (nfs4_async_handle_error(task, server, NULL) == -EAGAIN) { | 5939 | if (nfs4_async_handle_error(task, server, NULL) == -EAGAIN) { |
| 5941 | nfs_restart_rpc(task, server->nfs_client); | 5940 | rpc_restart_call_prepare(task); |
| 5942 | return; | 5941 | return; |
| 5943 | } | 5942 | } |
| 5944 | 5943 | ||
diff --git a/fs/nfs/read.c b/fs/nfs/read.c index bfc20b160243..e866a7e6e2d5 100644 --- a/fs/nfs/read.c +++ b/fs/nfs/read.c | |||
| @@ -435,7 +435,7 @@ static void nfs_readpage_retry(struct rpc_task *task, struct nfs_read_data *data | |||
| 435 | argp->offset += resp->count; | 435 | argp->offset += resp->count; |
| 436 | argp->pgbase += resp->count; | 436 | argp->pgbase += resp->count; |
| 437 | argp->count -= resp->count; | 437 | argp->count -= resp->count; |
| 438 | nfs_restart_rpc(task, NFS_SERVER(data->inode)->nfs_client); | 438 | rpc_restart_call_prepare(task); |
| 439 | } | 439 | } |
| 440 | 440 | ||
| 441 | /* | 441 | /* |
diff --git a/fs/nfs/unlink.c b/fs/nfs/unlink.c index b2fbbde58e44..4f9319a2e567 100644 --- a/fs/nfs/unlink.c +++ b/fs/nfs/unlink.c | |||
| @@ -87,7 +87,7 @@ static void nfs_async_unlink_done(struct rpc_task *task, void *calldata) | |||
| 87 | struct inode *dir = data->dir; | 87 | struct inode *dir = data->dir; |
| 88 | 88 | ||
| 89 | if (!NFS_PROTO(dir)->unlink_done(task, dir)) | 89 | if (!NFS_PROTO(dir)->unlink_done(task, dir)) |
| 90 | nfs_restart_rpc(task, NFS_SERVER(dir)->nfs_client); | 90 | rpc_restart_call_prepare(task); |
| 91 | } | 91 | } |
| 92 | 92 | ||
| 93 | /** | 93 | /** |
| @@ -369,7 +369,7 @@ static void nfs_async_rename_done(struct rpc_task *task, void *calldata) | |||
| 369 | struct dentry *new_dentry = data->new_dentry; | 369 | struct dentry *new_dentry = data->new_dentry; |
| 370 | 370 | ||
| 371 | if (!NFS_PROTO(old_dir)->rename_done(task, old_dir, new_dir)) { | 371 | if (!NFS_PROTO(old_dir)->rename_done(task, old_dir, new_dir)) { |
| 372 | nfs_restart_rpc(task, NFS_SERVER(old_dir)->nfs_client); | 372 | rpc_restart_call_prepare(task); |
| 373 | return; | 373 | return; |
| 374 | } | 374 | } |
| 375 | 375 | ||
diff --git a/fs/nfs/write.c b/fs/nfs/write.c index 2084a6494218..ad90b0c998cb 100644 --- a/fs/nfs/write.c +++ b/fs/nfs/write.c | |||
| @@ -1305,7 +1305,7 @@ void nfs_writeback_done(struct rpc_task *task, struct nfs_write_data *data) | |||
| 1305 | */ | 1305 | */ |
| 1306 | argp->stable = NFS_FILE_SYNC; | 1306 | argp->stable = NFS_FILE_SYNC; |
| 1307 | } | 1307 | } |
| 1308 | nfs_restart_rpc(task, server->nfs_client); | 1308 | rpc_restart_call_prepare(task); |
| 1309 | return; | 1309 | return; |
| 1310 | } | 1310 | } |
| 1311 | if (time_before(complain, jiffies)) { | 1311 | if (time_before(complain, jiffies)) { |
diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index c5347d29cfb7..f0268ea7e711 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c | |||
| @@ -850,7 +850,9 @@ rpc_restart_call_prepare(struct rpc_task *task) | |||
| 850 | { | 850 | { |
| 851 | if (RPC_ASSASSINATED(task)) | 851 | if (RPC_ASSASSINATED(task)) |
| 852 | return 0; | 852 | return 0; |
| 853 | task->tk_action = rpc_prepare_task; | 853 | task->tk_action = call_start; |
| 854 | if (task->tk_ops->rpc_call_prepare != NULL) | ||
| 855 | task->tk_action = rpc_prepare_task; | ||
| 854 | return 1; | 856 | return 1; |
| 855 | } | 857 | } |
| 856 | EXPORT_SYMBOL_GPL(rpc_restart_call_prepare); | 858 | EXPORT_SYMBOL_GPL(rpc_restart_call_prepare); |
