Merge with Linux 2.5.74.
[linux-2.6/linux-mips.git] / include / linux / nfsd / state.h
blob480eebab6993d9defac025ec568fb637b4ff8e0a
1 /*
2 * linux/include/nfsd/state.h
4 * Copyright (c) 2001 The Regents of the University of Michigan.
5 * All rights reserved.
7 * Kendrick Smith <kmsmith@umich.edu>
8 * Andy Adamson <andros@umich.edu>
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
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
43 typedef struct {
44 u32 cl_boot;
45 u32 cl_id;
46 } clientid_t;
48 typedef struct {
49 u32 so_boot;
50 u32 so_stateownerid;
51 u32 so_fileid;
52 } stateid_opaque_t;
54 typedef struct {
55 u32 si_generation;
56 stateid_opaque_t si_opaque;
57 } stateid_t;
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
78 struct 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 */
92 static inline void
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 */
109 u32 so_id;
110 struct nfs4_client * so_client;
111 u32 so_seqid;
112 struct xdr_netobj so_owner; /* open owner name */
113 int so_confirmed; /* successful OPEN_CONFIRM? */
116 typedef struct {
117 u32 dev; /* super_block->s_dev */
118 unsigned long ino;
119 u32 generation;
120 } nfs4_ino_desc_t;
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.
127 struct nfs4_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;
149 int st_vfs_set;
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 */