Re: [pnfs] [RFC 27/85] nfs41: nfs4_setup_sequence

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Nov. 10, 2008, 22:22 +0200, Benny Halevy <bhalevy@xxxxxxxxxxx> wrote:
> Perform the nfs4_setup_sequence in the rpc_call_prepare state.
> 
> If a session slot is not available, we will rpc_sleep_on the
> slot wait queue leaving the tk_action as rpc_call_prepare.
> 
> Once we have a session slot, hang on to it even through rpc_restart_calls.
> Ensure the nfs41_sequence_res sr_slot pointer is NULL before rpc_run_task is
> called as nfs41_setup_sequence will only find a new slot if it is NULL.
> 
> A future patch will call free slot after any rpc_restart_calls, and handle the
> rpc restart that result from a sequence operation error.
> 
> Signed-off-by: Rahul Iyer <iyer@xxxxxxxxxx>
> Signed-off-by: Andy Adamson<andros@xxxxxxxxxx>
> Signed-off-by: Benny Halevy <bhalevy@xxxxxxxxxxx>
> 
> nfs41: simplify nfs4_call_sync
> 
> Signed-off-by: Benny Halevy <bhalevy@xxxxxxxxxxx>
> ---
>  fs/nfs/nfs4proc.c       |   93 +++++++++++++++++++++++++++++++++++++++++++++++
>  include/linux/nfs_xdr.h |    2 +-
>  2 files changed, 94 insertions(+), 1 deletions(-)
> 
> diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
> index 3b7c7fa..30f76e7 100644
> --- a/fs/nfs/nfs4proc.c
> +++ b/fs/nfs/nfs4proc.c
> @@ -347,6 +347,70 @@ nfs4_find_slot(struct nfs4_slot_table *tbl, struct rpc_task *task)
>  	return slot;
>  }
>  
> +static int nfs41_setup_sequence(struct nfs4_session *session,
> +				struct nfs41_sequence_args *args,
> +				struct nfs41_sequence_res *res,
> +				int cache_reply,
> +				struct rpc_task *task)
> +{
> +	/* stub */
> +	return 0;
> +}
> +
> +int nfs4_setup_sequence(struct nfs_client *clp,
> +			struct nfs41_sequence_args *args,
> +			struct nfs41_sequence_res *res,
> +			int cache_reply,
> +			struct rpc_task *task)
> +{
> +	int ret = 0;
> +
> +	dprintk("--> %s clp %p session %p cl_minorversion %d res->sr_slot %p\n",
> +		__func__, clp, clp->cl_session, clp->cl_minorversion,
> +		res->sr_slot);
> +
> +	if (clp->cl_minorversion == 0 || res->sr_slot)
> +		goto out;
> +	BUG_ON(clp->cl_minorversion != 1);
> +	ret = nfs41_setup_sequence(clp->cl_session, args, res,
> +				   cache_reply, task);
> +	if (ret) {
> +		memset(res, 0, sizeof(*res));
> +		if (ret != -EAGAIN) {
> +			/* terminate rpc task */
> +			task->tk_status = ret;
> +			task->tk_action = NULL;
> +		}
> +	}
> +out:
> +	dprintk("<-- %s status=%d\n", __func__, ret);
> +	return ret;
> +}
> +
> +struct nfs41_call_sync_data {
> +	struct nfs_server *server;
> +	struct rpc_message *msg;
> +	struct nfs41_sequence_args *seq_args;
> +	struct nfs41_sequence_res *seq_res;
> +	int cache_reply;
> +};
> +
> +static void nfs41_call_sync_prepare(struct rpc_task *task, void *calldata)
> +{
> +	struct nfs41_call_sync_data *data = calldata;
> +
> +	dprintk("--> %s data->server->session %p\n", __func__,
> +		data->server->nfs_client->cl_session);
> +	if (nfs4_setup_sequence(data->server->nfs_client, data->seq_args,
> +				data->seq_res, data->cache_reply, task))
> +		return;
> +	rpc_call_start(task);
> +}
> +
> +struct rpc_call_ops nfs41_call_sync_ops = {
> +	.rpc_call_prepare = nfs41_call_sync_prepare,
> +};
> +
>  #endif /* CONFIG_NFS_V4_1 */
>  
>  static int _nfs4_call_sync(struct nfs_server *server,
> @@ -355,6 +419,35 @@ static int _nfs4_call_sync(struct nfs_server *server,
>  			   struct nfs41_sequence_res *res,
>  			   int cache_reply)
>  {
> +#ifdef CONFIG_NFS_V4_1
> +	if (server->nfs_client->cl_minorversion) {
> +		int ret;
> +		struct rpc_task *task;
> +		struct nfs41_call_sync_data data = {
> +			.server = server,
> +			.msg = msg,
> +			.seq_args = args,
> +			.seq_res = res,
> +			.cache_reply = cache_reply,
> +		};
> +		struct rpc_task_setup task_setup = {
> +			.rpc_client = server->client,
> +			.rpc_message = msg,
> +			.callback_ops = &nfs41_call_sync_ops,
> +			.callback_data = &data
> +		};
> +
> +		res->sr_slot = NULL;
> +		task = rpc_run_task(&task_setup);
> +		if (IS_ERR(task))
> +			ret = PTR_ERR(task);
> +		else {
> +			ret = task->tk_status;
> +			rpc_put_task(task);
> +		}
> +		return ret;
> +	}
> +#endif /* CONFIG_NFS_V4_1 */

review 11-14: move out into _nfs4_call_sync_seq

>  	return rpc_call_sync(server->client, msg, 0);
>  }
>  
> diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h
> index b401477..1ec56e5 100644
> --- a/include/linux/nfs_xdr.h
> +++ b/include/linux/nfs_xdr.h
> @@ -134,7 +134,7 @@ struct nfs41_sequence_args {
>  #define SEQ4_STATUS_RESTART_RECLAIM_NEEDED	0x00000100
>  
>  struct nfs41_sequence_res {
> -	/* stub */
> +	struct nfs4_slot	*sr_slot;	/* slot used to send request */
>  };
>  
>  #if defined(CONFIG_NFS_V4_1)
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux