162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * Server-side types for NFSv4. 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Copyright (c) 2002 The Regents of the University of Michigan. 562306a36Sopenharmony_ci * All rights reserved. 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Kendrick Smith <kmsmith@umich.edu> 862306a36Sopenharmony_ci * Andy Adamson <andros@umich.edu> 962306a36Sopenharmony_ci * 1062306a36Sopenharmony_ci * Redistribution and use in source and binary forms, with or without 1162306a36Sopenharmony_ci * modification, are permitted provided that the following conditions 1262306a36Sopenharmony_ci * are met: 1362306a36Sopenharmony_ci * 1462306a36Sopenharmony_ci * 1. Redistributions of source code must retain the above copyright 1562306a36Sopenharmony_ci * notice, this list of conditions and the following disclaimer. 1662306a36Sopenharmony_ci * 2. Redistributions in binary form must reproduce the above copyright 1762306a36Sopenharmony_ci * notice, this list of conditions and the following disclaimer in the 1862306a36Sopenharmony_ci * documentation and/or other materials provided with the distribution. 1962306a36Sopenharmony_ci * 3. Neither the name of the University nor the names of its 2062306a36Sopenharmony_ci * contributors may be used to endorse or promote products derived 2162306a36Sopenharmony_ci * from this software without specific prior written permission. 2262306a36Sopenharmony_ci * 2362306a36Sopenharmony_ci * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED 2462306a36Sopenharmony_ci * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 2562306a36Sopenharmony_ci * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 2662306a36Sopenharmony_ci * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 2762306a36Sopenharmony_ci * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2862306a36Sopenharmony_ci * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2962306a36Sopenharmony_ci * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 3062306a36Sopenharmony_ci * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 3162306a36Sopenharmony_ci * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 3262306a36Sopenharmony_ci * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 3362306a36Sopenharmony_ci * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3462306a36Sopenharmony_ci * 3562306a36Sopenharmony_ci */ 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci#ifndef _LINUX_NFSD_XDR4_H 3862306a36Sopenharmony_ci#define _LINUX_NFSD_XDR4_H 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci#include "state.h" 4162306a36Sopenharmony_ci#include "nfsd.h" 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci#define NFSD4_MAX_TAGLEN 128 4462306a36Sopenharmony_ci#define XDR_LEN(n) (((n) + 3) & ~3) 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci#define CURRENT_STATE_ID_FLAG (1<<0) 4762306a36Sopenharmony_ci#define SAVED_STATE_ID_FLAG (1<<1) 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci#define SET_CSTATE_FLAG(c, f) ((c)->sid_flags |= (f)) 5062306a36Sopenharmony_ci#define HAS_CSTATE_FLAG(c, f) ((c)->sid_flags & (f)) 5162306a36Sopenharmony_ci#define CLEAR_CSTATE_FLAG(c, f) ((c)->sid_flags &= ~(f)) 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_cistruct nfsd4_compound_state { 5462306a36Sopenharmony_ci struct svc_fh current_fh; 5562306a36Sopenharmony_ci struct svc_fh save_fh; 5662306a36Sopenharmony_ci struct nfs4_stateowner *replay_owner; 5762306a36Sopenharmony_ci struct nfs4_client *clp; 5862306a36Sopenharmony_ci /* For sessions DRC */ 5962306a36Sopenharmony_ci struct nfsd4_session *session; 6062306a36Sopenharmony_ci struct nfsd4_slot *slot; 6162306a36Sopenharmony_ci int data_offset; 6262306a36Sopenharmony_ci bool spo_must_allowed; 6362306a36Sopenharmony_ci size_t iovlen; 6462306a36Sopenharmony_ci u32 minorversion; 6562306a36Sopenharmony_ci __be32 status; 6662306a36Sopenharmony_ci stateid_t current_stateid; 6762306a36Sopenharmony_ci stateid_t save_stateid; 6862306a36Sopenharmony_ci /* to indicate current and saved state id presents */ 6962306a36Sopenharmony_ci u32 sid_flags; 7062306a36Sopenharmony_ci}; 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_cistatic inline bool nfsd4_has_session(struct nfsd4_compound_state *cs) 7362306a36Sopenharmony_ci{ 7462306a36Sopenharmony_ci return cs->slot != NULL; 7562306a36Sopenharmony_ci} 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_cistruct nfsd4_change_info { 7862306a36Sopenharmony_ci u32 atomic; 7962306a36Sopenharmony_ci u64 before_change; 8062306a36Sopenharmony_ci u64 after_change; 8162306a36Sopenharmony_ci}; 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_cistruct nfsd4_access { 8462306a36Sopenharmony_ci u32 ac_req_access; /* request */ 8562306a36Sopenharmony_ci u32 ac_supported; /* response */ 8662306a36Sopenharmony_ci u32 ac_resp_access; /* response */ 8762306a36Sopenharmony_ci}; 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_cistruct nfsd4_close { 9062306a36Sopenharmony_ci u32 cl_seqid; /* request */ 9162306a36Sopenharmony_ci stateid_t cl_stateid; /* request+response */ 9262306a36Sopenharmony_ci}; 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_cistruct nfsd4_commit { 9562306a36Sopenharmony_ci u64 co_offset; /* request */ 9662306a36Sopenharmony_ci u32 co_count; /* request */ 9762306a36Sopenharmony_ci nfs4_verifier co_verf; /* response */ 9862306a36Sopenharmony_ci}; 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_cistruct nfsd4_create { 10162306a36Sopenharmony_ci u32 cr_namelen; /* request */ 10262306a36Sopenharmony_ci char * cr_name; /* request */ 10362306a36Sopenharmony_ci u32 cr_type; /* request */ 10462306a36Sopenharmony_ci union { /* request */ 10562306a36Sopenharmony_ci struct { 10662306a36Sopenharmony_ci u32 datalen; 10762306a36Sopenharmony_ci char *data; 10862306a36Sopenharmony_ci struct kvec first; 10962306a36Sopenharmony_ci } link; /* NF4LNK */ 11062306a36Sopenharmony_ci struct { 11162306a36Sopenharmony_ci u32 specdata1; 11262306a36Sopenharmony_ci u32 specdata2; 11362306a36Sopenharmony_ci } dev; /* NF4BLK, NF4CHR */ 11462306a36Sopenharmony_ci } u; 11562306a36Sopenharmony_ci u32 cr_bmval[3]; /* request */ 11662306a36Sopenharmony_ci struct iattr cr_iattr; /* request */ 11762306a36Sopenharmony_ci int cr_umask; /* request */ 11862306a36Sopenharmony_ci struct nfsd4_change_info cr_cinfo; /* response */ 11962306a36Sopenharmony_ci struct nfs4_acl *cr_acl; 12062306a36Sopenharmony_ci struct xdr_netobj cr_label; 12162306a36Sopenharmony_ci}; 12262306a36Sopenharmony_ci#define cr_datalen u.link.datalen 12362306a36Sopenharmony_ci#define cr_data u.link.data 12462306a36Sopenharmony_ci#define cr_first u.link.first 12562306a36Sopenharmony_ci#define cr_specdata1 u.dev.specdata1 12662306a36Sopenharmony_ci#define cr_specdata2 u.dev.specdata2 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_cistruct nfsd4_delegreturn { 12962306a36Sopenharmony_ci stateid_t dr_stateid; 13062306a36Sopenharmony_ci}; 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_cistruct nfsd4_getattr { 13362306a36Sopenharmony_ci u32 ga_bmval[3]; /* request */ 13462306a36Sopenharmony_ci struct svc_fh *ga_fhp; /* response */ 13562306a36Sopenharmony_ci}; 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_cistruct nfsd4_link { 13862306a36Sopenharmony_ci u32 li_namelen; /* request */ 13962306a36Sopenharmony_ci char * li_name; /* request */ 14062306a36Sopenharmony_ci struct nfsd4_change_info li_cinfo; /* response */ 14162306a36Sopenharmony_ci}; 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_cistruct nfsd4_lock_denied { 14462306a36Sopenharmony_ci clientid_t ld_clientid; 14562306a36Sopenharmony_ci struct xdr_netobj ld_owner; 14662306a36Sopenharmony_ci u64 ld_start; 14762306a36Sopenharmony_ci u64 ld_length; 14862306a36Sopenharmony_ci u32 ld_type; 14962306a36Sopenharmony_ci}; 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_cistruct nfsd4_lock { 15262306a36Sopenharmony_ci /* request */ 15362306a36Sopenharmony_ci u32 lk_type; 15462306a36Sopenharmony_ci u32 lk_reclaim; /* boolean */ 15562306a36Sopenharmony_ci u64 lk_offset; 15662306a36Sopenharmony_ci u64 lk_length; 15762306a36Sopenharmony_ci u32 lk_is_new; 15862306a36Sopenharmony_ci union { 15962306a36Sopenharmony_ci struct { 16062306a36Sopenharmony_ci u32 open_seqid; 16162306a36Sopenharmony_ci stateid_t open_stateid; 16262306a36Sopenharmony_ci u32 lock_seqid; 16362306a36Sopenharmony_ci clientid_t clientid; 16462306a36Sopenharmony_ci struct xdr_netobj owner; 16562306a36Sopenharmony_ci } new; 16662306a36Sopenharmony_ci struct { 16762306a36Sopenharmony_ci stateid_t lock_stateid; 16862306a36Sopenharmony_ci u32 lock_seqid; 16962306a36Sopenharmony_ci } old; 17062306a36Sopenharmony_ci } v; 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_ci /* response */ 17362306a36Sopenharmony_ci union { 17462306a36Sopenharmony_ci struct { 17562306a36Sopenharmony_ci stateid_t stateid; 17662306a36Sopenharmony_ci } ok; 17762306a36Sopenharmony_ci struct nfsd4_lock_denied denied; 17862306a36Sopenharmony_ci } u; 17962306a36Sopenharmony_ci}; 18062306a36Sopenharmony_ci#define lk_new_open_seqid v.new.open_seqid 18162306a36Sopenharmony_ci#define lk_new_open_stateid v.new.open_stateid 18262306a36Sopenharmony_ci#define lk_new_lock_seqid v.new.lock_seqid 18362306a36Sopenharmony_ci#define lk_new_clientid v.new.clientid 18462306a36Sopenharmony_ci#define lk_new_owner v.new.owner 18562306a36Sopenharmony_ci#define lk_old_lock_stateid v.old.lock_stateid 18662306a36Sopenharmony_ci#define lk_old_lock_seqid v.old.lock_seqid 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_ci#define lk_resp_stateid u.ok.stateid 18962306a36Sopenharmony_ci#define lk_denied u.denied 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_ci 19262306a36Sopenharmony_cistruct nfsd4_lockt { 19362306a36Sopenharmony_ci u32 lt_type; 19462306a36Sopenharmony_ci clientid_t lt_clientid; 19562306a36Sopenharmony_ci struct xdr_netobj lt_owner; 19662306a36Sopenharmony_ci u64 lt_offset; 19762306a36Sopenharmony_ci u64 lt_length; 19862306a36Sopenharmony_ci struct nfsd4_lock_denied lt_denied; 19962306a36Sopenharmony_ci}; 20062306a36Sopenharmony_ci 20162306a36Sopenharmony_ci 20262306a36Sopenharmony_cistruct nfsd4_locku { 20362306a36Sopenharmony_ci u32 lu_type; 20462306a36Sopenharmony_ci u32 lu_seqid; 20562306a36Sopenharmony_ci stateid_t lu_stateid; 20662306a36Sopenharmony_ci u64 lu_offset; 20762306a36Sopenharmony_ci u64 lu_length; 20862306a36Sopenharmony_ci}; 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_cistruct nfsd4_lookup { 21262306a36Sopenharmony_ci u32 lo_len; /* request */ 21362306a36Sopenharmony_ci char * lo_name; /* request */ 21462306a36Sopenharmony_ci}; 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_cistruct nfsd4_putfh { 21762306a36Sopenharmony_ci u32 pf_fhlen; /* request */ 21862306a36Sopenharmony_ci char *pf_fhval; /* request */ 21962306a36Sopenharmony_ci bool no_verify; /* represents foreigh fh */ 22062306a36Sopenharmony_ci}; 22162306a36Sopenharmony_ci 22262306a36Sopenharmony_cistruct nfsd4_getxattr { 22362306a36Sopenharmony_ci char *getxa_name; /* request */ 22462306a36Sopenharmony_ci u32 getxa_len; /* request */ 22562306a36Sopenharmony_ci void *getxa_buf; 22662306a36Sopenharmony_ci}; 22762306a36Sopenharmony_ci 22862306a36Sopenharmony_cistruct nfsd4_setxattr { 22962306a36Sopenharmony_ci u32 setxa_flags; /* request */ 23062306a36Sopenharmony_ci char *setxa_name; /* request */ 23162306a36Sopenharmony_ci char *setxa_buf; /* request */ 23262306a36Sopenharmony_ci u32 setxa_len; /* request */ 23362306a36Sopenharmony_ci struct nfsd4_change_info setxa_cinfo; /* response */ 23462306a36Sopenharmony_ci}; 23562306a36Sopenharmony_ci 23662306a36Sopenharmony_cistruct nfsd4_removexattr { 23762306a36Sopenharmony_ci char *rmxa_name; /* request */ 23862306a36Sopenharmony_ci struct nfsd4_change_info rmxa_cinfo; /* response */ 23962306a36Sopenharmony_ci}; 24062306a36Sopenharmony_ci 24162306a36Sopenharmony_cistruct nfsd4_listxattrs { 24262306a36Sopenharmony_ci u64 lsxa_cookie; /* request */ 24362306a36Sopenharmony_ci u32 lsxa_maxcount; /* request */ 24462306a36Sopenharmony_ci char *lsxa_buf; /* unfiltered buffer (reply) */ 24562306a36Sopenharmony_ci u32 lsxa_len; /* unfiltered len (reply) */ 24662306a36Sopenharmony_ci}; 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_cistruct nfsd4_open { 24962306a36Sopenharmony_ci u32 op_claim_type; /* request */ 25062306a36Sopenharmony_ci u32 op_fnamelen; 25162306a36Sopenharmony_ci char * op_fname; /* request - everything but CLAIM_PREV */ 25262306a36Sopenharmony_ci u32 op_delegate_type; /* request - CLAIM_PREV only */ 25362306a36Sopenharmony_ci stateid_t op_delegate_stateid; /* request - response */ 25462306a36Sopenharmony_ci u32 op_why_no_deleg; /* response - DELEG_NONE_EXT only */ 25562306a36Sopenharmony_ci u32 op_create; /* request */ 25662306a36Sopenharmony_ci u32 op_createmode; /* request */ 25762306a36Sopenharmony_ci int op_umask; /* request */ 25862306a36Sopenharmony_ci u32 op_bmval[3]; /* request */ 25962306a36Sopenharmony_ci struct iattr op_iattr; /* UNCHECKED4, GUARDED4, EXCLUSIVE4_1 */ 26062306a36Sopenharmony_ci nfs4_verifier op_verf __attribute__((aligned(32))); 26162306a36Sopenharmony_ci /* EXCLUSIVE4 */ 26262306a36Sopenharmony_ci clientid_t op_clientid; /* request */ 26362306a36Sopenharmony_ci struct xdr_netobj op_owner; /* request */ 26462306a36Sopenharmony_ci u32 op_seqid; /* request */ 26562306a36Sopenharmony_ci u32 op_share_access; /* request */ 26662306a36Sopenharmony_ci u32 op_share_deny; /* request */ 26762306a36Sopenharmony_ci u32 op_deleg_want; /* request */ 26862306a36Sopenharmony_ci stateid_t op_stateid; /* response */ 26962306a36Sopenharmony_ci __be32 op_xdr_error; /* see nfsd4_open_omfg() */ 27062306a36Sopenharmony_ci u32 op_recall; /* recall */ 27162306a36Sopenharmony_ci struct nfsd4_change_info op_cinfo; /* response */ 27262306a36Sopenharmony_ci u32 op_rflags; /* response */ 27362306a36Sopenharmony_ci bool op_truncate; /* used during processing */ 27462306a36Sopenharmony_ci bool op_created; /* used during processing */ 27562306a36Sopenharmony_ci struct nfs4_openowner *op_openowner; /* used during processing */ 27662306a36Sopenharmony_ci struct file *op_filp; /* used during processing */ 27762306a36Sopenharmony_ci struct nfs4_file *op_file; /* used during processing */ 27862306a36Sopenharmony_ci struct nfs4_ol_stateid *op_stp; /* used during processing */ 27962306a36Sopenharmony_ci struct nfs4_clnt_odstate *op_odstate; /* used during processing */ 28062306a36Sopenharmony_ci struct nfs4_acl *op_acl; 28162306a36Sopenharmony_ci struct xdr_netobj op_label; 28262306a36Sopenharmony_ci struct svc_rqst *op_rqstp; 28362306a36Sopenharmony_ci}; 28462306a36Sopenharmony_ci 28562306a36Sopenharmony_cistruct nfsd4_open_confirm { 28662306a36Sopenharmony_ci stateid_t oc_req_stateid /* request */; 28762306a36Sopenharmony_ci u32 oc_seqid /* request */; 28862306a36Sopenharmony_ci stateid_t oc_resp_stateid /* response */; 28962306a36Sopenharmony_ci}; 29062306a36Sopenharmony_ci 29162306a36Sopenharmony_cistruct nfsd4_open_downgrade { 29262306a36Sopenharmony_ci stateid_t od_stateid; 29362306a36Sopenharmony_ci u32 od_seqid; 29462306a36Sopenharmony_ci u32 od_share_access; /* request */ 29562306a36Sopenharmony_ci u32 od_deleg_want; /* request */ 29662306a36Sopenharmony_ci u32 od_share_deny; /* request */ 29762306a36Sopenharmony_ci}; 29862306a36Sopenharmony_ci 29962306a36Sopenharmony_ci 30062306a36Sopenharmony_cistruct nfsd4_read { 30162306a36Sopenharmony_ci stateid_t rd_stateid; /* request */ 30262306a36Sopenharmony_ci u64 rd_offset; /* request */ 30362306a36Sopenharmony_ci u32 rd_length; /* request */ 30462306a36Sopenharmony_ci int rd_vlen; 30562306a36Sopenharmony_ci struct nfsd_file *rd_nf; 30662306a36Sopenharmony_ci 30762306a36Sopenharmony_ci struct svc_rqst *rd_rqstp; /* response */ 30862306a36Sopenharmony_ci struct svc_fh *rd_fhp; /* response */ 30962306a36Sopenharmony_ci u32 rd_eof; /* response */ 31062306a36Sopenharmony_ci}; 31162306a36Sopenharmony_ci 31262306a36Sopenharmony_cistruct nfsd4_readdir { 31362306a36Sopenharmony_ci u64 rd_cookie; /* request */ 31462306a36Sopenharmony_ci nfs4_verifier rd_verf; /* request */ 31562306a36Sopenharmony_ci u32 rd_dircount; /* request */ 31662306a36Sopenharmony_ci u32 rd_maxcount; /* request */ 31762306a36Sopenharmony_ci u32 rd_bmval[3]; /* request */ 31862306a36Sopenharmony_ci struct svc_rqst *rd_rqstp; /* response */ 31962306a36Sopenharmony_ci struct svc_fh * rd_fhp; /* response */ 32062306a36Sopenharmony_ci 32162306a36Sopenharmony_ci struct readdir_cd common; 32262306a36Sopenharmony_ci struct xdr_stream *xdr; 32362306a36Sopenharmony_ci int cookie_offset; 32462306a36Sopenharmony_ci}; 32562306a36Sopenharmony_ci 32662306a36Sopenharmony_cistruct nfsd4_release_lockowner { 32762306a36Sopenharmony_ci clientid_t rl_clientid; 32862306a36Sopenharmony_ci struct xdr_netobj rl_owner; 32962306a36Sopenharmony_ci}; 33062306a36Sopenharmony_cistruct nfsd4_readlink { 33162306a36Sopenharmony_ci struct svc_rqst *rl_rqstp; /* request */ 33262306a36Sopenharmony_ci struct svc_fh * rl_fhp; /* request */ 33362306a36Sopenharmony_ci}; 33462306a36Sopenharmony_ci 33562306a36Sopenharmony_cistruct nfsd4_remove { 33662306a36Sopenharmony_ci u32 rm_namelen; /* request */ 33762306a36Sopenharmony_ci char * rm_name; /* request */ 33862306a36Sopenharmony_ci struct nfsd4_change_info rm_cinfo; /* response */ 33962306a36Sopenharmony_ci}; 34062306a36Sopenharmony_ci 34162306a36Sopenharmony_cistruct nfsd4_rename { 34262306a36Sopenharmony_ci u32 rn_snamelen; /* request */ 34362306a36Sopenharmony_ci char * rn_sname; /* request */ 34462306a36Sopenharmony_ci u32 rn_tnamelen; /* request */ 34562306a36Sopenharmony_ci char * rn_tname; /* request */ 34662306a36Sopenharmony_ci struct nfsd4_change_info rn_sinfo; /* response */ 34762306a36Sopenharmony_ci struct nfsd4_change_info rn_tinfo; /* response */ 34862306a36Sopenharmony_ci}; 34962306a36Sopenharmony_ci 35062306a36Sopenharmony_cistruct nfsd4_secinfo { 35162306a36Sopenharmony_ci u32 si_namelen; /* request */ 35262306a36Sopenharmony_ci char *si_name; /* request */ 35362306a36Sopenharmony_ci struct svc_export *si_exp; /* response */ 35462306a36Sopenharmony_ci}; 35562306a36Sopenharmony_ci 35662306a36Sopenharmony_cistruct nfsd4_secinfo_no_name { 35762306a36Sopenharmony_ci u32 sin_style; /* request */ 35862306a36Sopenharmony_ci struct svc_export *sin_exp; /* response */ 35962306a36Sopenharmony_ci}; 36062306a36Sopenharmony_ci 36162306a36Sopenharmony_cistruct nfsd4_setattr { 36262306a36Sopenharmony_ci stateid_t sa_stateid; /* request */ 36362306a36Sopenharmony_ci u32 sa_bmval[3]; /* request */ 36462306a36Sopenharmony_ci struct iattr sa_iattr; /* request */ 36562306a36Sopenharmony_ci struct nfs4_acl *sa_acl; 36662306a36Sopenharmony_ci struct xdr_netobj sa_label; 36762306a36Sopenharmony_ci}; 36862306a36Sopenharmony_ci 36962306a36Sopenharmony_cistruct nfsd4_setclientid { 37062306a36Sopenharmony_ci nfs4_verifier se_verf; /* request */ 37162306a36Sopenharmony_ci struct xdr_netobj se_name; 37262306a36Sopenharmony_ci u32 se_callback_prog; /* request */ 37362306a36Sopenharmony_ci u32 se_callback_netid_len; /* request */ 37462306a36Sopenharmony_ci char * se_callback_netid_val; /* request */ 37562306a36Sopenharmony_ci u32 se_callback_addr_len; /* request */ 37662306a36Sopenharmony_ci char * se_callback_addr_val; /* request */ 37762306a36Sopenharmony_ci u32 se_callback_ident; /* request */ 37862306a36Sopenharmony_ci clientid_t se_clientid; /* response */ 37962306a36Sopenharmony_ci nfs4_verifier se_confirm; /* response */ 38062306a36Sopenharmony_ci}; 38162306a36Sopenharmony_ci 38262306a36Sopenharmony_cistruct nfsd4_setclientid_confirm { 38362306a36Sopenharmony_ci clientid_t sc_clientid; 38462306a36Sopenharmony_ci nfs4_verifier sc_confirm; 38562306a36Sopenharmony_ci}; 38662306a36Sopenharmony_ci 38762306a36Sopenharmony_cistruct nfsd4_test_stateid_id { 38862306a36Sopenharmony_ci __be32 ts_id_status; 38962306a36Sopenharmony_ci stateid_t ts_id_stateid; 39062306a36Sopenharmony_ci struct list_head ts_id_list; 39162306a36Sopenharmony_ci}; 39262306a36Sopenharmony_ci 39362306a36Sopenharmony_cistruct nfsd4_test_stateid { 39462306a36Sopenharmony_ci u32 ts_num_ids; 39562306a36Sopenharmony_ci struct list_head ts_stateid_list; 39662306a36Sopenharmony_ci}; 39762306a36Sopenharmony_ci 39862306a36Sopenharmony_cistruct nfsd4_free_stateid { 39962306a36Sopenharmony_ci stateid_t fr_stateid; /* request */ 40062306a36Sopenharmony_ci}; 40162306a36Sopenharmony_ci 40262306a36Sopenharmony_ci/* also used for NVERIFY */ 40362306a36Sopenharmony_cistruct nfsd4_verify { 40462306a36Sopenharmony_ci u32 ve_bmval[3]; /* request */ 40562306a36Sopenharmony_ci u32 ve_attrlen; /* request */ 40662306a36Sopenharmony_ci char * ve_attrval; /* request */ 40762306a36Sopenharmony_ci}; 40862306a36Sopenharmony_ci 40962306a36Sopenharmony_cistruct nfsd4_write { 41062306a36Sopenharmony_ci stateid_t wr_stateid; /* request */ 41162306a36Sopenharmony_ci u64 wr_offset; /* request */ 41262306a36Sopenharmony_ci u32 wr_stable_how; /* request */ 41362306a36Sopenharmony_ci u32 wr_buflen; /* request */ 41462306a36Sopenharmony_ci struct xdr_buf wr_payload; /* request */ 41562306a36Sopenharmony_ci 41662306a36Sopenharmony_ci u32 wr_bytes_written; /* response */ 41762306a36Sopenharmony_ci u32 wr_how_written; /* response */ 41862306a36Sopenharmony_ci nfs4_verifier wr_verifier; /* response */ 41962306a36Sopenharmony_ci}; 42062306a36Sopenharmony_ci 42162306a36Sopenharmony_cistruct nfsd4_exchange_id { 42262306a36Sopenharmony_ci nfs4_verifier verifier; 42362306a36Sopenharmony_ci struct xdr_netobj clname; 42462306a36Sopenharmony_ci u32 flags; 42562306a36Sopenharmony_ci clientid_t clientid; 42662306a36Sopenharmony_ci u32 seqid; 42762306a36Sopenharmony_ci u32 spa_how; 42862306a36Sopenharmony_ci u32 spo_must_enforce[3]; 42962306a36Sopenharmony_ci u32 spo_must_allow[3]; 43062306a36Sopenharmony_ci struct xdr_netobj nii_domain; 43162306a36Sopenharmony_ci struct xdr_netobj nii_name; 43262306a36Sopenharmony_ci struct timespec64 nii_time; 43362306a36Sopenharmony_ci}; 43462306a36Sopenharmony_ci 43562306a36Sopenharmony_cistruct nfsd4_sequence { 43662306a36Sopenharmony_ci struct nfs4_sessionid sessionid; /* request/response */ 43762306a36Sopenharmony_ci u32 seqid; /* request/response */ 43862306a36Sopenharmony_ci u32 slotid; /* request/response */ 43962306a36Sopenharmony_ci u32 maxslots; /* request/response */ 44062306a36Sopenharmony_ci u32 cachethis; /* request */ 44162306a36Sopenharmony_ci#if 0 44262306a36Sopenharmony_ci u32 target_maxslots; /* response */ 44362306a36Sopenharmony_ci#endif /* not yet */ 44462306a36Sopenharmony_ci u32 status_flags; /* response */ 44562306a36Sopenharmony_ci}; 44662306a36Sopenharmony_ci 44762306a36Sopenharmony_cistruct nfsd4_destroy_session { 44862306a36Sopenharmony_ci struct nfs4_sessionid sessionid; 44962306a36Sopenharmony_ci}; 45062306a36Sopenharmony_ci 45162306a36Sopenharmony_cistruct nfsd4_destroy_clientid { 45262306a36Sopenharmony_ci clientid_t clientid; 45362306a36Sopenharmony_ci}; 45462306a36Sopenharmony_ci 45562306a36Sopenharmony_cistruct nfsd4_reclaim_complete { 45662306a36Sopenharmony_ci u32 rca_one_fs; 45762306a36Sopenharmony_ci}; 45862306a36Sopenharmony_ci 45962306a36Sopenharmony_cistruct nfsd4_deviceid { 46062306a36Sopenharmony_ci u64 fsid_idx; 46162306a36Sopenharmony_ci u32 generation; 46262306a36Sopenharmony_ci u32 pad; 46362306a36Sopenharmony_ci}; 46462306a36Sopenharmony_ci 46562306a36Sopenharmony_cistruct nfsd4_layout_seg { 46662306a36Sopenharmony_ci u32 iomode; 46762306a36Sopenharmony_ci u64 offset; 46862306a36Sopenharmony_ci u64 length; 46962306a36Sopenharmony_ci}; 47062306a36Sopenharmony_ci 47162306a36Sopenharmony_cistruct nfsd4_getdeviceinfo { 47262306a36Sopenharmony_ci struct nfsd4_deviceid gd_devid; /* request */ 47362306a36Sopenharmony_ci u32 gd_layout_type; /* request */ 47462306a36Sopenharmony_ci u32 gd_maxcount; /* request */ 47562306a36Sopenharmony_ci u32 gd_notify_types;/* request - response */ 47662306a36Sopenharmony_ci void *gd_device; /* response */ 47762306a36Sopenharmony_ci}; 47862306a36Sopenharmony_ci 47962306a36Sopenharmony_cistruct nfsd4_layoutget { 48062306a36Sopenharmony_ci u64 lg_minlength; /* request */ 48162306a36Sopenharmony_ci u32 lg_signal; /* request */ 48262306a36Sopenharmony_ci u32 lg_layout_type; /* request */ 48362306a36Sopenharmony_ci u32 lg_maxcount; /* request */ 48462306a36Sopenharmony_ci stateid_t lg_sid; /* request/response */ 48562306a36Sopenharmony_ci struct nfsd4_layout_seg lg_seg; /* request/response */ 48662306a36Sopenharmony_ci void *lg_content; /* response */ 48762306a36Sopenharmony_ci}; 48862306a36Sopenharmony_ci 48962306a36Sopenharmony_cistruct nfsd4_layoutcommit { 49062306a36Sopenharmony_ci stateid_t lc_sid; /* request */ 49162306a36Sopenharmony_ci struct nfsd4_layout_seg lc_seg; /* request */ 49262306a36Sopenharmony_ci u32 lc_reclaim; /* request */ 49362306a36Sopenharmony_ci u32 lc_newoffset; /* request */ 49462306a36Sopenharmony_ci u64 lc_last_wr; /* request */ 49562306a36Sopenharmony_ci struct timespec64 lc_mtime; /* request */ 49662306a36Sopenharmony_ci u32 lc_layout_type; /* request */ 49762306a36Sopenharmony_ci u32 lc_up_len; /* layout length */ 49862306a36Sopenharmony_ci void *lc_up_layout; /* decoded by callback */ 49962306a36Sopenharmony_ci u32 lc_size_chg; /* boolean for response */ 50062306a36Sopenharmony_ci u64 lc_newsize; /* response */ 50162306a36Sopenharmony_ci}; 50262306a36Sopenharmony_ci 50362306a36Sopenharmony_cistruct nfsd4_layoutreturn { 50462306a36Sopenharmony_ci u32 lr_return_type; /* request */ 50562306a36Sopenharmony_ci u32 lr_layout_type; /* request */ 50662306a36Sopenharmony_ci struct nfsd4_layout_seg lr_seg; /* request */ 50762306a36Sopenharmony_ci u32 lr_reclaim; /* request */ 50862306a36Sopenharmony_ci u32 lrf_body_len; /* request */ 50962306a36Sopenharmony_ci void *lrf_body; /* request */ 51062306a36Sopenharmony_ci stateid_t lr_sid; /* request/response */ 51162306a36Sopenharmony_ci u32 lrs_present; /* response */ 51262306a36Sopenharmony_ci}; 51362306a36Sopenharmony_ci 51462306a36Sopenharmony_cistruct nfsd4_fallocate { 51562306a36Sopenharmony_ci /* request */ 51662306a36Sopenharmony_ci stateid_t falloc_stateid; 51762306a36Sopenharmony_ci loff_t falloc_offset; 51862306a36Sopenharmony_ci u64 falloc_length; 51962306a36Sopenharmony_ci}; 52062306a36Sopenharmony_ci 52162306a36Sopenharmony_cistruct nfsd4_clone { 52262306a36Sopenharmony_ci /* request */ 52362306a36Sopenharmony_ci stateid_t cl_src_stateid; 52462306a36Sopenharmony_ci stateid_t cl_dst_stateid; 52562306a36Sopenharmony_ci u64 cl_src_pos; 52662306a36Sopenharmony_ci u64 cl_dst_pos; 52762306a36Sopenharmony_ci u64 cl_count; 52862306a36Sopenharmony_ci}; 52962306a36Sopenharmony_ci 53062306a36Sopenharmony_cistruct nfsd42_write_res { 53162306a36Sopenharmony_ci u64 wr_bytes_written; 53262306a36Sopenharmony_ci u32 wr_stable_how; 53362306a36Sopenharmony_ci nfs4_verifier wr_verifier; 53462306a36Sopenharmony_ci stateid_t cb_stateid; 53562306a36Sopenharmony_ci}; 53662306a36Sopenharmony_ci 53762306a36Sopenharmony_cistruct nfsd4_cb_offload { 53862306a36Sopenharmony_ci struct nfsd4_callback co_cb; 53962306a36Sopenharmony_ci struct nfsd42_write_res co_res; 54062306a36Sopenharmony_ci __be32 co_nfserr; 54162306a36Sopenharmony_ci struct knfsd_fh co_fh; 54262306a36Sopenharmony_ci}; 54362306a36Sopenharmony_ci 54462306a36Sopenharmony_cistruct nfsd4_copy { 54562306a36Sopenharmony_ci /* request */ 54662306a36Sopenharmony_ci stateid_t cp_src_stateid; 54762306a36Sopenharmony_ci stateid_t cp_dst_stateid; 54862306a36Sopenharmony_ci u64 cp_src_pos; 54962306a36Sopenharmony_ci u64 cp_dst_pos; 55062306a36Sopenharmony_ci u64 cp_count; 55162306a36Sopenharmony_ci struct nl4_server *cp_src; 55262306a36Sopenharmony_ci 55362306a36Sopenharmony_ci unsigned long cp_flags; 55462306a36Sopenharmony_ci#define NFSD4_COPY_F_STOPPED (0) 55562306a36Sopenharmony_ci#define NFSD4_COPY_F_INTRA (1) 55662306a36Sopenharmony_ci#define NFSD4_COPY_F_SYNCHRONOUS (2) 55762306a36Sopenharmony_ci#define NFSD4_COPY_F_COMMITTED (3) 55862306a36Sopenharmony_ci 55962306a36Sopenharmony_ci /* response */ 56062306a36Sopenharmony_ci struct nfsd42_write_res cp_res; 56162306a36Sopenharmony_ci struct knfsd_fh fh; 56262306a36Sopenharmony_ci 56362306a36Sopenharmony_ci struct nfs4_client *cp_clp; 56462306a36Sopenharmony_ci 56562306a36Sopenharmony_ci struct nfsd_file *nf_src; 56662306a36Sopenharmony_ci struct nfsd_file *nf_dst; 56762306a36Sopenharmony_ci 56862306a36Sopenharmony_ci copy_stateid_t cp_stateid; 56962306a36Sopenharmony_ci 57062306a36Sopenharmony_ci struct list_head copies; 57162306a36Sopenharmony_ci struct task_struct *copy_task; 57262306a36Sopenharmony_ci refcount_t refcount; 57362306a36Sopenharmony_ci 57462306a36Sopenharmony_ci struct nfsd4_ssc_umount_item *ss_nsui; 57562306a36Sopenharmony_ci struct nfs_fh c_fh; 57662306a36Sopenharmony_ci nfs4_stateid stateid; 57762306a36Sopenharmony_ci}; 57862306a36Sopenharmony_ci 57962306a36Sopenharmony_cistatic inline void nfsd4_copy_set_sync(struct nfsd4_copy *copy, bool sync) 58062306a36Sopenharmony_ci{ 58162306a36Sopenharmony_ci if (sync) 58262306a36Sopenharmony_ci set_bit(NFSD4_COPY_F_SYNCHRONOUS, ©->cp_flags); 58362306a36Sopenharmony_ci else 58462306a36Sopenharmony_ci clear_bit(NFSD4_COPY_F_SYNCHRONOUS, ©->cp_flags); 58562306a36Sopenharmony_ci} 58662306a36Sopenharmony_ci 58762306a36Sopenharmony_cistatic inline bool nfsd4_copy_is_sync(const struct nfsd4_copy *copy) 58862306a36Sopenharmony_ci{ 58962306a36Sopenharmony_ci return test_bit(NFSD4_COPY_F_SYNCHRONOUS, ©->cp_flags); 59062306a36Sopenharmony_ci} 59162306a36Sopenharmony_ci 59262306a36Sopenharmony_cistatic inline bool nfsd4_copy_is_async(const struct nfsd4_copy *copy) 59362306a36Sopenharmony_ci{ 59462306a36Sopenharmony_ci return !test_bit(NFSD4_COPY_F_SYNCHRONOUS, ©->cp_flags); 59562306a36Sopenharmony_ci} 59662306a36Sopenharmony_ci 59762306a36Sopenharmony_cistatic inline bool nfsd4_ssc_is_inter(const struct nfsd4_copy *copy) 59862306a36Sopenharmony_ci{ 59962306a36Sopenharmony_ci return !test_bit(NFSD4_COPY_F_INTRA, ©->cp_flags); 60062306a36Sopenharmony_ci} 60162306a36Sopenharmony_ci 60262306a36Sopenharmony_cistruct nfsd4_seek { 60362306a36Sopenharmony_ci /* request */ 60462306a36Sopenharmony_ci stateid_t seek_stateid; 60562306a36Sopenharmony_ci loff_t seek_offset; 60662306a36Sopenharmony_ci u32 seek_whence; 60762306a36Sopenharmony_ci 60862306a36Sopenharmony_ci /* response */ 60962306a36Sopenharmony_ci u32 seek_eof; 61062306a36Sopenharmony_ci loff_t seek_pos; 61162306a36Sopenharmony_ci}; 61262306a36Sopenharmony_ci 61362306a36Sopenharmony_cistruct nfsd4_offload_status { 61462306a36Sopenharmony_ci /* request */ 61562306a36Sopenharmony_ci stateid_t stateid; 61662306a36Sopenharmony_ci 61762306a36Sopenharmony_ci /* response */ 61862306a36Sopenharmony_ci u64 count; 61962306a36Sopenharmony_ci u32 status; 62062306a36Sopenharmony_ci}; 62162306a36Sopenharmony_ci 62262306a36Sopenharmony_cistruct nfsd4_copy_notify { 62362306a36Sopenharmony_ci /* request */ 62462306a36Sopenharmony_ci stateid_t cpn_src_stateid; 62562306a36Sopenharmony_ci struct nl4_server *cpn_dst; 62662306a36Sopenharmony_ci 62762306a36Sopenharmony_ci /* response */ 62862306a36Sopenharmony_ci stateid_t cpn_cnr_stateid; 62962306a36Sopenharmony_ci u64 cpn_sec; 63062306a36Sopenharmony_ci u32 cpn_nsec; 63162306a36Sopenharmony_ci struct nl4_server *cpn_src; 63262306a36Sopenharmony_ci}; 63362306a36Sopenharmony_ci 63462306a36Sopenharmony_cistruct nfsd4_op { 63562306a36Sopenharmony_ci u32 opnum; 63662306a36Sopenharmony_ci __be32 status; 63762306a36Sopenharmony_ci const struct nfsd4_operation *opdesc; 63862306a36Sopenharmony_ci struct nfs4_replay *replay; 63962306a36Sopenharmony_ci union nfsd4_op_u { 64062306a36Sopenharmony_ci struct nfsd4_access access; 64162306a36Sopenharmony_ci struct nfsd4_close close; 64262306a36Sopenharmony_ci struct nfsd4_commit commit; 64362306a36Sopenharmony_ci struct nfsd4_create create; 64462306a36Sopenharmony_ci struct nfsd4_delegreturn delegreturn; 64562306a36Sopenharmony_ci struct nfsd4_getattr getattr; 64662306a36Sopenharmony_ci struct svc_fh * getfh; 64762306a36Sopenharmony_ci struct nfsd4_link link; 64862306a36Sopenharmony_ci struct nfsd4_lock lock; 64962306a36Sopenharmony_ci struct nfsd4_lockt lockt; 65062306a36Sopenharmony_ci struct nfsd4_locku locku; 65162306a36Sopenharmony_ci struct nfsd4_lookup lookup; 65262306a36Sopenharmony_ci struct nfsd4_verify nverify; 65362306a36Sopenharmony_ci struct nfsd4_open open; 65462306a36Sopenharmony_ci struct nfsd4_open_confirm open_confirm; 65562306a36Sopenharmony_ci struct nfsd4_open_downgrade open_downgrade; 65662306a36Sopenharmony_ci struct nfsd4_putfh putfh; 65762306a36Sopenharmony_ci struct nfsd4_read read; 65862306a36Sopenharmony_ci struct nfsd4_readdir readdir; 65962306a36Sopenharmony_ci struct nfsd4_readlink readlink; 66062306a36Sopenharmony_ci struct nfsd4_remove remove; 66162306a36Sopenharmony_ci struct nfsd4_rename rename; 66262306a36Sopenharmony_ci clientid_t renew; 66362306a36Sopenharmony_ci struct nfsd4_secinfo secinfo; 66462306a36Sopenharmony_ci struct nfsd4_setattr setattr; 66562306a36Sopenharmony_ci struct nfsd4_setclientid setclientid; 66662306a36Sopenharmony_ci struct nfsd4_setclientid_confirm setclientid_confirm; 66762306a36Sopenharmony_ci struct nfsd4_verify verify; 66862306a36Sopenharmony_ci struct nfsd4_write write; 66962306a36Sopenharmony_ci struct nfsd4_release_lockowner release_lockowner; 67062306a36Sopenharmony_ci 67162306a36Sopenharmony_ci /* NFSv4.1 */ 67262306a36Sopenharmony_ci struct nfsd4_exchange_id exchange_id; 67362306a36Sopenharmony_ci struct nfsd4_backchannel_ctl backchannel_ctl; 67462306a36Sopenharmony_ci struct nfsd4_bind_conn_to_session bind_conn_to_session; 67562306a36Sopenharmony_ci struct nfsd4_create_session create_session; 67662306a36Sopenharmony_ci struct nfsd4_destroy_session destroy_session; 67762306a36Sopenharmony_ci struct nfsd4_destroy_clientid destroy_clientid; 67862306a36Sopenharmony_ci struct nfsd4_sequence sequence; 67962306a36Sopenharmony_ci struct nfsd4_reclaim_complete reclaim_complete; 68062306a36Sopenharmony_ci struct nfsd4_test_stateid test_stateid; 68162306a36Sopenharmony_ci struct nfsd4_free_stateid free_stateid; 68262306a36Sopenharmony_ci struct nfsd4_getdeviceinfo getdeviceinfo; 68362306a36Sopenharmony_ci struct nfsd4_layoutget layoutget; 68462306a36Sopenharmony_ci struct nfsd4_layoutcommit layoutcommit; 68562306a36Sopenharmony_ci struct nfsd4_layoutreturn layoutreturn; 68662306a36Sopenharmony_ci struct nfsd4_secinfo_no_name secinfo_no_name; 68762306a36Sopenharmony_ci 68862306a36Sopenharmony_ci /* NFSv4.2 */ 68962306a36Sopenharmony_ci struct nfsd4_fallocate allocate; 69062306a36Sopenharmony_ci struct nfsd4_fallocate deallocate; 69162306a36Sopenharmony_ci struct nfsd4_clone clone; 69262306a36Sopenharmony_ci struct nfsd4_copy copy; 69362306a36Sopenharmony_ci struct nfsd4_offload_status offload_status; 69462306a36Sopenharmony_ci struct nfsd4_copy_notify copy_notify; 69562306a36Sopenharmony_ci struct nfsd4_seek seek; 69662306a36Sopenharmony_ci 69762306a36Sopenharmony_ci struct nfsd4_getxattr getxattr; 69862306a36Sopenharmony_ci struct nfsd4_setxattr setxattr; 69962306a36Sopenharmony_ci struct nfsd4_listxattrs listxattrs; 70062306a36Sopenharmony_ci struct nfsd4_removexattr removexattr; 70162306a36Sopenharmony_ci } u; 70262306a36Sopenharmony_ci}; 70362306a36Sopenharmony_ci 70462306a36Sopenharmony_cibool nfsd4_cache_this_op(struct nfsd4_op *); 70562306a36Sopenharmony_ci 70662306a36Sopenharmony_ci/* 70762306a36Sopenharmony_ci * Memory needed just for the duration of processing one compound: 70862306a36Sopenharmony_ci */ 70962306a36Sopenharmony_cistruct svcxdr_tmpbuf { 71062306a36Sopenharmony_ci struct svcxdr_tmpbuf *next; 71162306a36Sopenharmony_ci char buf[]; 71262306a36Sopenharmony_ci}; 71362306a36Sopenharmony_ci 71462306a36Sopenharmony_cistruct nfsd4_compoundargs { 71562306a36Sopenharmony_ci /* scratch variables for XDR decode */ 71662306a36Sopenharmony_ci struct xdr_stream *xdr; 71762306a36Sopenharmony_ci struct svcxdr_tmpbuf *to_free; 71862306a36Sopenharmony_ci struct svc_rqst *rqstp; 71962306a36Sopenharmony_ci 72062306a36Sopenharmony_ci char * tag; 72162306a36Sopenharmony_ci u32 taglen; 72262306a36Sopenharmony_ci u32 minorversion; 72362306a36Sopenharmony_ci u32 client_opcnt; 72462306a36Sopenharmony_ci u32 opcnt; 72562306a36Sopenharmony_ci struct nfsd4_op *ops; 72662306a36Sopenharmony_ci struct nfsd4_op iops[8]; 72762306a36Sopenharmony_ci}; 72862306a36Sopenharmony_ci 72962306a36Sopenharmony_cistruct nfsd4_compoundres { 73062306a36Sopenharmony_ci /* scratch variables for XDR encode */ 73162306a36Sopenharmony_ci struct xdr_stream *xdr; 73262306a36Sopenharmony_ci struct svc_rqst * rqstp; 73362306a36Sopenharmony_ci 73462306a36Sopenharmony_ci __be32 *statusp; 73562306a36Sopenharmony_ci char * tag; 73662306a36Sopenharmony_ci u32 taglen; 73762306a36Sopenharmony_ci u32 opcnt; 73862306a36Sopenharmony_ci 73962306a36Sopenharmony_ci struct nfsd4_compound_state cstate; 74062306a36Sopenharmony_ci}; 74162306a36Sopenharmony_ci 74262306a36Sopenharmony_cistatic inline bool nfsd4_is_solo_sequence(struct nfsd4_compoundres *resp) 74362306a36Sopenharmony_ci{ 74462306a36Sopenharmony_ci struct nfsd4_compoundargs *args = resp->rqstp->rq_argp; 74562306a36Sopenharmony_ci return resp->opcnt == 1 && args->ops[0].opnum == OP_SEQUENCE; 74662306a36Sopenharmony_ci} 74762306a36Sopenharmony_ci 74862306a36Sopenharmony_ci/* 74962306a36Sopenharmony_ci * The session reply cache only needs to cache replies that the client 75062306a36Sopenharmony_ci * actually asked us to. But it's almost free for us to cache compounds 75162306a36Sopenharmony_ci * consisting of only a SEQUENCE op, so we may as well cache those too. 75262306a36Sopenharmony_ci * Also, the protocol doesn't give us a convenient response in the case 75362306a36Sopenharmony_ci * of a replay of a solo SEQUENCE op that wasn't cached 75462306a36Sopenharmony_ci * (RETRY_UNCACHED_REP can only be returned in the second op of a 75562306a36Sopenharmony_ci * compound). 75662306a36Sopenharmony_ci */ 75762306a36Sopenharmony_cistatic inline bool nfsd4_cache_this(struct nfsd4_compoundres *resp) 75862306a36Sopenharmony_ci{ 75962306a36Sopenharmony_ci return (resp->cstate.slot->sl_flags & NFSD4_SLOT_CACHETHIS) 76062306a36Sopenharmony_ci || nfsd4_is_solo_sequence(resp); 76162306a36Sopenharmony_ci} 76262306a36Sopenharmony_ci 76362306a36Sopenharmony_cistatic inline bool nfsd4_last_compound_op(struct svc_rqst *rqstp) 76462306a36Sopenharmony_ci{ 76562306a36Sopenharmony_ci struct nfsd4_compoundres *resp = rqstp->rq_resp; 76662306a36Sopenharmony_ci struct nfsd4_compoundargs *argp = rqstp->rq_argp; 76762306a36Sopenharmony_ci 76862306a36Sopenharmony_ci return argp->opcnt == resp->opcnt; 76962306a36Sopenharmony_ci} 77062306a36Sopenharmony_ci 77162306a36Sopenharmony_ciconst struct nfsd4_operation *OPDESC(struct nfsd4_op *op); 77262306a36Sopenharmony_ciint nfsd4_max_reply(struct svc_rqst *rqstp, struct nfsd4_op *op); 77362306a36Sopenharmony_civoid warn_on_nonidempotent_op(struct nfsd4_op *op); 77462306a36Sopenharmony_ci 77562306a36Sopenharmony_ci#define NFS4_SVC_XDRSIZE sizeof(struct nfsd4_compoundargs) 77662306a36Sopenharmony_ci 77762306a36Sopenharmony_cibool nfsd4_mach_creds_match(struct nfs4_client *cl, struct svc_rqst *rqstp); 77862306a36Sopenharmony_cibool nfs4svc_decode_compoundargs(struct svc_rqst *rqstp, struct xdr_stream *xdr); 77962306a36Sopenharmony_cibool nfs4svc_encode_compoundres(struct svc_rqst *rqstp, struct xdr_stream *xdr); 78062306a36Sopenharmony_ci__be32 nfsd4_check_resp_size(struct nfsd4_compoundres *, u32); 78162306a36Sopenharmony_civoid nfsd4_encode_operation(struct nfsd4_compoundres *, struct nfsd4_op *); 78262306a36Sopenharmony_civoid nfsd4_encode_replay(struct xdr_stream *xdr, struct nfsd4_op *op); 78362306a36Sopenharmony_ci__be32 nfsd4_encode_fattr_to_buf(__be32 **p, int words, 78462306a36Sopenharmony_ci struct svc_fh *fhp, struct svc_export *exp, 78562306a36Sopenharmony_ci struct dentry *dentry, 78662306a36Sopenharmony_ci u32 *bmval, struct svc_rqst *, int ignore_crossmnt); 78762306a36Sopenharmony_ciextern __be32 nfsd4_setclientid(struct svc_rqst *rqstp, 78862306a36Sopenharmony_ci struct nfsd4_compound_state *, union nfsd4_op_u *u); 78962306a36Sopenharmony_ciextern __be32 nfsd4_setclientid_confirm(struct svc_rqst *rqstp, 79062306a36Sopenharmony_ci struct nfsd4_compound_state *, union nfsd4_op_u *u); 79162306a36Sopenharmony_ciextern __be32 nfsd4_exchange_id(struct svc_rqst *rqstp, 79262306a36Sopenharmony_ci struct nfsd4_compound_state *, union nfsd4_op_u *u); 79362306a36Sopenharmony_ciextern __be32 nfsd4_backchannel_ctl(struct svc_rqst *, 79462306a36Sopenharmony_ci struct nfsd4_compound_state *, union nfsd4_op_u *u); 79562306a36Sopenharmony_ciextern __be32 nfsd4_bind_conn_to_session(struct svc_rqst *, 79662306a36Sopenharmony_ci struct nfsd4_compound_state *, union nfsd4_op_u *u); 79762306a36Sopenharmony_ciextern __be32 nfsd4_create_session(struct svc_rqst *, 79862306a36Sopenharmony_ci struct nfsd4_compound_state *, union nfsd4_op_u *u); 79962306a36Sopenharmony_ciextern __be32 nfsd4_sequence(struct svc_rqst *, 80062306a36Sopenharmony_ci struct nfsd4_compound_state *, union nfsd4_op_u *u); 80162306a36Sopenharmony_ciextern void nfsd4_sequence_done(struct nfsd4_compoundres *resp); 80262306a36Sopenharmony_ciextern __be32 nfsd4_destroy_session(struct svc_rqst *, 80362306a36Sopenharmony_ci struct nfsd4_compound_state *, union nfsd4_op_u *u); 80462306a36Sopenharmony_ciextern __be32 nfsd4_destroy_clientid(struct svc_rqst *, struct nfsd4_compound_state *, 80562306a36Sopenharmony_ci union nfsd4_op_u *u); 80662306a36Sopenharmony_ci__be32 nfsd4_reclaim_complete(struct svc_rqst *, struct nfsd4_compound_state *, 80762306a36Sopenharmony_ci union nfsd4_op_u *u); 80862306a36Sopenharmony_ciextern __be32 nfsd4_process_open1(struct nfsd4_compound_state *, 80962306a36Sopenharmony_ci struct nfsd4_open *open, struct nfsd_net *nn); 81062306a36Sopenharmony_ciextern __be32 nfsd4_process_open2(struct svc_rqst *rqstp, 81162306a36Sopenharmony_ci struct svc_fh *current_fh, struct nfsd4_open *open); 81262306a36Sopenharmony_ciextern void nfsd4_cstate_clear_replay(struct nfsd4_compound_state *cstate); 81362306a36Sopenharmony_ciextern void nfsd4_cleanup_open_state(struct nfsd4_compound_state *cstate, 81462306a36Sopenharmony_ci struct nfsd4_open *open); 81562306a36Sopenharmony_ciextern __be32 nfsd4_open_confirm(struct svc_rqst *rqstp, 81662306a36Sopenharmony_ci struct nfsd4_compound_state *, union nfsd4_op_u *u); 81762306a36Sopenharmony_ciextern __be32 nfsd4_close(struct svc_rqst *rqstp, struct nfsd4_compound_state *, 81862306a36Sopenharmony_ci union nfsd4_op_u *u); 81962306a36Sopenharmony_ciextern __be32 nfsd4_open_downgrade(struct svc_rqst *rqstp, 82062306a36Sopenharmony_ci struct nfsd4_compound_state *, union nfsd4_op_u *u); 82162306a36Sopenharmony_ciextern __be32 nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *, 82262306a36Sopenharmony_ci union nfsd4_op_u *u); 82362306a36Sopenharmony_ciextern __be32 nfsd4_lockt(struct svc_rqst *rqstp, struct nfsd4_compound_state *, 82462306a36Sopenharmony_ci union nfsd4_op_u *u); 82562306a36Sopenharmony_ciextern __be32 nfsd4_locku(struct svc_rqst *rqstp, struct nfsd4_compound_state *, 82662306a36Sopenharmony_ci union nfsd4_op_u *u); 82762306a36Sopenharmony_ciextern __be32 82862306a36Sopenharmony_cinfsd4_release_lockowner(struct svc_rqst *rqstp, 82962306a36Sopenharmony_ci struct nfsd4_compound_state *, union nfsd4_op_u *u); 83062306a36Sopenharmony_ciextern void nfsd4_release_compoundargs(struct svc_rqst *rqstp); 83162306a36Sopenharmony_ciextern __be32 nfsd4_delegreturn(struct svc_rqst *rqstp, 83262306a36Sopenharmony_ci struct nfsd4_compound_state *, union nfsd4_op_u *u); 83362306a36Sopenharmony_ciextern __be32 nfsd4_renew(struct svc_rqst *rqstp, struct nfsd4_compound_state *, 83462306a36Sopenharmony_ci union nfsd4_op_u *u); 83562306a36Sopenharmony_ciextern __be32 nfsd4_test_stateid(struct svc_rqst *rqstp, 83662306a36Sopenharmony_ci struct nfsd4_compound_state *, union nfsd4_op_u *); 83762306a36Sopenharmony_ciextern __be32 nfsd4_free_stateid(struct svc_rqst *rqstp, 83862306a36Sopenharmony_ci struct nfsd4_compound_state *, union nfsd4_op_u *); 83962306a36Sopenharmony_ciextern void nfsd4_bump_seqid(struct nfsd4_compound_state *, __be32 nfserr); 84062306a36Sopenharmony_ci 84162306a36Sopenharmony_cienum nfsd4_op_flags { 84262306a36Sopenharmony_ci ALLOWED_WITHOUT_FH = 1 << 0, /* No current filehandle required */ 84362306a36Sopenharmony_ci ALLOWED_ON_ABSENT_FS = 1 << 1, /* ops processed on absent fs */ 84462306a36Sopenharmony_ci ALLOWED_AS_FIRST_OP = 1 << 2, /* ops reqired first in compound */ 84562306a36Sopenharmony_ci /* For rfc 5661 section 2.6.3.1.1: */ 84662306a36Sopenharmony_ci OP_HANDLES_WRONGSEC = 1 << 3, 84762306a36Sopenharmony_ci OP_IS_PUTFH_LIKE = 1 << 4, 84862306a36Sopenharmony_ci /* 84962306a36Sopenharmony_ci * These are the ops whose result size we estimate before 85062306a36Sopenharmony_ci * encoding, to avoid performing an op then not being able to 85162306a36Sopenharmony_ci * respond or cache a response. This includes writes and setattrs 85262306a36Sopenharmony_ci * as well as the operations usually called "nonidempotent": 85362306a36Sopenharmony_ci */ 85462306a36Sopenharmony_ci OP_MODIFIES_SOMETHING = 1 << 5, 85562306a36Sopenharmony_ci /* 85662306a36Sopenharmony_ci * Cache compounds containing these ops in the xid-based drc: 85762306a36Sopenharmony_ci * We use the DRC for compounds containing non-idempotent 85862306a36Sopenharmony_ci * operations, *except* those that are 4.1-specific (since 85962306a36Sopenharmony_ci * sessions provide their own EOS), and except for stateful 86062306a36Sopenharmony_ci * operations other than setclientid and setclientid_confirm 86162306a36Sopenharmony_ci * (since sequence numbers provide EOS for open, lock, etc in 86262306a36Sopenharmony_ci * the v4.0 case). 86362306a36Sopenharmony_ci */ 86462306a36Sopenharmony_ci OP_CACHEME = 1 << 6, 86562306a36Sopenharmony_ci /* 86662306a36Sopenharmony_ci * These are ops which clear current state id. 86762306a36Sopenharmony_ci */ 86862306a36Sopenharmony_ci OP_CLEAR_STATEID = 1 << 7, 86962306a36Sopenharmony_ci /* Most ops return only an error on failure; some may do more: */ 87062306a36Sopenharmony_ci OP_NONTRIVIAL_ERROR_ENCODE = 1 << 8, 87162306a36Sopenharmony_ci}; 87262306a36Sopenharmony_ci 87362306a36Sopenharmony_cistruct nfsd4_operation { 87462306a36Sopenharmony_ci __be32 (*op_func)(struct svc_rqst *, struct nfsd4_compound_state *, 87562306a36Sopenharmony_ci union nfsd4_op_u *); 87662306a36Sopenharmony_ci void (*op_release)(union nfsd4_op_u *); 87762306a36Sopenharmony_ci u32 op_flags; 87862306a36Sopenharmony_ci char *op_name; 87962306a36Sopenharmony_ci /* Try to get response size before operation */ 88062306a36Sopenharmony_ci u32 (*op_rsize_bop)(const struct svc_rqst *rqstp, 88162306a36Sopenharmony_ci const struct nfsd4_op *op); 88262306a36Sopenharmony_ci void (*op_get_currentstateid)(struct nfsd4_compound_state *, 88362306a36Sopenharmony_ci union nfsd4_op_u *); 88462306a36Sopenharmony_ci void (*op_set_currentstateid)(struct nfsd4_compound_state *, 88562306a36Sopenharmony_ci union nfsd4_op_u *); 88662306a36Sopenharmony_ci}; 88762306a36Sopenharmony_ci 88862306a36Sopenharmony_cistruct nfsd4_cb_recall_any { 88962306a36Sopenharmony_ci struct nfsd4_callback ra_cb; 89062306a36Sopenharmony_ci u32 ra_keep; 89162306a36Sopenharmony_ci u32 ra_bmval[1]; 89262306a36Sopenharmony_ci}; 89362306a36Sopenharmony_ci 89462306a36Sopenharmony_ci#endif 895