2 * linux/include/nfsd/state.h
4 * Copyright (c) 2001 The Regents of the University of Michigan.
7 * Kendrick Smith <kmsmith@umich.edu>
8 * Andy Adamson <andros@umich.edu>
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in the
18 * documentation and/or other materials provided with the distribution.
19 * 3. Neither the name of the University nor the names of its
20 * contributors may be used to endorse or promote products derived
21 * from this software without specific prior written permission.
23 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
24 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
25 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26 * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
28 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
29 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
30 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
31 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
32 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 #ifndef _NFSD4_STATE_H
38 #define _NFSD4_STATE_H
40 #include <linux/list.h>
42 #define NFS4_OPAQUE_LIMIT 1024
56 stateid_opaque_t si_opaque
;
58 #define si_boot si_opaque.so_boot
59 #define si_stateownerid si_opaque.so_stateownerid
60 #define si_fileid si_opaque.so_fileid
62 extern stateid_t zerostateid
;
63 extern stateid_t onestateid
;
65 #define ZERO_STATEID(stateid) (!memcmp((stateid), &zerostateid, sizeof(stateid_t)))
66 #define ONE_STATEID(stateid) (!memcmp((stateid), &onestateid, sizeof(stateid_t)))
69 * struct nfs4_client - one per client. Clientids live here.
70 * o Each nfs4_client is hashed by clientid.
72 * o Each nfs4_clients is also hashed by name
73 * (the opaque quantity initially sent by the client to identify itself).
75 * o cl_perclient list is used to ensure no dangling stateowner references
76 * when we expire the nfs4_client
79 struct list_head cl_idhash
; /* hash by cl_clientid.id */
80 struct list_head cl_strhash
; /* hash by cl_name */
81 struct list_head cl_perclient
; /* list: stateowners */
82 struct list_head cl_lru
; /* tail queue */
83 struct xdr_netobj cl_name
; /* id generated by client */
84 nfs4_verifier cl_verifier
; /* generated by client */
85 time_t cl_time
; /* time of last lease renewal */
86 u32 cl_addr
; /* client ipaddress */
87 struct svc_cred cl_cred
; /* setclientid principal */
88 clientid_t cl_clientid
; /* generated by server */
89 nfs4_verifier cl_confirm
; /* generated by server */
93 update_stateid(stateid_t
*stateid
)
95 stateid
->si_generation
++;
99 * nfs4_stateowner can either be an open_owner, or (eventually) a lock_owner
101 * o so_peropenstate list is used to ensure no dangling nfs4_stateid
102 * reverences when we release a stateowner.
104 struct nfs4_stateowner
{
105 struct list_head so_idhash
; /* hash by so_id */
106 struct list_head so_strhash
; /* hash by op_name */
107 struct list_head so_perclient
; /* nfs4_client->cl_perclient */
108 struct list_head so_peropenstate
; /* list: nfs4_stateid */
110 struct nfs4_client
* so_client
;
112 struct xdr_netobj so_owner
; /* open owner name */
113 int so_confirmed
; /* successful OPEN_CONFIRM? */
117 u32 dev
; /* super_block->s_dev */
123 * nfs4_file: a file opened by some number of (open) nfs4_stateowners.
124 * o fi_perfile list is used to search for conflicting
125 * share_acces, share_deny on the file.
128 struct list_head fi_hash
; /* hash by nfs4_ino_desc_t fields */
129 struct list_head fi_perfile
; /* list: nfs4_stateid */
130 nfs4_ino_desc_t fi_ino
;
131 u32 fi_id
; /* used with stateowner->so_id
132 * for openstateid_hashtbl hash */
136 * nfs4_stateid can either be an open stateid or (eventually) a lock stateid
138 * (open)nfs4_stateid: one per (open)nfs4_stateowner, nfs4_file
141 struct nfs4_stateid
{
142 struct list_head st_hash
; /* openstateid_hashtbl[]*/
143 struct list_head st_perfile
; /* file_hashtbl[]*/
144 struct list_head st_peropenstate
; /* nfs4_stateowner->so_peropenstate */
145 struct nfs4_stateowner
* st_stateowner
;
146 struct nfs4_file
* st_file
;
147 stateid_t st_stateid
;
148 struct file st_vfs_file
;
150 unsigned int st_share_access
;
151 unsigned int st_share_deny
;
154 /* flags for preprocess_seqid_op() */
155 #define CHECK_FH 0x00000001
156 #define CONFIRM 0x00000002
158 #define seqid_mutating_err(err) \
159 (((err) != nfserr_stale_clientid) && \
160 ((err) != nfserr_bad_seqid) && \
161 ((err) != nfserr_stale_stateid) && \
162 ((err) != nfserr_bad_stateid))
164 extern time_t nfs4_laundromat(void);
165 extern int nfsd4_renew(clientid_t
*clid
);
166 extern int nfs4_preprocess_stateid_op(struct svc_fh
*current_fh
,
167 stateid_t
*stateid
, int flags
, struct nfs4_stateid
**stpp
);
168 extern int nfs4_share_conflict(struct svc_fh
*current_fh
,
169 unsigned int deny_type
);
170 extern void nfsd4_lock_state(void);
171 extern void nfsd4_unlock_state(void);
172 #endif /* NFSD4_STATE_H */