diff options
Diffstat (limited to 'fs/nfs/nfs4proc.c')
-rw-r--r-- | fs/nfs/nfs4proc.c | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index a23110d1d2a9..6ef50aa785d5 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c | |||
@@ -644,6 +644,19 @@ static void nfs4_sequence_done(const struct nfs_server *server, | |||
644 | #endif /* CONFIG_NFS_V4_1 */ | 644 | #endif /* CONFIG_NFS_V4_1 */ |
645 | } | 645 | } |
646 | 646 | ||
647 | void nfs4_restart_rpc(struct rpc_task *task, const struct nfs_client *clp, | ||
648 | struct nfs4_sequence_res *res) | ||
649 | { | ||
650 | #ifdef CONFIG_NFS_V4_1 | ||
651 | if (nfs4_has_session(clp)) { | ||
652 | nfs41_sequence_free_slot(clp, res); | ||
653 | rpc_restart_call_prepare(task); | ||
654 | return; | ||
655 | } | ||
656 | #endif /* CONFIG_NFS_V4_1 */ | ||
657 | rpc_restart_call(task); | ||
658 | } | ||
659 | |||
647 | /* no restart, therefore free slot here */ | 660 | /* no restart, therefore free slot here */ |
648 | static void nfs4_sequence_done_free_slot(const struct nfs_server *server, | 661 | static void nfs4_sequence_done_free_slot(const struct nfs_server *server, |
649 | struct nfs4_sequence_res *res, | 662 | struct nfs4_sequence_res *res, |
@@ -1750,7 +1763,8 @@ static void nfs4_close_done(struct rpc_task *task, void *data) | |||
1750 | break; | 1763 | break; |
1751 | default: | 1764 | default: |
1752 | if (nfs4_async_handle_error(task, server, state) == -EAGAIN) { | 1765 | if (nfs4_async_handle_error(task, server, state) == -EAGAIN) { |
1753 | nfs4_restart_rpc(task, server->nfs_client); | 1766 | nfs4_restart_rpc(task, server->nfs_client, |
1767 | &calldata->res.seq_res); | ||
1754 | return; | 1768 | return; |
1755 | } | 1769 | } |
1756 | } | 1770 | } |
@@ -2988,7 +3002,7 @@ static int nfs4_read_done(struct rpc_task *task, struct nfs_read_data *data) | |||
2988 | nfs4_sequence_done(server, &data->res.seq_res, task->tk_status); | 3002 | nfs4_sequence_done(server, &data->res.seq_res, task->tk_status); |
2989 | 3003 | ||
2990 | if (nfs4_async_handle_error(task, server, data->args.context->state) == -EAGAIN) { | 3004 | if (nfs4_async_handle_error(task, server, data->args.context->state) == -EAGAIN) { |
2991 | nfs4_restart_rpc(task, server->nfs_client); | 3005 | nfs4_restart_rpc(task, server->nfs_client, &data->res.seq_res); |
2992 | return -EAGAIN; | 3006 | return -EAGAIN; |
2993 | } | 3007 | } |
2994 | 3008 | ||
@@ -3013,7 +3027,8 @@ static int nfs4_write_done(struct rpc_task *task, struct nfs_write_data *data) | |||
3013 | task->tk_status); | 3027 | task->tk_status); |
3014 | 3028 | ||
3015 | if (nfs4_async_handle_error(task, NFS_SERVER(inode), data->args.context->state) == -EAGAIN) { | 3029 | if (nfs4_async_handle_error(task, NFS_SERVER(inode), data->args.context->state) == -EAGAIN) { |
3016 | nfs4_restart_rpc(task, NFS_SERVER(inode)->nfs_client); | 3030 | nfs4_restart_rpc(task, NFS_SERVER(inode)->nfs_client, |
3031 | &data->res.seq_res); | ||
3017 | return -EAGAIN; | 3032 | return -EAGAIN; |
3018 | } | 3033 | } |
3019 | if (task->tk_status >= 0) { | 3034 | if (task->tk_status >= 0) { |
@@ -3041,7 +3056,8 @@ static int nfs4_commit_done(struct rpc_task *task, struct nfs_write_data *data) | |||
3041 | nfs4_sequence_done(NFS_SERVER(inode), &data->res.seq_res, | 3056 | nfs4_sequence_done(NFS_SERVER(inode), &data->res.seq_res, |
3042 | task->tk_status); | 3057 | task->tk_status); |
3043 | if (nfs4_async_handle_error(task, NFS_SERVER(inode), NULL) == -EAGAIN) { | 3058 | if (nfs4_async_handle_error(task, NFS_SERVER(inode), NULL) == -EAGAIN) { |
3044 | nfs4_restart_rpc(task, NFS_SERVER(inode)->nfs_client); | 3059 | nfs4_restart_rpc(task, NFS_SERVER(inode)->nfs_client, |
3060 | &data->res.seq_res); | ||
3045 | return -EAGAIN; | 3061 | return -EAGAIN; |
3046 | } | 3062 | } |
3047 | nfs4_sequence_free_slot(NFS_SERVER(inode)->nfs_client, | 3063 | nfs4_sequence_free_slot(NFS_SERVER(inode)->nfs_client, |
@@ -3755,7 +3771,8 @@ static void nfs4_locku_done(struct rpc_task *task, void *data) | |||
3755 | default: | 3771 | default: |
3756 | if (nfs4_async_handle_error(task, calldata->server, NULL) == -EAGAIN) | 3772 | if (nfs4_async_handle_error(task, calldata->server, NULL) == -EAGAIN) |
3757 | nfs4_restart_rpc(task, | 3773 | nfs4_restart_rpc(task, |
3758 | calldata->server->nfs_client); | 3774 | calldata->server->nfs_client, |
3775 | &calldata->res.seq_res); | ||
3759 | } | 3776 | } |
3760 | nfs4_sequence_free_slot(calldata->server->nfs_client, | 3777 | nfs4_sequence_free_slot(calldata->server->nfs_client, |
3761 | &calldata->res.seq_res); | 3778 | &calldata->res.seq_res); |
@@ -4890,7 +4907,7 @@ void nfs41_sequence_call_done(struct rpc_task *task, void *data) | |||
4890 | 4907 | ||
4891 | if (_nfs4_async_handle_error(task, NULL, clp, NULL) | 4908 | if (_nfs4_async_handle_error(task, NULL, clp, NULL) |
4892 | == -EAGAIN) { | 4909 | == -EAGAIN) { |
4893 | nfs4_restart_rpc(task, clp); | 4910 | nfs4_restart_rpc(task, clp, task->tk_msg.rpc_resp); |
4894 | return; | 4911 | return; |
4895 | } | 4912 | } |
4896 | } | 4913 | } |