1
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#ifndef _NFSD4_STATE_H
36#define _NFSD4_STATE_H
37
38#include <linux/idr.h>
39#include <linux/sunrpc/svc_xprt.h>
40#include "nfsfh.h"
41
42typedef struct {
43 u32 cl_boot;
44 u32 cl_id;
45} clientid_t;
46
47typedef struct {
48 clientid_t so_clid;
49 u32 so_id;
50} stateid_opaque_t;
51
52typedef struct {
53 u32 si_generation;
54 stateid_opaque_t si_opaque;
55} stateid_t;
56
57#define STATEID_FMT "(%08x/%08x/%08x/%08x)"
58#define STATEID_VAL(s) \
59 (s)->si_opaque.so_clid.cl_boot, \
60 (s)->si_opaque.so_clid.cl_id, \
61 (s)->si_opaque.so_id, \
62 (s)->si_generation
63
64struct nfsd4_callback {
65 struct nfs4_client *cb_clp;
66 struct list_head cb_per_client;
67 u32 cb_minorversion;
68 struct rpc_message cb_msg;
69 struct nfsd4_callback_ops *cb_ops;
70 struct work_struct cb_work;
71 bool cb_done;
72};
73
74struct nfsd4_callback_ops {
75 void (*prepare)(struct nfsd4_callback *);
76 int (*done)(struct nfsd4_callback *, struct rpc_task *);
77 void (*release)(struct nfsd4_callback *);
78};
79
80
81
82
83
84
85struct nfs4_stid {
86 atomic_t sc_count;
87#define NFS4_OPEN_STID 1
88#define NFS4_LOCK_STID 2
89#define NFS4_DELEG_STID 4
90
91#define NFS4_CLOSED_STID 8
92
93#define NFS4_REVOKED_DELEG_STID 16
94#define NFS4_CLOSED_DELEG_STID 32
95#define NFS4_LAYOUT_STID 64
96 unsigned char sc_type;
97 stateid_t sc_stateid;
98 struct nfs4_client *sc_client;
99 struct nfs4_file *sc_file;
100 void (*sc_free)(struct nfs4_stid *);
101};
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124struct nfs4_delegation {
125 struct nfs4_stid dl_stid;
126 struct list_head dl_perfile;
127 struct list_head dl_perclnt;
128 struct list_head dl_recall_lru;
129 u32 dl_type;
130 time_t dl_time;
131
132 int dl_retries;
133 struct nfsd4_callback dl_recall;
134};
135
136#define cb_to_delegation(cb) \
137 container_of(cb, struct nfs4_delegation, dl_recall)
138
139
140struct nfs4_cb_conn {
141
142 struct sockaddr_storage cb_addr;
143 struct sockaddr_storage cb_saddr;
144 size_t cb_addrlen;
145 u32 cb_prog;
146
147 u32 cb_ident;
148 struct svc_xprt *cb_xprt;
149};
150
151static inline struct nfs4_delegation *delegstateid(struct nfs4_stid *s)
152{
153 return container_of(s, struct nfs4_delegation, dl_stid);
154}
155
156
157#define NFSD_MAX_SLOTS_PER_SESSION 160
158
159#define NFSD_MAX_OPS_PER_COMPOUND 16
160
161#define NFSD_SLOT_CACHE_SIZE 2048
162
163#define NFSD_CACHE_SIZE_SLOTS_PER_SESSION 32
164#define NFSD_MAX_MEM_PER_SESSION \
165 (NFSD_CACHE_SIZE_SLOTS_PER_SESSION * NFSD_SLOT_CACHE_SIZE)
166
167struct nfsd4_slot {
168 u32 sl_seqid;
169 __be32 sl_status;
170 u32 sl_datalen;
171 u16 sl_opcnt;
172#define NFSD4_SLOT_INUSE (1 << 0)
173#define NFSD4_SLOT_CACHETHIS (1 << 1)
174#define NFSD4_SLOT_INITIALIZED (1 << 2)
175 u8 sl_flags;
176 char sl_data[];
177};
178
179struct nfsd4_channel_attrs {
180 u32 headerpadsz;
181 u32 maxreq_sz;
182 u32 maxresp_sz;
183 u32 maxresp_cached;
184 u32 maxops;
185 u32 maxreqs;
186 u32 nr_rdma_attrs;
187 u32 rdma_attrs;
188};
189
190struct nfsd4_cb_sec {
191 u32 flavor;
192 kuid_t uid;
193 kgid_t gid;
194};
195
196struct nfsd4_create_session {
197 clientid_t clientid;
198 struct nfs4_sessionid sessionid;
199 u32 seqid;
200 u32 flags;
201 struct nfsd4_channel_attrs fore_channel;
202 struct nfsd4_channel_attrs back_channel;
203 u32 callback_prog;
204 struct nfsd4_cb_sec cb_sec;
205};
206
207struct nfsd4_backchannel_ctl {
208 u32 bc_cb_program;
209 struct nfsd4_cb_sec bc_cb_sec;
210};
211
212struct nfsd4_bind_conn_to_session {
213 struct nfs4_sessionid sessionid;
214 u32 dir;
215};
216
217
218struct nfsd4_clid_slot {
219 u32 sl_seqid;
220 __be32 sl_status;
221 struct nfsd4_create_session sl_cr_ses;
222};
223
224struct nfsd4_conn {
225 struct list_head cn_persession;
226 struct svc_xprt *cn_xprt;
227 struct svc_xpt_user cn_xpt_user;
228 struct nfsd4_session *cn_session;
229
230 unsigned char cn_flags;
231};
232
233
234
235
236
237
238struct nfsd4_session {
239 atomic_t se_ref;
240 struct list_head se_hash;
241 struct list_head se_perclnt;
242
243#define NFS4_SESSION_DEAD 0x010
244 u32 se_flags;
245 struct nfs4_client *se_client;
246 struct nfs4_sessionid se_sessionid;
247 struct nfsd4_channel_attrs se_fchannel;
248 struct nfsd4_channel_attrs se_bchannel;
249 struct nfsd4_cb_sec se_cb_sec;
250 struct list_head se_conns;
251 u32 se_cb_prog;
252 u32 se_cb_seq_nr;
253 struct nfsd4_slot *se_slots[];
254};
255
256
257struct nfsd4_sessionid {
258 clientid_t clientid;
259 u32 sequence;
260 u32 reserved;
261};
262
263#define HEXDIR_LEN 33
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292struct nfs4_client {
293 struct list_head cl_idhash;
294 struct rb_node cl_namenode;
295 struct list_head *cl_ownerstr_hashtbl;
296 struct list_head cl_openowners;
297 struct idr cl_stateids;
298 struct list_head cl_delegations;
299 struct list_head cl_revoked;
300 struct list_head cl_lru;
301#ifdef CONFIG_NFSD_PNFS
302 struct list_head cl_lo_states;
303#endif
304 struct xdr_netobj cl_name;
305 nfs4_verifier cl_verifier;
306 time_t cl_time;
307 struct sockaddr_storage cl_addr;
308 bool cl_mach_cred;
309 struct svc_cred cl_cred;
310 clientid_t cl_clientid;
311 nfs4_verifier cl_confirm;
312 u32 cl_minorversion;
313
314
315 struct nfs4_cb_conn cl_cb_conn;
316#define NFSD4_CLIENT_CB_UPDATE (0)
317#define NFSD4_CLIENT_CB_KILL (1)
318#define NFSD4_CLIENT_STABLE (2)
319#define NFSD4_CLIENT_RECLAIM_COMPLETE (3)
320#define NFSD4_CLIENT_CONFIRMED (4)
321#define NFSD4_CLIENT_UPCALL_LOCK (5)
322#define NFSD4_CLIENT_CB_FLAG_MASK (1 << NFSD4_CLIENT_CB_UPDATE | \
323 1 << NFSD4_CLIENT_CB_KILL)
324 unsigned long cl_flags;
325 struct rpc_cred *cl_cb_cred;
326 struct rpc_clnt *cl_cb_client;
327 u32 cl_cb_ident;
328#define NFSD4_CB_UP 0
329#define NFSD4_CB_UNKNOWN 1
330#define NFSD4_CB_DOWN 2
331#define NFSD4_CB_FAULT 3
332 int cl_cb_state;
333 struct nfsd4_callback cl_cb_null;
334 struct nfsd4_session *cl_cb_session;
335 struct list_head cl_callbacks;
336
337
338 spinlock_t cl_lock;
339
340
341 struct list_head cl_sessions;
342 struct nfsd4_clid_slot cl_cs_slot;
343 u32 cl_exchange_flags;
344
345 atomic_t cl_refcount;
346
347
348
349 unsigned long cl_cb_slot_busy;
350 struct rpc_wait_queue cl_cb_waitq;
351
352 struct net *net;
353};
354
355
356
357
358
359
360struct nfs4_client_reclaim {
361 struct list_head cr_strhash;
362 struct nfs4_client *cr_clp;
363 char cr_recdir[HEXDIR_LEN];
364};
365
366static inline void
367update_stateid(stateid_t *stateid)
368{
369 stateid->si_generation++;
370
371 if (stateid->si_generation == 0)
372 stateid->si_generation = 1;
373}
374
375
376
377
378
379
380
381
382#define NFSD4_REPLAY_ISIZE 112
383
384
385
386
387
388struct nfs4_replay {
389 __be32 rp_status;
390 unsigned int rp_buflen;
391 char *rp_buf;
392 struct knfsd_fh rp_openfh;
393 struct mutex rp_mutex;
394 char rp_ibuf[NFSD4_REPLAY_ISIZE];
395};
396
397struct nfs4_stateowner;
398
399struct nfs4_stateowner_operations {
400 void (*so_unhash)(struct nfs4_stateowner *);
401 void (*so_free)(struct nfs4_stateowner *);
402};
403
404
405
406
407
408
409
410struct nfs4_stateowner {
411 struct list_head so_strhash;
412 struct list_head so_stateids;
413 struct nfs4_client *so_client;
414 const struct nfs4_stateowner_operations *so_ops;
415
416
417 atomic_t so_count;
418 u32 so_seqid;
419 struct xdr_netobj so_owner;
420 struct nfs4_replay so_replay;
421 bool so_is_open_owner;
422};
423
424
425
426
427
428
429
430struct nfs4_openowner {
431 struct nfs4_stateowner oo_owner;
432 struct list_head oo_perclient;
433
434
435
436
437
438
439
440 struct list_head oo_close_lru;
441 struct nfs4_ol_stateid *oo_last_closed_stid;
442 time_t oo_time;
443#define NFS4_OO_CONFIRMED 1
444 unsigned char oo_flags;
445};
446
447
448
449
450
451
452
453struct nfs4_lockowner {
454 struct nfs4_stateowner lo_owner;
455};
456
457static inline struct nfs4_openowner * openowner(struct nfs4_stateowner *so)
458{
459 return container_of(so, struct nfs4_openowner, oo_owner);
460}
461
462static inline struct nfs4_lockowner * lockowner(struct nfs4_stateowner *so)
463{
464 return container_of(so, struct nfs4_lockowner, lo_owner);
465}
466
467
468
469
470
471
472
473
474
475
476
477
478
479struct nfs4_file {
480 atomic_t fi_ref;
481 spinlock_t fi_lock;
482 struct hlist_node fi_hash;
483 struct list_head fi_stateids;
484 union {
485 struct list_head fi_delegations;
486 struct rcu_head fi_rcu;
487 };
488
489 struct file * fi_fds[3];
490
491
492
493
494
495
496
497 atomic_t fi_access[2];
498 u32 fi_share_deny;
499 struct file *fi_deleg_file;
500 int fi_delegees;
501 struct knfsd_fh fi_fhandle;
502 bool fi_had_conflict;
503#ifdef CONFIG_NFSD_PNFS
504 struct list_head fi_lo_states;
505 atomic_t fi_lo_recalls;
506#endif
507};
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523struct nfs4_ol_stateid {
524 struct nfs4_stid st_stid;
525 struct list_head st_perfile;
526 struct list_head st_perstateowner;
527 struct list_head st_locks;
528 struct nfs4_stateowner * st_stateowner;
529 unsigned char st_access_bmap;
530 unsigned char st_deny_bmap;
531 struct nfs4_ol_stateid * st_openstp;
532};
533
534static inline struct nfs4_ol_stateid *openlockstateid(struct nfs4_stid *s)
535{
536 return container_of(s, struct nfs4_ol_stateid, st_stid);
537}
538
539struct nfs4_layout_stateid {
540 struct nfs4_stid ls_stid;
541 struct list_head ls_perclnt;
542 struct list_head ls_perfile;
543 spinlock_t ls_lock;
544 struct list_head ls_layouts;
545 u32 ls_layout_type;
546 struct file *ls_file;
547 struct nfsd4_callback ls_recall;
548 stateid_t ls_recall_sid;
549 bool ls_recalled;
550};
551
552static inline struct nfs4_layout_stateid *layoutstateid(struct nfs4_stid *s)
553{
554 return container_of(s, struct nfs4_layout_stateid, ls_stid);
555}
556
557
558#define RD_STATE 0x00000010
559#define WR_STATE 0x00000020
560
561enum nfsd4_cb_op {
562 NFSPROC4_CLNT_CB_NULL = 0,
563 NFSPROC4_CLNT_CB_RECALL,
564 NFSPROC4_CLNT_CB_LAYOUT,
565 NFSPROC4_CLNT_CB_SEQUENCE,
566};
567
568
569struct nfsd4_compound_state;
570struct nfsd_net;
571
572extern __be32 nfs4_preprocess_stateid_op(struct net *net,
573 struct nfsd4_compound_state *cstate,
574 stateid_t *stateid, int flags, struct file **filp);
575__be32 nfsd4_lookup_stateid(struct nfsd4_compound_state *cstate,
576 stateid_t *stateid, unsigned char typemask,
577 struct nfs4_stid **s, struct nfsd_net *nn);
578struct nfs4_stid *nfs4_alloc_stid(struct nfs4_client *cl,
579 struct kmem_cache *slab);
580void nfs4_unhash_stid(struct nfs4_stid *s);
581void nfs4_put_stid(struct nfs4_stid *s);
582void nfs4_remove_reclaim_record(struct nfs4_client_reclaim *, struct nfsd_net *);
583extern void nfs4_release_reclaim(struct nfsd_net *);
584extern struct nfs4_client_reclaim *nfsd4_find_reclaim_client(const char *recdir,
585 struct nfsd_net *nn);
586extern __be32 nfs4_check_open_reclaim(clientid_t *clid,
587 struct nfsd4_compound_state *cstate, struct nfsd_net *nn);
588extern int set_callback_cred(void);
589extern void nfsd4_probe_callback(struct nfs4_client *clp);
590extern void nfsd4_probe_callback_sync(struct nfs4_client *clp);
591extern void nfsd4_change_callback(struct nfs4_client *clp, struct nfs4_cb_conn *);
592extern void nfsd4_init_cb(struct nfsd4_callback *cb, struct nfs4_client *clp,
593 struct nfsd4_callback_ops *ops, enum nfsd4_cb_op op);
594extern void nfsd4_run_cb(struct nfsd4_callback *cb);
595extern int nfsd4_create_callback_queue(void);
596extern void nfsd4_destroy_callback_queue(void);
597extern void nfsd4_shutdown_callback(struct nfs4_client *);
598extern void nfsd4_prepare_cb_recall(struct nfs4_delegation *dp);
599extern struct nfs4_client_reclaim *nfs4_client_to_reclaim(const char *name,
600 struct nfsd_net *nn);
601extern bool nfs4_has_reclaimed_state(const char *name, struct nfsd_net *nn);
602
603struct nfs4_file *find_file(struct knfsd_fh *fh);
604void put_nfs4_file(struct nfs4_file *fi);
605static inline void get_nfs4_file(struct nfs4_file *fi)
606{
607 atomic_inc(&fi->fi_ref);
608}
609struct file *find_any_file(struct nfs4_file *f);
610
611
612void nfsd4_end_grace(struct nfsd_net *nn);
613
614
615extern int nfsd4_client_tracking_init(struct net *net);
616extern void nfsd4_client_tracking_exit(struct net *net);
617extern void nfsd4_client_record_create(struct nfs4_client *clp);
618extern void nfsd4_client_record_remove(struct nfs4_client *clp);
619extern int nfsd4_client_record_check(struct nfs4_client *clp);
620extern void nfsd4_record_grace_done(struct nfsd_net *nn);
621
622
623#ifdef CONFIG_NFSD_FAULT_INJECTION
624int nfsd_fault_inject_init(void);
625void nfsd_fault_inject_cleanup(void);
626
627u64 nfsd_inject_print_clients(void);
628u64 nfsd_inject_forget_client(struct sockaddr_storage *, size_t);
629u64 nfsd_inject_forget_clients(u64);
630
631u64 nfsd_inject_print_locks(void);
632u64 nfsd_inject_forget_client_locks(struct sockaddr_storage *, size_t);
633u64 nfsd_inject_forget_locks(u64);
634
635u64 nfsd_inject_print_openowners(void);
636u64 nfsd_inject_forget_client_openowners(struct sockaddr_storage *, size_t);
637u64 nfsd_inject_forget_openowners(u64);
638
639u64 nfsd_inject_print_delegations(void);
640u64 nfsd_inject_forget_client_delegations(struct sockaddr_storage *, size_t);
641u64 nfsd_inject_forget_delegations(u64);
642u64 nfsd_inject_recall_client_delegations(struct sockaddr_storage *, size_t);
643u64 nfsd_inject_recall_delegations(u64);
644#else
645static inline int nfsd_fault_inject_init(void) { return 0; }
646static inline void nfsd_fault_inject_cleanup(void) {}
647#endif
648
649#endif
650