Re: [pnfs] [RFC 26/51] nfsd41: destroy_session operation

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

 



On Nov. 10, 2008, 22:49 +0200, Benny Halevy <bhalevy@xxxxxxxxxxx> wrote:
> Implement the destory_session operation confoming to
> http://tools.ietf.org/html/draft-ietf-nfsv4-minorversion1-26
> 
> Signed-off-by: Benny Halevy <bhalevy@xxxxxxxxxxx>
> ---
>  fs/nfsd/nfs4state.c       |   26 +++++++++++++++++++++++++-
>  fs/nfsd/nfs4xdr.c         |    7 +++++--
>  include/linux/nfsd/xdr4.h |    2 +-
>  3 files changed, 31 insertions(+), 4 deletions(-)
> 
> diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
> index 73bc8de..77b89b6 100644
> --- a/fs/nfsd/nfs4state.c
> +++ b/fs/nfsd/nfs4state.c
> @@ -1050,7 +1050,31 @@ nfsd4_destroy_session(struct svc_rqst *r,
>  		      struct nfsd4_compound_state *cstate,
>  		      struct nfsd4_destroy_session *sessionid)
>  {
> -	return -1;	/* stub */
> +	struct nfs41_session *ses;
> +	u32 status = nfserr_badsession;
> +
> +	/* Notes:
> +	 * - The confirmed nfs4_client->cl_sessionid holds destroyed sessinid
> +	 * - Should we return nfserr_back_chan_busy if waiting for
> +	 *   callbacks on to-be-destroyed session?
> +	 * - Do we need to clear any callback info from previous session?
> +	 */
> +
> +	dump_sessionid(__func__, &sessionid->sessionid);
> +	nfs4_lock_state();
> +	ses = find_in_sessionid_hashtbl(&sessionid->sessionid);
> +	if (!ses)
> +		goto out;
> +
> +	/* wait for callbacks */
> +	shutdown_callback_client(ses->se_client);

review 11-12: we need ref. counting for that backchannel
to support trunking.
clp->cl_callback.cb_client is shared?

> +
> +	destroy_session(ses);
> +	status = nfs_ok;
> +out:
> +	nfs4_unlock_state();
> +	dprintk("%s returns %d\n", __func__, ntohl(status));
> +	return status;
>  }
>  
>  __be32
> diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
> index 02c82d4..f49ddde 100644
> --- a/fs/nfsd/nfs4xdr.c
> +++ b/fs/nfsd/nfs4xdr.c
> @@ -1227,7 +1227,11 @@ static __be32
>  nfsd4_decode_destroy_session(struct nfsd4_compoundargs *argp,
>  			     struct nfsd4_destroy_session *destroy_session)
>  {
> -	return nfserr_opnotsupp;	/* stub */
> +	DECODE_HEAD;
> +	READ_BUF(NFS4_MAX_SESSIONID_LEN);
> +	COPYMEM(destroy_session->sessionid, NFS4_MAX_SESSIONID_LEN);
> +
> +	DECODE_TAIL;
>  }
>  
>  static __be32
> @@ -2990,7 +2994,6 @@ static __be32
>  nfsd4_encode_destroy_session(struct nfsd4_compoundres *resp, int nfserr,
>  			     struct nfsd4_destroy_session *destroy_session)
>  {
> -	/* stub */
>  	return nfserr;
>  }
>  
> diff --git a/include/linux/nfsd/xdr4.h b/include/linux/nfsd/xdr4.h
> index 75d93ab..8b166d8 100644
> --- a/include/linux/nfsd/xdr4.h
> +++ b/include/linux/nfsd/xdr4.h
> @@ -390,7 +390,7 @@ struct nfsd4_sequence {
>  };
>  
>  struct nfsd4_destroy_session {
> -	int	foo;	/* stub */
> +	nfs41_sessionid		sessionid;
>  };
>  #endif /* CONFIG_NFSD_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