Blame view

fs/nfsd/state.h 15.1 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
   *  Copyright (c) 2001 The Regents of the University of Michigan.
   *  All rights reserved.
   *
   *  Kendrick Smith <kmsmith@umich.edu>
   *  Andy Adamson <andros@umich.edu>
   *  
   *  Redistribution and use in source and binary forms, with or without
   *  modification, are permitted provided that the following conditions
   *  are met:
   *  
   *  1. Redistributions of source code must retain the above copyright
   *     notice, this list of conditions and the following disclaimer.
   *  2. Redistributions in binary form must reproduce the above copyright
   *     notice, this list of conditions and the following disclaimer in the
   *     documentation and/or other materials provided with the distribution.
   *  3. Neither the name of the University nor the names of its
   *     contributors may be used to endorse or promote products derived
   *     from this software without specific prior written permission.
   *
   *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
   *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
   *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   *  DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   *  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
   *  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
   *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
   *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
   *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   *
   */
  
  #ifndef _NFSD4_STATE_H
  #define _NFSD4_STATE_H
38c2f4b12   J. Bruce Fields   nfsd4: look up st...
37
  #include <linux/idr.h>
19cf5c026   J. Bruce Fields   nfsd4: use callba...
38
  #include <linux/sunrpc/svc_xprt.h>
72579ac9c   Boaz Harrosh   nfsd: Headers Ind...
39
  #include <linux/nfsd/nfsfh.h>
1557aca79   J. Bruce Fields   nfsd: move most o...
40
  #include "nfsfh.h"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
41

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
42
43
44
45
46
47
  typedef struct {
  	u32             cl_boot;
  	u32             cl_id;
  } clientid_t;
  
  typedef struct {
d3b313a46   J. Bruce Fields   nfsd4: construct ...
48
49
  	clientid_t	so_clid;
  	u32		so_id;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
50
51
52
53
54
55
  } stateid_opaque_t;
  
  typedef struct {
  	u32                     si_generation;
  	stateid_opaque_t        si_opaque;
  } stateid_t;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
56

8c10cbdb4   Benny Halevy   nfsd: use STATEID...
57
58
  #define STATEID_FMT	"(%08x/%08x/%08x/%08x)"
  #define STATEID_VAL(s) \
d3b313a46   J. Bruce Fields   nfsd4: construct ...
59
60
61
  	(s)->si_opaque.so_clid.cl_boot, \
  	(s)->si_opaque.so_clid.cl_id, \
  	(s)->si_opaque.so_id, \
8c10cbdb4   Benny Halevy   nfsd: use STATEID...
62
  	(s)->si_generation
227f98d98   J. Bruce Fields   nfsd4: preallocat...
63
  struct nfsd4_callback {
fb0039232   J. Bruce Fields   nfsd4: remove sep...
64
65
  	void *cb_op;
  	struct nfs4_client *cb_clp;
5ce8ba25d   J. Bruce Fields   nfsd4: allow rest...
66
  	struct list_head cb_per_client;
fb0039232   J. Bruce Fields   nfsd4: remove sep...
67
  	u32 cb_minorversion;
5878453db   J. Bruce Fields   nfsd4: generic ca...
68
69
  	struct rpc_message cb_msg;
  	const struct rpc_call_ops *cb_ops;
b5a1a81e5   J. Bruce Fields   nfsd4: don't slee...
70
  	struct work_struct cb_work;
5ce8ba25d   J. Bruce Fields   nfsd4: allow rest...
71
  	bool cb_done;
227f98d98   J. Bruce Fields   nfsd4: preallocat...
72
  };
