Skip to content
Snippets Groups Projects
nfs4xdr.c 189 KiB
Newer Older
  • Learn to ignore specific revisions
  • 	status = decode_sequence(xdr, &res->seq_res, rqstp);
    
    	if (status)
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    		goto out;
    
    	status = decode_putfh(xdr);
    	if (status)
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    		goto out;
    
    	status = decode_savefh(xdr);
    	if (status)
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    		goto out;
    
    	status = decode_putfh(xdr);
    	if (status)
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    		goto out;
    
    	status = decode_rename(xdr, &res->old_cinfo, &res->new_cinfo);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    out:
    	return status;
    }
    
    /*
     * Decode LINK response
     */
    
    static int nfs4_xdr_dec_link(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
    			     struct nfs4_link_res *res)
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    {
    	struct compound_hdr hdr;
    	int status;
    
    	status = decode_compound_hdr(xdr, &hdr);
    
    	if (status)
    		goto out;
    
    	status = decode_sequence(xdr, &res->seq_res, rqstp);
    
    	if (status)
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    		goto out;
    
    	status = decode_putfh(xdr);
    	if (status)
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    		goto out;
    
    	status = decode_savefh(xdr);
    	if (status)
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    		goto out;
    
    	status = decode_putfh(xdr);
    	if (status)
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    		goto out;
    
    	status = decode_link(xdr, &res->cinfo);
    	if (status)
    
    		goto out;
    	/*
    	 * Note order: OP_LINK leaves the directory as the current
    	 *             filehandle.
    	 */
    
    	status = decode_restorefh(xdr);
    	if (status)
    
    	decode_getfattr(xdr, res->fattr, res->server);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    out:
    	return status;
    }
    
    /*
     * Decode CREATE response
     */
    
    static int nfs4_xdr_dec_create(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
    			       struct nfs4_create_res *res)
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    {
    	struct compound_hdr hdr;
    	int status;
    
    	status = decode_compound_hdr(xdr, &hdr);
    
    	if (status)
    		goto out;
    
    	status = decode_sequence(xdr, &res->seq_res, rqstp);
    
    	if (status)
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    		goto out;
    
    	status = decode_putfh(xdr);
    	if (status)
    
    	status = decode_create(xdr, &res->dir_cinfo);
    	if (status)
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    		goto out;
    
    	status = decode_getfh(xdr, res->fh);
    	if (status)
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    		goto out;
    
    	decode_getfattr(xdr, res->fattr, res->server);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    out:
    	return status;
    }
    
    /*
     * Decode SYMLINK response
     */
    
    static int nfs4_xdr_dec_symlink(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
    				struct nfs4_create_res *res)
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    {
    
    	return nfs4_xdr_dec_create(rqstp, xdr, res);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    }
    
    /*
     * Decode GETATTR response
     */
    
    static int nfs4_xdr_dec_getattr(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
    				struct nfs4_getattr_res *res)
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    {
    	struct compound_hdr hdr;
    	int status;
    
    	status = decode_compound_hdr(xdr, &hdr);
    
    	if (status)
    		goto out;
    
    	status = decode_sequence(xdr, &res->seq_res, rqstp);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    	if (status)
    		goto out;
    
    	status = decode_putfh(xdr);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    	if (status)
    		goto out;
    
    	status = decode_getfattr(xdr, res->fattr, res->server);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    out:
    	return status;
    }
    
    
    static void nfs4_xdr_enc_setacl(struct rpc_rqst *req, struct xdr_stream *xdr,
    				struct nfs_setaclargs *args)
    
    Andy Adamson's avatar
    Andy Adamson committed
    	struct compound_hdr hdr = {
    
    		.minorversion = nfs4_xdr_minorversion(&args->seq_args),
    
    	encode_compound_hdr(xdr, req, &hdr);
    	encode_sequence(xdr, &args->seq_args, &hdr);
    	encode_putfh(xdr, args->fh, &hdr);
    	encode_setacl(xdr, args, &hdr);
    
    /*
     * Decode SETACL response
     */
    static int
    
    nfs4_xdr_dec_setacl(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
    
    Benny Halevy's avatar
    Benny Halevy committed
    		    struct nfs_setaclres *res)
    
    	status = decode_compound_hdr(xdr, &hdr);
    
    	if (status)
    		goto out;
    
    	status = decode_sequence(xdr, &res->seq_res, rqstp);
    
    	status = decode_putfh(xdr);
    
    	status = decode_setattr(xdr);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    
    
    /*
     * Decode GETACL response
     */
    static int
    
    nfs4_xdr_dec_getacl(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
    
    Benny Halevy's avatar
    Benny Halevy committed
    		    struct nfs_getaclres *res)
    
    	if (res->acl_scratch != NULL) {
    		void *p = page_address(res->acl_scratch);
    		xdr_set_scratch_buffer(xdr, p, PAGE_SIZE);
    	}
    
    	status = decode_compound_hdr(xdr, &hdr);
    
    	if (status)
    		goto out;
    
    	status = decode_sequence(xdr, &res->seq_res, rqstp);
    
    	status = decode_putfh(xdr);
    
    	status = decode_getacl(xdr, rqstp, res);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    /*
     * Decode CLOSE response
     */
    
    static int nfs4_xdr_dec_close(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
    			      struct nfs_closeres *res)
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    {
    
    Andy Adamson's avatar
    Andy Adamson committed
    	struct compound_hdr hdr;
    	int status;
    
    
    	status = decode_compound_hdr(xdr, &hdr);
    
    	if (status)
    		goto out;
    
    	status = decode_sequence(xdr, &res->seq_res, rqstp);
    
    Andy Adamson's avatar
    Andy Adamson committed
    	if (status)
    		goto out;
    
    	status = decode_putfh(xdr);
    
    Andy Adamson's avatar
    Andy Adamson committed
    	if (status)
    		goto out;
    
    	status = decode_close(xdr, res);
    
    	if (status != 0)
    		goto out;
    	/*
    	 * Note: Server may do delete on close for this file
    	 * 	in which case the getattr call will fail with
    	 * 	an ESTALE error. Shouldn't be a problem,
    	 * 	though, since fattr->valid will remain unset.
    	 */
    
    	decode_getfattr(xdr, res->fattr, res->server);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    out:
    
    Andy Adamson's avatar
    Andy Adamson committed
    	return status;
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    }
    
    /*
     * Decode OPEN response
     */
    
    static int nfs4_xdr_dec_open(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
    			     struct nfs_openres *res)
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    {
    
    Andy Adamson's avatar
    Andy Adamson committed
    	struct compound_hdr hdr;
    	int status;
    
    
    	status = decode_compound_hdr(xdr, &hdr);
    
    	if (status)
    		goto out;
    
    	status = decode_sequence(xdr, &res->seq_res, rqstp);
    
    Andy Adamson's avatar
    Andy Adamson committed
    	if (status)
    		goto out;
    
    	status = decode_putfh(xdr);
    
    Andy Adamson's avatar
    Andy Adamson committed
    	if (status)
    		goto out;
    
    	status = decode_open(xdr, res);
    
    	status = decode_getfh(xdr, &res->fh);
    	if (status)
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    		goto out;
    
    	if (res->access_request)
    		decode_access(xdr, &res->access_supported, &res->access_result);
    
    	decode_getfattr(xdr, res->f_attr, res->server);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    out:
    
    Andy Adamson's avatar
    Andy Adamson committed
    	return status;
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    }
    
    /*
     * Decode OPEN_CONFIRM response
     */
    
    static int nfs4_xdr_dec_open_confirm(struct rpc_rqst *rqstp,
    				     struct xdr_stream *xdr,
    				     struct nfs_open_confirmres *res)
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    {
    
    Andy Adamson's avatar
    Andy Adamson committed
    	struct compound_hdr hdr;
    	int status;
    
    
    	status = decode_compound_hdr(xdr, &hdr);
    
    Andy Adamson's avatar
    Andy Adamson committed
    	if (status)
    		goto out;
    
    	status = decode_putfh(xdr);
    
    Andy Adamson's avatar
    Andy Adamson committed
    	if (status)
    		goto out;
    
    	status = decode_open_confirm(xdr, res);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    out:
    
    Andy Adamson's avatar
    Andy Adamson committed
    	return status;
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    }
    
    /*
     * Decode OPEN response
     */
    
    static int nfs4_xdr_dec_open_noattr(struct rpc_rqst *rqstp,
    				    struct xdr_stream *xdr,
    				    struct nfs_openres *res)
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    {
    
    Andy Adamson's avatar
    Andy Adamson committed
    	struct compound_hdr hdr;
    	int status;
    
    
    	status = decode_compound_hdr(xdr, &hdr);
    
    	if (status)
    		goto out;
    
    	status = decode_sequence(xdr, &res->seq_res, rqstp);
    
    Andy Adamson's avatar
    Andy Adamson committed
    	if (status)
    		goto out;
    
    	status = decode_putfh(xdr);
    
    Andy Adamson's avatar
    Andy Adamson committed
    	if (status)
    		goto out;
    
    	status = decode_open(xdr, res);
    
    Andy Adamson's avatar
    Andy Adamson committed
    	if (status)
    		goto out;
    
    	if (res->access_request)
    		decode_access(xdr, &res->access_supported, &res->access_result);
    
    	decode_getfattr(xdr, res->f_attr, res->server);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    out:
    
    Andy Adamson's avatar
    Andy Adamson committed
    	return status;
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    }
    
    /*
     * Decode SETATTR response
     */
    
    static int nfs4_xdr_dec_setattr(struct rpc_rqst *rqstp,
    				struct xdr_stream *xdr,
    				struct nfs_setattrres *res)
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    {
    
    Andy Adamson's avatar
    Andy Adamson committed
    	struct compound_hdr hdr;
    	int status;
    
    
    	status = decode_compound_hdr(xdr, &hdr);
    
    	if (status)
    		goto out;
    
    	status = decode_sequence(xdr, &res->seq_res, rqstp);
    
    Andy Adamson's avatar
    Andy Adamson committed
    	if (status)
    		goto out;
    
    	status = decode_putfh(xdr);
    
    Andy Adamson's avatar
    Andy Adamson committed
    	if (status)
    		goto out;
    
    	status = decode_setattr(xdr);
    
    Andy Adamson's avatar
    Andy Adamson committed
    	if (status)
    		goto out;
    
    	decode_getfattr(xdr, res->fattr, res->server);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    out:
    
    Andy Adamson's avatar
    Andy Adamson committed
    	return status;
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    }
    
    /*
     * Decode LOCK response
     */
    
    static int nfs4_xdr_dec_lock(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
    			     struct nfs_lock_res *res)
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    {
    	struct compound_hdr hdr;
    	int status;
    
    
    	status = decode_compound_hdr(xdr, &hdr);
    
    	if (status)
    		goto out;
    
    	status = decode_sequence(xdr, &res->seq_res, rqstp);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    	if (status)
    		goto out;
    
    	status = decode_putfh(xdr);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    	if (status)
    		goto out;
    
    	status = decode_lock(xdr, res);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    out:
    	return status;
    }
    
    /*
     * Decode LOCKT response
     */
    
    static int nfs4_xdr_dec_lockt(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
    			      struct nfs_lockt_res *res)
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    {
    	struct compound_hdr hdr;
    	int status;
    
    
    	status = decode_compound_hdr(xdr, &hdr);
    
    	if (status)
    		goto out;
    
    	status = decode_sequence(xdr, &res->seq_res, rqstp);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    	if (status)
    		goto out;
    
    	status = decode_putfh(xdr);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    	if (status)
    		goto out;
    
    	status = decode_lockt(xdr, res);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    out:
    	return status;
    }
    
    /*
     * Decode LOCKU response
     */
    
    static int nfs4_xdr_dec_locku(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
    			      struct nfs_locku_res *res)
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    {
    	struct compound_hdr hdr;
    	int status;
    
    
    	status = decode_compound_hdr(xdr, &hdr);
    
    	if (status)
    		goto out;
    
    	status = decode_sequence(xdr, &res->seq_res, rqstp);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    	if (status)
    		goto out;
    
    	status = decode_putfh(xdr);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    	if (status)
    		goto out;
    
    	status = decode_locku(xdr, res);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    out:
    	return status;
    }
    
    
    static int nfs4_xdr_dec_release_lockowner(struct rpc_rqst *rqstp,
    					  struct xdr_stream *xdr, void *dummy)
    
    	status = decode_compound_hdr(xdr, &hdr);
    
    		status = decode_release_lockowner(xdr);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    /*
     * Decode READLINK response
     */
    
    static int nfs4_xdr_dec_readlink(struct rpc_rqst *rqstp,
    				 struct xdr_stream *xdr,
    
    				 struct nfs4_readlink_res *res)
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    {
    	struct compound_hdr hdr;
    	int status;
    
    
    	status = decode_compound_hdr(xdr, &hdr);
    
    	if (status)
    		goto out;
    
    	status = decode_sequence(xdr, &res->seq_res, rqstp);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    	if (status)
    		goto out;
    
    	status = decode_putfh(xdr);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    	if (status)
    		goto out;
    
    	status = decode_readlink(xdr, rqstp);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    out:
    	return status;
    }
    
    /*
     * Decode READDIR response
     */
    
    static int nfs4_xdr_dec_readdir(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
    				struct nfs4_readdir_res *res)
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    {
    	struct compound_hdr hdr;
    	int status;
    
    
    	status = decode_compound_hdr(xdr, &hdr);
    
    	if (status)
    		goto out;
    
    	status = decode_sequence(xdr, &res->seq_res, rqstp);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    	if (status)
    		goto out;
    
    	status = decode_putfh(xdr);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    	if (status)
    		goto out;
    
    	status = decode_readdir(xdr, rqstp, res);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    out:
    	return status;
    }
    
    /*
     * Decode Read response
     */
    
    static int nfs4_xdr_dec_read(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
    			     struct nfs_readres *res)
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    {
    	struct compound_hdr hdr;
    	int status;
    
    
    	status = decode_compound_hdr(xdr, &hdr);
    
    	if (status)
    		goto out;
    
    	status = decode_sequence(xdr, &res->seq_res, rqstp);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    	if (status)
    		goto out;
    
    	status = decode_putfh(xdr);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    	if (status)
    		goto out;
    
    	status = decode_read(xdr, rqstp, res);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    	if (!status)
    		status = res->count;
    out:
    	return status;
    }
    
    /*
     * Decode WRITE response
     */
    
    static int nfs4_xdr_dec_write(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
    			      struct nfs_writeres *res)
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    {
    	struct compound_hdr hdr;
    	int status;
    
    
    	status = decode_compound_hdr(xdr, &hdr);
    
    	if (status)
    		goto out;
    
    	status = decode_sequence(xdr, &res->seq_res, rqstp);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    	if (status)
    		goto out;
    
    	status = decode_putfh(xdr);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    	if (status)
    		goto out;
    
    	status = decode_write(xdr, res);
    
    	if (res->fattr)
    
    		decode_getfattr(xdr, res->fattr, res->server);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    	if (!status)
    		status = res->count;
    out:
    	return status;
    }
    
    /*
     * Decode COMMIT response
     */
    
    static int nfs4_xdr_dec_commit(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    {
    	struct compound_hdr hdr;
    	int status;
    
    
    	status = decode_compound_hdr(xdr, &hdr);
    
    	if (status)
    		goto out;
    
    	status = decode_sequence(xdr, &res->seq_res, rqstp);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    	if (status)
    		goto out;
    
    	status = decode_putfh(xdr);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    	if (status)
    		goto out;
    
    	status = decode_commit(xdr, res);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    out:
    	return status;
    }
    
    /*
    
     * Decode FSINFO response
    
    Linus Torvalds's avatar
    Linus Torvalds committed
     */
    
    static int nfs4_xdr_dec_fsinfo(struct rpc_rqst *req, struct xdr_stream *xdr,
    
    Benny Halevy's avatar
    Benny Halevy committed
    			       struct nfs4_fsinfo_res *res)
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    {
    	struct compound_hdr hdr;
    	int status;
    
    
    	status = decode_compound_hdr(xdr, &hdr);
    
    	if (!status)
    
    		status = decode_sequence(xdr, &res->seq_res, req);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    	if (!status)
    
    		status = decode_putfh(xdr);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    	if (!status)
    
    		status = decode_fsinfo(xdr, res->fsinfo);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    	return status;
    }
    
    /*
    
     * Decode PATHCONF response
    
    Linus Torvalds's avatar
    Linus Torvalds committed
     */
    
    static int nfs4_xdr_dec_pathconf(struct rpc_rqst *req, struct xdr_stream *xdr,
    
    				 struct nfs4_pathconf_res *res)
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    {
    	struct compound_hdr hdr;
    	int status;
    
    
    	status = decode_compound_hdr(xdr, &hdr);
    
    	if (!status)
    
    		status = decode_sequence(xdr, &res->seq_res, req);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    	if (!status)
    
    		status = decode_putfh(xdr);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    	if (!status)
    
    		status = decode_pathconf(xdr, res->pathconf);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    	return status;
    }
    
    /*
    
     * Decode STATFS response
    
    Linus Torvalds's avatar
    Linus Torvalds committed
     */
    
    static int nfs4_xdr_dec_statfs(struct rpc_rqst *req, struct xdr_stream *xdr,
    
    Benny Halevy's avatar
    Benny Halevy committed
    			       struct nfs4_statfs_res *res)
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    {
    	struct compound_hdr hdr;
    	int status;
    
    
    	status = decode_compound_hdr(xdr, &hdr);
    
    	if (!status)
    
    		status = decode_sequence(xdr, &res->seq_res, req);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    	if (!status)
    
    		status = decode_putfh(xdr);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    	if (!status)
    
    		status = decode_statfs(xdr, res->fsstat);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    	return status;
    }
    
    /*
    
     * Decode GETATTR_BITMAP response
    
    Linus Torvalds's avatar
    Linus Torvalds committed
     */
    
    static int nfs4_xdr_dec_server_caps(struct rpc_rqst *req,
    				    struct xdr_stream *xdr,
    				    struct nfs4_server_caps_res *res)
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    {
    	struct compound_hdr hdr;
    	int status;
    
    
    	status = decode_compound_hdr(xdr, &hdr);
    
    	if (status)
    		goto out;
    
    	status = decode_sequence(xdr, &res->seq_res, req);
    
    	if (status)
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    		goto out;
    
    	status = decode_putfh(xdr);
    	if (status)
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    		goto out;
    
    	status = decode_server_caps(xdr, res);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    out:
    	return status;
    }
    
    /*
     * Decode RENEW response
     */
    
    static int nfs4_xdr_dec_renew(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
    			      void *__unused)
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    {
    	struct compound_hdr hdr;
    	int status;
    
    
    	status = decode_compound_hdr(xdr, &hdr);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    	if (!status)
    
    		status = decode_renew(xdr);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    	return status;
    }
    
    /*
    
     * Decode SETCLIENTID response
    
    Linus Torvalds's avatar
    Linus Torvalds committed
     */
    
    static int nfs4_xdr_dec_setclientid(struct rpc_rqst *req,
    				    struct xdr_stream *xdr,
    				    struct nfs4_setclientid_res *res)
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    {
    	struct compound_hdr hdr;
    	int status;
    
    
    	status = decode_compound_hdr(xdr, &hdr);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    	if (!status)
    
    		status = decode_setclientid(xdr, res);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    	return status;
    }
    
    /*
    
     * Decode SETCLIENTID_CONFIRM response
    
    Linus Torvalds's avatar
    Linus Torvalds committed
     */
    
    static int nfs4_xdr_dec_setclientid_confirm(struct rpc_rqst *req,
    					    struct xdr_stream *xdr,
    					    struct nfs_fsinfo *fsinfo)
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    {
    	struct compound_hdr hdr;
    	int status;
    
    
    	status = decode_compound_hdr(xdr, &hdr);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    	if (!status)
    
    		status = decode_setclientid_confirm(xdr);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    	if (!status)
    
    		status = decode_putrootfh(xdr);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    	if (!status)
    
    		status = decode_fsinfo(xdr, fsinfo);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    	return status;
    }
    
    /*
    
     * Decode DELEGRETURN response
    
    Linus Torvalds's avatar
    Linus Torvalds committed
     */
    
    static int nfs4_xdr_dec_delegreturn(struct rpc_rqst *rqstp,
    				    struct xdr_stream *xdr,
    				    struct nfs4_delegreturnres *res)
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    {
    	struct compound_hdr hdr;
    	int status;
    
    
    	status = decode_compound_hdr(xdr, &hdr);
    
    	if (status)
    		goto out;
    
    	status = decode_sequence(xdr, &res->seq_res, rqstp);
    
    	if (status)
    
    	status = decode_putfh(xdr);
    
    	if (status != 0)
    		goto out;
    
    	status = decode_getfattr(xdr, res->fattr, res->server);
    
    	status = decode_delegreturn(xdr);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    	return status;
    }
    
    
     * Decode FS_LOCATIONS response
    
    static int nfs4_xdr_dec_fs_locations(struct rpc_rqst *req,
    				     struct xdr_stream *xdr,
    
    				     struct nfs4_fs_locations_res *res)
    
    {
    	struct compound_hdr hdr;
    	int status;
    
    
    	status = decode_compound_hdr(xdr, &hdr);
    
    	if (status)
    		goto out;
    
    	status = decode_sequence(xdr, &res->seq_res, req);
    
    	if (status)
    
    	status = decode_putfh(xdr);
    	if (status)
    
    	status = decode_lookup(xdr);
    	if (status)
    
    	xdr_enter_page(xdr, PAGE_SIZE);
    
    	status = decode_getfattr_generic(xdr, &res->fs_locations->fattr,
    					 NULL, res->fs_locations,
    					 res->fs_locations->server);
    
    /*
     * Decode SECINFO response
     */
    static int nfs4_xdr_dec_secinfo(struct rpc_rqst *rqstp,
    				struct xdr_stream *xdr,
    				struct nfs4_secinfo_res *res)
    {
    	struct compound_hdr hdr;
    	int status;
    
    	status = decode_compound_hdr(xdr, &hdr);
    	if (status)
    		goto out;
    	status = decode_sequence(xdr, &res->seq_res, rqstp);
    	if (status)
    		goto out;
    	status = decode_putfh(xdr);
    	if (status)
    		goto out;
    	status = decode_secinfo(xdr, res);
    out:
    	return status;
    }
    
    
    #if defined(CONFIG_NFS_V4_1)
    
    /*
     * Decode BIND_CONN_TO_SESSION response
     */
    static int nfs4_xdr_dec_bind_conn_to_session(struct rpc_rqst *rqstp,
    					struct xdr_stream *xdr,
    					void *res)
    {
    	struct compound_hdr hdr;
    	int status;
    
    	status = decode_compound_hdr(xdr, &hdr);
    	if (!status)
    		status = decode_bind_conn_to_session(xdr, res);
    	return status;
    }
    
    
     * Decode EXCHANGE_ID response
    
    static int nfs4_xdr_dec_exchange_id(struct rpc_rqst *rqstp,
    				    struct xdr_stream *xdr,
    
    				    void *res)
    {
    	struct compound_hdr hdr;
    	int status;
    
    
    	status = decode_compound_hdr(xdr, &hdr);
    
    	if (!status)
    
    		status = decode_exchange_id(xdr, res);
    
    	return status;
    }
    
     * Decode CREATE_SESSION response
    
    static int nfs4_xdr_dec_create_session(struct rpc_rqst *rqstp,
    				       struct xdr_stream *xdr,
    
    				       struct nfs41_create_session_res *res)
    {
    	struct compound_hdr hdr;
    	int status;
    
    
    	status = decode_compound_hdr(xdr, &hdr);
    
    	if (!status)
    
    		status = decode_create_session(xdr, res);
    
     * Decode DESTROY_SESSION response
    
    static int nfs4_xdr_dec_destroy_session(struct rpc_rqst *rqstp,
    					struct xdr_stream *xdr,
    					void *res)
    
    {
    	struct compound_hdr hdr;
    	int status;
    
    
    	status = decode_compound_hdr(xdr, &hdr);
    
    	if (!status)
    
    		status = decode_destroy_session(xdr, res);
    
    /*
     * Decode DESTROY_CLIENTID response
     */
    static int nfs4_xdr_dec_destroy_clientid(struct rpc_rqst *rqstp,
    					struct xdr_stream *xdr,
    					void *res)
    {
    	struct compound_hdr hdr;
    	int status;
    
    	status = decode_compound_hdr(xdr, &hdr);
    	if (!status)
    		status = decode_destroy_clientid(xdr, res);
    	return status;
    }
    
    
     * Decode SEQUENCE response
    
    static int nfs4_xdr_dec_sequence(struct rpc_rqst *rqstp,
    				 struct xdr_stream *xdr,
    
    Andy Adamson's avatar
    Andy Adamson committed
    				 struct nfs4_sequence_res *res)
    {
    	struct compound_hdr hdr;
    	int status;
    
    
    	status = decode_compound_hdr(xdr, &hdr);
    
    Andy Adamson's avatar
    Andy Adamson committed
    	if (!status)
    
    		status = decode_sequence(xdr, res, rqstp);
    
    Andy Adamson's avatar
    Andy Adamson committed
    	return status;
    }
    
    
    Andy Adamson's avatar
    Andy Adamson committed
    /*
    
     * Decode GET_LEASE_TIME response
    
    Andy Adamson's avatar
    Andy Adamson committed
     */
    
    static int nfs4_xdr_dec_get_lease_time(struct rpc_rqst *rqstp,
    				       struct xdr_stream *xdr,
    
    Andy Adamson's avatar
    Andy Adamson committed
    				       struct nfs4_get_lease_time_res *res)
    {
    	struct compound_hdr hdr;
    	int status;
    
    
    	status = decode_compound_hdr(xdr, &hdr);
    
    Andy Adamson's avatar
    Andy Adamson committed
    	if (!status)
    
    		status = decode_sequence(xdr, &res->lr_seq_res, rqstp);
    
    Andy Adamson's avatar
    Andy Adamson committed
    	if (!status)
    
    		status = decode_putrootfh(xdr);
    
    Andy Adamson's avatar
    Andy Adamson committed
    	if (!status)
    
    		status = decode_fsinfo(xdr, res->lr_fsinfo);
    
    Andy Adamson's avatar
    Andy Adamson committed
    	return status;
    }
    
    
    /*
     * Decode RECLAIM_COMPLETE response
     */
    
    static int nfs4_xdr_dec_reclaim_complete(struct rpc_rqst *rqstp,
    					 struct xdr_stream *xdr,
    
    					 struct nfs41_reclaim_complete_res *res)
    {
    	struct compound_hdr hdr;
    	int status;
    
    
    	status = decode_compound_hdr(xdr, &hdr);
    
    		status = decode_sequence(xdr, &res->seq_res, rqstp);
    
    		status = decode_reclaim_complete(xdr, (void *)NULL);
    
    Andy Adamson's avatar
    Andy Adamson committed
    /*
     * Decode GETDEVICELIST response
     */
    static int nfs4_xdr_dec_getdevicelist(struct rpc_rqst *rqstp,
    				      struct xdr_stream *xdr,
    				      struct nfs4_getdevicelist_res *res)
    {
    	struct compound_hdr hdr;
    	int status;
    
    	dprintk("encoding getdevicelist!\n");
    
    	status = decode_compound_hdr(xdr, &hdr);
    	if (status != 0)
    		goto out;
    	status = decode_sequence(xdr, &res->seq_res, rqstp);
    	if (status != 0)
    		goto out;
    	status = decode_putfh(xdr);
    	if (status != 0)
    		goto out;
    	status = decode_getdevicelist(xdr, res->devlist);
    out:
    	return status;
    }
    
    
    static int nfs4_xdr_dec_getdeviceinfo(struct rpc_rqst *rqstp,
    				      struct xdr_stream *xdr,
    
    				      struct nfs4_getdeviceinfo_res *res)
    {
    	struct compound_hdr hdr;
    	int status;
    
    
    	status = decode_compound_hdr(xdr, &hdr);
    
    	status = decode_sequence(xdr, &res->seq_res, rqstp);
    
    	status = decode_getdeviceinfo(xdr, res->pdev);
    
    static int nfs4_xdr_dec_layoutget(struct rpc_rqst *rqstp,
    				  struct xdr_stream *xdr,
    
    				  struct nfs4_layoutget_res *res)
    {
    	struct compound_hdr hdr;
    	int status;
    
    
    	status = decode_compound_hdr(xdr, &hdr);
    
    	status = decode_sequence(xdr, &res->seq_res, rqstp);
    
    	status = decode_putfh(xdr);
    
    	status = decode_layoutget(xdr, rqstp, res);
    
    Benny Halevy's avatar
    Benny Halevy committed
    /*
     * Decode LAYOUTRETURN response
     */
    static int nfs4_xdr_dec_layoutreturn(struct rpc_rqst *rqstp,
    				     struct xdr_stream *xdr,
    				     struct nfs4_layoutreturn_res *res)
    {
    	struct compound_hdr hdr;
    	int status;
    
    	status = decode_compound_hdr(xdr, &hdr);
    	if (status)
    		goto out;
    	status = decode_sequence(xdr, &res->seq_res, rqstp);
    	if (status)
    		goto out;
    	status = decode_putfh(xdr);
    	if (status)
    		goto out;
    	status = decode_layoutreturn(xdr, res);
    out:
    	return status;
    }
    
    
    Andy Adamson's avatar
    Andy Adamson committed
    /*
     * Decode LAYOUTCOMMIT response
     */
    static int nfs4_xdr_dec_layoutcommit(struct rpc_rqst *rqstp,
    				     struct xdr_stream *xdr,
    				     struct nfs4_layoutcommit_res *res)
    {
    	struct compound_hdr hdr;
    	int status;
    
    	status = decode_compound_hdr(xdr, &hdr);
    	if (status)
    		goto out;
    	status = decode_sequence(xdr, &res->seq_res, rqstp);
    	if (status)
    		goto out;
    	status = decode_putfh(xdr);
    	if (status)
    		goto out;
    	status = decode_layoutcommit(xdr, rqstp, res);
    	if (status)
    		goto out;
    
    	decode_getfattr(xdr, res->fattr, res->server);
    
    Andy Adamson's avatar
    Andy Adamson committed
    out:
    	return status;