d5477a8db   J. Bruce Fields   nfsd4: add common...
73
74
75
76
  struct nfs4_stid {
  #define NFS4_OPEN_STID 1
  #define NFS4_LOCK_STID 2
  #define NFS4_DELEG_STID 4
f7a4d8720   J. Bruce Fields   nfsd4: hash close...
77
78
79
  /* For an open stateid kept around *only* to process close replays: */
  #define NFS4_CLOSED_STID 8
  	unsigned char sc_type;
d5477a8db   J. Bruce Fields   nfsd4: add common...
80
  	stateid_t sc_stateid;
2a74aba79   J. Bruce Fields   nfsd4: move clien...
81
  	struct nfs4_client *sc_client;
d5477a8db   J. Bruce Fields   nfsd4: add common...
82
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
83
  struct nfs4_delegation {
996e09385   J. Bruce Fields   nfsd4: do idr pre...
84
  	struct nfs4_stid	dl_stid; /* must be first field */
ea1da636e   NeilBrown   [PATCH] knfsd: nf...
85
86
  	struct list_head	dl_perfile;
  	struct list_head	dl_perclnt;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
87
88
  	struct list_head	dl_recall_lru;  /* delegation recalled */
  	atomic_t		dl_count;       /* ref count */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
89
  	struct nfs4_file	*dl_file;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
90
91
  	u32			dl_type;
  	time_t			dl_time;
b53d40c50   J. Bruce Fields   nfsd4: eliminate ...
92
  /* For recall: */
b53d40c50   J. Bruce Fields   nfsd4: eliminate ...
93
  	struct knfsd_fh		dl_fh;
3aea09dc9   J. Bruce Fields   nfsd4: track reca...
94
  	int			dl_retries;
227f98d98   J. Bruce Fields   nfsd4: preallocat...
95
  	struct nfsd4_callback	dl_recall;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
96
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
97
  /* client delegation callback info */
c237dc030   J. Bruce Fields   nfsd4: rename cal...
98
  struct nfs4_cb_conn {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
99
  	/* SETCLIENTID info */
aa9a4ec77   Jeff Layton   nfsd: convert nfs...
100
  	struct sockaddr_storage	cb_addr;
6f3d772fb   Takuma Umeya   nfs4: set source ...
101
  	struct sockaddr_storage	cb_saddr;
aa9a4ec77   Jeff Layton   nfsd: convert nfs...
102
  	size_t			cb_addrlen;
8b5ce5cd4   J. Bruce Fields   nfsd4: callback p...
103
104
  	u32                     cb_prog; /* used only in 4.0 case;
  					    per-session otherwise */
ab52ae6db   Andy Adamson   nfsd41: Backchann...
105
  	u32                     cb_ident;	/* minorversion 0 only */
2bf23875f   J. Bruce Fields   nfsd4: rearrange ...
106
  	struct svc_xprt		*cb_xprt;	/* minorversion 1 only */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
107
  };
f459e4535   J. Bruce Fields   nfsd4: hash deleg...
108
109
110
111
  static inline struct nfs4_delegation *delegstateid(struct nfs4_stid *s)
  {
  	return container_of(s, struct nfs4_delegation, dl_stid);
  }
a649637c7   Andy Adamson   nfsd41: bound for...
112
113
  /* Maximum number of slots per session. 160 is useful for long haul TCP */
  #define NFSD_MAX_SLOTS_PER_SESSION     160
ec6b5d7b5   Andy Adamson   nfsd41: create_se...
114
115
  /* Maximum number of operations per session compound */
  #define NFSD_MAX_OPS_PER_COMPOUND	16
557ce2646   Andy Adamson   nfsd41: replace p...
116
117
  /* Maximum  session per slot cache size */
  #define NFSD_SLOT_CACHE_SIZE		1024
a649637c7   Andy Adamson   nfsd41: bound for...
118
119
120
121
  /* Maximum number of NFSD_SLOT_CACHE_SIZE slots per session */
  #define NFSD_CACHE_SIZE_SLOTS_PER_SESSION	32
  #define NFSD_MAX_MEM_PER_SESSION  \
  		(NFSD_CACHE_SIZE_SLOTS_PER_SESSION * NFSD_SLOT_CACHE_SIZE)
074fe8975   Andy Adamson   nfsd41: DRC save,...
122

7116ed6b9   Andy Adamson   nfsd41: sessions ...
123
  struct nfsd4_slot {
557ce2646   Andy Adamson   nfsd41: replace p...
124
125
126
127
128
129
130
  	bool	sl_inuse;
  	bool	sl_cachethis;
  	u16	sl_opcnt;
  	u32	sl_seqid;
  	__be32	sl_status;
  	u32	sl_datalen;
  	char	sl_data[];
7116ed6b9   Andy Adamson   nfsd41: sessions ...
131
  };
6c18ba9f5   Alexandros Batsakis   nfsd41: move chan...
132
133
134
135
136
137
138
139
140
141
  struct nfsd4_channel_attrs {
  	u32		headerpadsz;
  	u32		maxreq_sz;
  	u32		maxresp_sz;
  	u32		maxresp_cached;
  	u32		maxops;
  	u32		maxreqs;
  	u32		nr_rdma_attrs;
  	u32		rdma_attrs;
  };
49557cc74   Andy Adamson   nfsd41: Use separ...
142
143
144
145
146
147
148
149
150
151
152
  struct nfsd4_create_session {
  	clientid_t			clientid;
  	struct nfs4_sessionid		sessionid;
  	u32				seqid;
  	u32				flags;
  	struct nfsd4_channel_attrs	fore_channel;
  	struct nfsd4_channel_attrs	back_channel;
  	u32				callback_prog;
  	u32				uid;
  	u32				gid;
  };
1d1bc8f20   J. Bruce Fields   nfsd4: support BI...
153
154
155
156
  struct nfsd4_bind_conn_to_session {
  	struct nfs4_sessionid		sessionid;
  	u32				dir;
  };
49557cc74   Andy Adamson   nfsd41: Use separ...
157
158
159
160
161
162
  /* The single slot clientid cache structure */
  struct nfsd4_clid_slot {
  	u32				sl_seqid;
  	__be32				sl_status;
  	struct nfsd4_create_session	sl_cr_ses;
  };
c7662518c   J. Bruce Fields   nfsd4: keep per-s...
163
164
165
  struct nfsd4_conn {
  	struct list_head cn_persession;
  	struct svc_xprt *cn_xprt;
19cf5c026   J. Bruce Fields   nfsd4: use callba...
166
167
  	struct svc_xpt_user cn_xpt_user;
  	struct nfsd4_session *cn_session;
c7662518c   J. Bruce Fields   nfsd4: keep per-s...
168
169
170
  /* CDFC4_FORE, CDFC4_BACK: */
  	unsigned char cn_flags;
  };
7116ed6b9   Andy Adamson   nfsd41: sessions ...
171
172
173
174
175
  struct nfsd4_session {
  	struct kref		se_ref;
  	struct list_head	se_hash;	/* hash by sessionid */
  	struct list_head	se_perclnt;
  	u32			se_flags;
07cd4909a   Benny Halevy   nfsd4: mark_clien...
176
  	struct nfs4_client	*se_client;
7116ed6b9   Andy Adamson   nfsd41: sessions ...
177
  	struct nfs4_sessionid	se_sessionid;
6c18ba9f5   Alexandros Batsakis   nfsd41: move chan...
178
179
  	struct nfsd4_channel_attrs se_fchannel;
  	struct nfsd4_channel_attrs se_bchannel;
c7662518c   J. Bruce Fields   nfsd4: keep per-s...
180
  	struct list_head	se_conns;
8b5ce5cd4   J. Bruce Fields   nfsd4: callback p...
181
  	u32			se_cb_prog;
ac7c46f29   J. Bruce Fields   nfsd4: make backc...
182
  	u32			se_cb_seq_nr;
557ce2646   Andy Adamson   nfsd41: replace p...
183
  	struct nfsd4_slot	*se_slots[];	/* forward channel slots */
7116ed6b9   Andy Adamson   nfsd41: sessions ...
184
185
186
187
188
189
190
191
192
193
194
195
196
197
  };
  
  static inline void
  nfsd4_put_session(struct nfsd4_session *ses)
  {
  	extern void free_session(struct kref *kref);
  	kref_put(&ses->se_ref, free_session);
  }
  
  static inline void
  nfsd4_get_session(struct nfsd4_session *ses)
  {
  	kref_get(&ses->se_ref);
  }
5282fd724   Marc Eshel   nfsd41: sessionid...
198
199
200
201
202
203
  /* formatted contents of nfs4_sessionid */
  struct nfsd4_sessionid {
  	clientid_t	clientid;
  	u32		sequence;
  	u32		reserved;
  };
a55370a3c   NeilBrown   [PATCH] knfsd: nf...
204
  #define HEXDIR_LEN     33 /* hex version of 16 byte md5 of cl_name plus '\0' */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
205
206
207
208
209
210
211
212
213
214
215
216
217
  /*
   * struct nfs4_client - one per client.  Clientids live here.
   * 	o Each nfs4_client is hashed by clientid.
   *
   * 	o Each nfs4_clients is also hashed by name 
   * 	  (the opaque quantity initially sent by the client to identify itself).
   * 	  
   *	o cl_perclient list is used to ensure no dangling stateowner references
   *	  when we expire the nfs4_client
   */
  struct nfs4_client {
  	struct list_head	cl_idhash; 	/* hash by cl_clientid.id */
  	struct list_head	cl_strhash; 	/* hash by cl_name */
ea1da636e   NeilBrown   [PATCH] knfsd: nf...
218
  	struct list_head	cl_openowners;
38c2f4b12   J. Bruce Fields   nfsd4: look up st...
219
  	struct idr		cl_stateids;	/* stateid lookup */
ea1da636e   NeilBrown   [PATCH] knfsd: nf...
220
  	struct list_head	cl_delegations;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
221
222
  	struct list_head        cl_lru;         /* tail queue */
  	struct xdr_netobj	cl_name; 	/* id generated by client */
a55370a3c   NeilBrown   [PATCH] knfsd: nf...
223
  	char                    cl_recdir[HEXDIR_LEN]; /* recovery dir */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
224
225
  	nfs4_verifier		cl_verifier; 	/* generated by client */
  	time_t                  cl_time;        /* time of last lease renewal */
363168b4e   Jeff Layton   nfsd: make nfs4_c...
226
  	struct sockaddr_storage	cl_addr; 	/* client ipaddress */
61054b14d   Olga Kornievskaia   nfsd: support cal...
227
  	u32			cl_flavor;	/* setclientid pseudoflavor */
68e76ad0b   Olga Kornievskaia   nfsd: pass client...
228
  	char			*cl_principal;	/* setclientid principal name */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
229
230
231
  	struct svc_cred		cl_cred; 	/* setclientid principal */
  	clientid_t		cl_clientid;	/* generated by server */
  	nfs4_verifier		cl_confirm;	/* generated by server */
c7b9a4592   NeilBrown   [PATCH] knfsd: nf...
232
  	u32			cl_firststate;	/* recovery dir creation */
8323c3b2a   J. Bruce Fields   nfsd4: move minor...
233
  	u32			cl_minorversion;
9fb870702   Marc Eshel   nfsd41: introduce...
234

2bf23875f   J. Bruce Fields   nfsd4: rearrange ...
235
236
  	/* for v4.0 and v4.1 callbacks: */
  	struct nfs4_cb_conn	cl_cb_conn;
6ff8da088   J. Bruce Fields   nfsd4: Move callb...
237
238
239
  #define NFSD4_CLIENT_CB_UPDATE	1
  #define NFSD4_CLIENT_KILL	2
  	unsigned long		cl_cb_flags;
2bf23875f   J. Bruce Fields   nfsd4: rearrange ...
240
  	struct rpc_clnt		*cl_cb_client;
6ff8da088   J. Bruce Fields   nfsd4: Move callb...
241
  	u32			cl_cb_ident;
77a3569d6   J. Bruce Fields   nfsd4: keep finer...
242
243
244
  #define NFSD4_CB_UP		0
  #define NFSD4_CB_UNKNOWN	1
  #define NFSD4_CB_DOWN		2
5423732a7   Benny Halevy   nfsd41: use SEQ4_...
245
  #define NFSD4_CB_FAULT		3
77a3569d6   J. Bruce Fields   nfsd4: keep finer...
246
  	int			cl_cb_state;
cee277d92   J. Bruce Fields   nfsd4: use generi...
247
  	struct nfsd4_callback	cl_cb_null;
edd767866   J. Bruce Fields   nfsd4: move callb...
248
  	struct nfsd4_session	*cl_cb_session;
5ce8ba25d   J. Bruce Fields   nfsd4: allow rest...
249
  	struct list_head	cl_callbacks; /* list of in-progress callbacks */
2bf23875f   J. Bruce Fields   nfsd4: rearrange ...
250

6ff8da088   J. Bruce Fields   nfsd4: Move callb...
251
252
  	/* for all client information that callback code might need: */
  	spinlock_t		cl_lock;
9fb870702   Marc Eshel   nfsd41: introduce...
253
254
  	/* for nfs41 */
  	struct list_head	cl_sessions;
49557cc74   Andy Adamson   nfsd41: Use separ...
255
  	struct nfsd4_clid_slot	cl_cs_slot;	/* create_session slot */
0733d2133   Andy Adamson   nfsd41: exchange_...
256
  	u32			cl_exchange_flags;
46583e259   Benny Halevy   nfsd4: introduce ...
257
258
  	/* number of rpc's in progress over an associated session: */
  	atomic_t		cl_refcount;
38524ab38   Andy Adamson   nfsd41: Backchann...
259
260
  
  	/* for nfs41 callbacks */
199ff35e1   Ricardo Labiaga   nfsd41: Backchann...
261
262
  	/* We currently support a single back channel with a single slot */
  	unsigned long		cl_cb_slot_busy;
199ff35e1   Ricardo Labiaga   nfsd41: Backchann...
263
264
  	struct rpc_wait_queue	cl_cb_waitq;	/* backchannel callers may */
  						/* wait here for slots */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
265
  };
07cd4909a   Benny Halevy   nfsd4: mark_clien...
266
267
268
269
270
271
272
273
274
275
276
  static inline void
  mark_client_expired(struct nfs4_client *clp)
  {
  	clp->cl_time = 0;
  }
  
  static inline bool
  is_client_expired(struct nfs4_client *clp)
  {
  	return clp->cl_time == 0;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
277
278
279
280
281
282
283
  /* struct nfs4_client_reset
   * one per old client. Populates reset_str_hashtbl. Filled from conf_id_hashtbl
   * upon lease reset, or from upcall to state_daemon (to read in state
   * from non-volitile storage) upon reboot.
   */
  struct nfs4_client_reclaim {
  	struct list_head	cr_strhash;	/* hash by cr_name */
a55370a3c   NeilBrown   [PATCH] knfsd: nf...
284
  	char			cr_recdir[HEXDIR_LEN]; /* recover dir */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
285
286
287
288
289
290
  };
  
  static inline void
  update_stateid(stateid_t *stateid)
  {
  	stateid->si_generation++;
81b829655   J. Bruce Fields   nfsd4: simplify s...
291
292
293
  	/* Wraparound recommendation from 3530bis-13 9.1.3.2: */
  	if (stateid->si_generation == 0)
  		stateid->si_generation = 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
  }
  
  /* A reasonable value for REPLAY_ISIZE was estimated as follows:  
   * The OPEN response, typically the largest, requires 
   *   4(status) + 8(stateid) + 20(changeinfo) + 4(rflags) +  8(verifier) + 
   *   4(deleg. type) + 8(deleg. stateid) + 4(deleg. recall flag) + 
   *   20(deleg. space limit) + ~32(deleg. ace) = 112 bytes 
   */
  
  #define NFSD4_REPLAY_ISIZE       112 
  
  /*
   * Replay buffer, where the result of the last seqid-mutating operation 
   * is cached. 
   */
  struct nfs4_replay {
b37ad28bc   Al Viro   [PATCH] nfsd: nfs...
310
  	__be32			rp_status;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
311
312
  	unsigned int		rp_buflen;
  	char			*rp_buf;
a4773c08f   J. Bruce Fields   nfsd4: use helper...
313
  	struct knfsd_fh		rp_openfh;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
314
315
  	char			rp_ibuf[NFSD4_REPLAY_ISIZE];
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
316
  struct nfs4_stateowner {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
317
  	struct list_head        so_strhash;   /* hash by op_name */
ea1da636e   NeilBrown   [PATCH] knfsd: nf...
318
  	struct list_head        so_stateids;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
319
  	struct nfs4_client *    so_client;
7fb64cee3   NeilBrown   [PATCH] nfsd4: se...
320
321
322
  	/* after increment in ENCODE_SEQID_OP_TAIL, represents the next
  	 * sequence id expected from the client: */
  	u32                     so_seqid;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
323
  	struct xdr_netobj       so_owner;     /* open owner name */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
324
  	struct nfs4_replay	so_replay;
3557e43b8   J. Bruce Fields   nfsd4: make is_op...
325
  	bool			so_is_open_owner;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
326
  };
fe0750e5c   J. Bruce Fields   nfsd4: split stat...
327
328
329
  struct nfs4_openowner {
  	struct nfs4_stateowner	oo_owner; /* must be first field */
  	struct list_head        oo_perclient;
b31b30e5c   J. Bruce Fields   nfsd4: cleanup st...
330
331
332
333
334
335
336
337
  	/*
  	 * We keep around openowners a little while after last close,
  	 * which saves clients from having to confirm, and allows us to
  	 * handle close replays if they come soon enough.  The close_lru
  	 * is a list of such openowners, to be reaped by the laundromat
  	 * thread eventually if they remain unused:
  	 */
  	struct list_head	oo_close_lru;
38c387b52   J. Bruce Fields   nfsd4: match clos...
338
  	struct nfs4_ol_stateid *oo_last_closed_stid;
fe0750e5c   J. Bruce Fields   nfsd4: split stat...
339
  	time_t			oo_time; /* time of placement on so_close_lru */
dad1c067e   J. Bruce Fields   nfsd4: replace oo...
340
  #define NFS4_OO_CONFIRMED   1
38c387b52   J. Bruce Fields   nfsd4: match clos...
341
  #define NFS4_OO_PURGE_CLOSE 2
d29b20cd5   J. Bruce Fields   nfsd4: clean up o...
342
  #define NFS4_OO_NEW         4
dad1c067e   J. Bruce Fields   nfsd4: replace oo...
343
  	unsigned char		oo_flags;
fe0750e5c   J. Bruce Fields   nfsd4: split stat...
344
345
346
347
  };
  
  struct nfs4_lockowner {
  	struct nfs4_stateowner	lo_owner; /* must be first element */
009673b43   J. Bruce Fields   nfsd4: add a sepa...
348
  	struct list_head	lo_owner_ino_hash; /* hash by owner,file */
fe0750e5c   J. Bruce Fields   nfsd4: split stat...
349
350
351
352
353
354
355
356
357
358
359
360
361
  	struct list_head        lo_perstateid; /* for lockowners only */
  	struct list_head	lo_list; /* for temporary uses */
  };
  
  static inline struct nfs4_openowner * openowner(struct nfs4_stateowner *so)
  {
  	return container_of(so, struct nfs4_openowner, oo_owner);
  }
  
  static inline struct nfs4_lockowner * lockowner(struct nfs4_stateowner *so)
  {
  	return container_of(so, struct nfs4_lockowner, lo_owner);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
362
363
364
365
366
367
  /*
  *  nfs4_file: a file opened by some number of (open) nfs4_stateowners.
  *    o fi_perfile list is used to search for conflicting 
  *      share_acces, share_deny on the file.
  */
  struct nfs4_file {
8b671b807   J. Bruce Fields   nfsd4: remove use...
368
  	atomic_t		fi_ref;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
369
  	struct list_head        fi_hash;    /* hash by "struct inode *" */
8beefa249   NeilBrown   [PATCH] nfsd4: re...
370
371
  	struct list_head        fi_stateids;
  	struct list_head	fi_delegations;
f9d7562fd   J. Bruce Fields   nfsd4: share file...
372
373
  	/* One each for O_RDONLY, O_WRONLY, O_RDWR: */
  	struct file *		fi_fds[3];
f9d7562fd   J. Bruce Fields   nfsd4: share file...
374
  	/*
6409a5a65   J. Bruce Fields   nfsd4: clean up d...
375
376
377
378
379
  	 * Each open or lock stateid contributes 0-4 to the counts
  	 * below depending on which bits are set in st_access_bitmap:
  	 *     1 to fi_access[O_RDONLY] if NFS4_SHARE_ACCES_READ is set
  	 *   + 1 to fi_access[O_WRONLY] if NFS4_SHARE_ACCESS_WRITE is set
  	 *   + 1 to both of the above if NFS4_SHARE_ACCESS_BOTH is set.
f9d7562fd   J. Bruce Fields   nfsd4: share file...
380
  	 */
9ae78bcc0   J. Bruce Fields   nfsd4: fix commen...
381
  	atomic_t		fi_access[2];
acfdf5c38   J. Bruce Fields   nfsd4: acquire on...
382
383
384
  	struct file		*fi_deleg_file;
  	struct file_lock	*fi_lease;
  	atomic_t		fi_delegees;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
385
  	struct inode		*fi_inode;
47f9940c5   Meelap Shah   knfsd: nfsd4: don...
386
  	bool			fi_had_conflict;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
387
  };
f9d7562fd   J. Bruce Fields   nfsd4: share file...
388
389
390
391
  /* XXX: for first cut may fall back on returning file that doesn't work
   * at all? */
  static inline struct file *find_writeable_file(struct nfs4_file *f)
  {
7d9478429   J. Bruce Fields   nfsd4: fix downgr...
392
393
394
  	if (f->fi_fds[O_WRONLY])
  		return f->fi_fds[O_WRONLY];
  	return f->fi_fds[O_RDWR];
f9d7562fd   J. Bruce Fields   nfsd4: share file...
395
396
397
398
  }
  
  static inline struct file *find_readable_file(struct nfs4_file *f)
  {
7d9478429   J. Bruce Fields   nfsd4: fix downgr...
399
400
401
  	if (f->fi_fds[O_RDONLY])
  		return f->fi_fds[O_RDONLY];
  	return f->fi_fds[O_RDWR];
f9d7562fd   J. Bruce Fields   nfsd4: share file...
402
403
404
405
406
407
  }
  
  static inline struct file *find_any_file(struct nfs4_file *f)
  {
  	if (f->fi_fds[O_RDWR])
  		return f->fi_fds[O_RDWR];
18608ad49   J. Bruce Fields   nfsd4: typo fix i...
408
  	else if (f->fi_fds[O_WRONLY])
f9d7562fd   J. Bruce Fields   nfsd4: share file...
409
410
411
412
  		return f->fi_fds[O_WRONLY];
  	else
  		return f->fi_fds[O_RDONLY];
  }
d5477a8db   J. Bruce Fields   nfsd4: add common...
413
  /* "ol" stands for "Open or Lock".  Better suggestions welcome. */
dcef0413d   J. Bruce Fields   nfsd4: move some ...
414
  struct nfs4_ol_stateid {
996e09385   J. Bruce Fields   nfsd4: do idr pre...
415
  	struct nfs4_stid    st_stid; /* must be first field */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
416
  	struct list_head              st_perfile;
ea1da636e   NeilBrown   [PATCH] knfsd: nf...
417
418
  	struct list_head              st_perstateowner;
  	struct list_head              st_lockowners;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
419
420
  	struct nfs4_stateowner      * st_stateowner;
  	struct nfs4_file            * st_file;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
421
422
  	unsigned long                 st_access_bmap;
  	unsigned long                 st_deny_bmap;
dcef0413d   J. Bruce Fields   nfsd4: move some ...
423
  	struct nfs4_ol_stateid         * st_openstp;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
424
  };
dcef0413d   J. Bruce Fields   nfsd4: move some ...
425
426
427
428
  static inline struct nfs4_ol_stateid *openlockstateid(struct nfs4_stid *s)
  {
  	return container_of(s, struct nfs4_ol_stateid, st_stid);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
429
  /* flags for preprocess_seqid_op() */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
430
431
  #define RD_STATE	        0x00000010
  #define WR_STATE	        0x00000020
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
432

dd453dfd7   Benny Halevy   nfsd: pass nfsd4_...
433
434
435
  struct nfsd4_compound_state;
  
  extern __be32 nfs4_preprocess_stateid_op(struct nfsd4_compound_state *cstate,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
436
  		stateid_t *stateid, int flags, struct file **filp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
437
438
439
  extern void nfs4_lock_state(void);
  extern void nfs4_unlock_state(void);
  extern int nfs4_in_grace(void);
b37ad28bc   Al Viro   [PATCH] nfsd: nfs...
440
  extern __be32 nfs4_check_open_reclaim(clientid_t *clid);
fe0750e5c   J. Bruce Fields   nfsd4: split stat...
441
442
  extern void nfs4_free_openowner(struct nfs4_openowner *);
  extern void nfs4_free_lockowner(struct nfs4_lockowner *);
80fc015bd   J. Bruce Fields   nfsd4: use common...
443
  extern int set_callback_cred(void);
5a3c9d713   J. Bruce Fields   nfsd4: separate c...
444
  extern void nfsd4_probe_callback(struct nfs4_client *clp);
84f5f7ccc   J. Bruce Fields   nfsd4: make sure ...
445
  extern void nfsd4_probe_callback_sync(struct nfs4_client *clp);
5a3c9d713   J. Bruce Fields   nfsd4: separate c...
446
  extern void nfsd4_change_callback(struct nfs4_client *clp, struct nfs4_cb_conn *);
b5a1a81e5   J. Bruce Fields   nfsd4: don't slee...
447
  extern void nfsd4_do_callback_rpc(struct work_struct *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
448
  extern void nfsd4_cb_recall(struct nfs4_delegation *dp);
b5a1a81e5   J. Bruce Fields   nfsd4: don't slee...
449
450
  extern int nfsd4_create_callback_queue(void);
  extern void nfsd4_destroy_callback_queue(void);
6ff8da088   J. Bruce Fields   nfsd4: Move callb...
451
  extern void nfsd4_shutdown_callback(struct nfs4_client *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
452
  extern void nfs4_put_delegation(struct nfs4_delegation *dp);
b37ad28bc   Al Viro   [PATCH] nfsd: nfs...
453
  extern __be32 nfs4_make_rec_clidname(char *clidname, struct xdr_netobj *clname);
48483bf23   J. Bruce Fields   nfsd4: simplify r...
454
  extern void nfsd4_init_recdir(void);
190e4fbf9   NeilBrown   [PATCH] knfsd: nf...
455
456
457
  extern int nfsd4_recdir_load(void);
  extern void nfsd4_shutdown_recdir(void);
  extern int nfs4_client_to_reclaim(const char *name);
a1bcecd29   Andy Adamson   nfsd41: match cli...
458
  extern int nfs4_has_reclaimed_state(const char *name, bool use_exchange_id);
c7b9a4592   NeilBrown   [PATCH] knfsd: nf...
459
  extern void nfsd4_recdir_purge_old(void);
7a6ef8c72   J. Bruce Fields   nfsd4: nfsd4_crea...
460
  extern void nfsd4_create_clid_dir(struct nfs4_client *clp);
c7b9a4592   NeilBrown   [PATCH] knfsd: nf...
461
  extern void nfsd4_remove_clid_dir(struct nfs4_client *clp);
d76829889   Benny Halevy   nfsd4: keep a ref...
462
  extern void release_session_client(struct nfsd4_session *);
38c2f4b12   J. Bruce Fields   nfsd4: look up st...
463
  extern __be32 nfs4_validate_stateid(struct nfs4_client *, stateid_t *);
38c387b52   J. Bruce Fields   nfsd4: match clos...
464
  extern void nfsd4_purge_closed_stateid(struct nfs4_stateowner *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
465

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
466
  #endif   /* NFSD4_STATE_H */