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 u32 cb_minorversion;
67 struct rpc_message cb_msg;
68 const struct nfsd4_callback_ops *cb_ops;
69 struct work_struct cb_work;
70 int cb_seq_status;
71 int cb_status;
72 bool cb_need_restart;
73};
74
75struct nfsd4_callback_ops {
76 void (*prepare)(struct nfsd4_callback *);
77 int (*done)(struct nfsd4_callback *, struct rpc_task *);
78 void (*release)(struct nfsd4_callback *);
79};
80
81
82
83
84
85
86struct nfs4_stid {
87 atomic_t sc_count;
88#define NFS4_OPEN_STID 1
89#define NFS4_LOCK_STID 2
90#define NFS4_DELEG_STID 4
91
92#define NFS4_CLOSED_STID 8
93
94#define NFS4_REVOKED_DELEG_STID 16
95#define NFS4_CLOSED_DELEG_STID 32
96#define NFS4_LAYOUT_STID 64
97 unsigned char sc_type;
98 stateid_t sc_stateid;
99 spinlock_t sc_lock;
100 struct nfs4_client *sc_client;
101 struct nfs4_file *sc_file;
102 void (*sc_free)(struct nfs4_stid *);
103};
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126struct nfs4_delegation {
127 struct nfs4_stid dl_stid;
128 struct list_head dl_perfile;
129 struct list_head dl_perclnt;
130 struct list_head dl_recall_lru;
131 struct nfs4_clnt_odstate *dl_clnt_odstate;
132 u32 dl_type;
133 time_t dl_time;
134
135 int dl_retries;
136 struct nfsd4_callback dl_recall;
137};
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
336
337 spinlock_t cl_lock;
338
339
340 struct list_head cl_sessions;
341 struct nfsd4_clid_slot cl_cs_slot;
342 u32 cl_exchange_flags;
343
344 atomic_t cl_refcount;
345
346
347
348 unsigned long cl_cb_slot_busy;
349 struct rpc_wait_queue cl_cb_waitq;
350
351 struct net *net;
352};
353
354
355
356
357
358
359struct nfs4_client_reclaim {
360 struct list_head cr_strhash;
361 struct nfs4_client *cr_clp;
362 char cr_recdir[HEXDIR_LEN];
363};
364
365
366
367
368
369
370
371
372#define NFSD4_REPLAY_ISIZE 112
373
374
375
376
377
378struct nfs4_replay {
379 __be32 rp_status;
380 unsigned int rp_buflen;
381 char *rp_buf;
382 struct knfsd_fh rp_openfh;
383 struct mutex rp_mutex;
384 char rp_ibuf[NFSD4_REPLAY_ISIZE];
385};
386
387struct nfs4_stateowner;
388
389struct nfs4_stateowner_operations {
390 void (*so_unhash)(struct nfs4_stateowner *);
391 void (*so_free)(struct nfs4_stateowner *);
392};
393
394
395
396
397
398
399
400struct nfs4_stateowner {
401 struct list_head so_strhash;
402 struct list_head so_stateids;
403 struct nfs4_client *so_client;
404 const struct nfs4_stateowner_operations *so_ops;
405
406
407 atomic_t so_count;
408 u32 so_seqid;
409 struct xdr_netobj so_owner;
410 struct nfs4_replay so_replay;
411 bool so_is_open_owner;
412};
413
414
415
416
417
418
419
420struct nfs4_openowner {
421 struct nfs4_stateowner oo_owner;
422 struct list_head oo_perclient;
423
424
425
426
427
428
429
430 struct list_head oo_close_lru;
431 struct nfs4_ol_stateid *oo_last_closed_stid;
432 time_t oo_time;
433#define NFS4_OO_CONFIRMED 1
434 unsigned char oo_flags;
435};
436
437
438
439
440
441
442struct nfs4_lockowner {
443 struct nfs4_stateowner lo_owner;
444 struct list_head lo_blocked;
445};
446
447static inline struct nfs4_openowner * openowner(struct nfs4_stateowner *so)
448{
449 return container_of(so, struct nfs4_openowner, oo_owner);
450}
451
452static inline struct nfs4_lockowner * lockowner(struct nfs4_stateowner *so)
453{
454 return container_of(so, struct nfs4_lockowner, lo_owner);
455}
456
457
458
459
460
461struct nfs4_clnt_odstate {
462 struct nfs4_client *co_client;
463 struct nfs4_file *co_file;
464 struct list_head co_perfile;
465 atomic_t co_odcount;
466};
467
468
469
470
471
472
473
474
475
476
477
478
479
480struct nfs4_file {
481 atomic_t fi_ref;
482 spinlock_t fi_lock;
483 struct hlist_node fi_hash;
484 struct list_head fi_stateids;
485 union {
486 struct list_head fi_delegations;
487 struct rcu_head fi_rcu;
488 };
489 struct list_head fi_clnt_odstate;
490
491 struct file * fi_fds[3];
492
493
494
495
496
497
498
499 atomic_t fi_access[2];
500 u32 fi_share_deny;
501 struct file *fi_deleg_file;
502 int fi_delegees;
503 struct knfsd_fh fi_fhandle;
504 bool fi_had_conflict;
505#ifdef CONFIG_NFSD_PNFS
506 struct list_head fi_lo_states;
507 atomic_t fi_lo_recalls;
508#endif
509};
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525struct nfs4_ol_stateid {
526 struct nfs4_stid st_stid;
527 struct list_head st_perfile;
528 struct list_head st_perstateowner;
529 struct list_head st_locks;
530 struct nfs4_stateowner *st_stateowner;
531 struct nfs4_clnt_odstate *st_clnt_odstate;
532 unsigned char st_access_bmap;
533 unsigned char st_deny_bmap;
534 struct nfs4_ol_stateid *st_openstp;
535 struct mutex st_mutex;
536};
537
538static inline struct nfs4_ol_stateid *openlockstateid(struct nfs4_stid *s)
539{
540 return container_of(s, struct nfs4_ol_stateid, st_stid);
541}
542
543struct nfs4_layout_stateid {
544 struct nfs4_stid ls_stid;
545 struct list_head ls_perclnt;
546 struct list_head ls_perfile;
547 spinlock_t ls_lock;
548 struct list_head ls_layouts;
549 u32 ls_layout_type;
550 struct file *ls_file;
551 struct nfsd4_callback ls_recall;
552 stateid_t ls_recall_sid;
553 bool ls_recalled;
554 struct mutex ls_mutex;
555};
556
557static inline struct nfs4_layout_stateid *layoutstateid(struct nfs4_stid *s)
558{
559 return container_of(s, struct nfs4_layout_stateid, ls_stid);
560}
561
562
563#define RD_STATE 0x00000010
564#define WR_STATE 0x00000020
565
566enum nfsd4_cb_op {
567 NFSPROC4_CLNT_CB_NULL = 0,
568 NFSPROC4_CLNT_CB_RECALL,
569 NFSPROC4_CLNT_CB_LAYOUT,
570 NFSPROC4_CLNT_CB_SEQUENCE,
571 NFSPROC4_CLNT_CB_NOTIFY_LOCK,
572};
573
574
575
576
577
578
579
580struct nfsd4_blocked_lock {
581 struct list_head nbl_list;
582 struct list_head nbl_lru;
583 unsigned long nbl_time;
584 struct file_lock nbl_lock;
585 struct knfsd_fh nbl_fh;
586 struct nfsd4_callback nbl_cb;
587};
588
589struct nfsd4_compound_state;
590struct nfsd_net;
591
592extern __be32 nfs4_preprocess_stateid_op(struct svc_rqst *rqstp,
593 struct nfsd4_compound_state *cstate, struct svc_fh *fhp,
594 stateid_t *stateid, int flags, struct file **filp, bool *tmp_file);
595__be32 nfsd4_lookup_stateid(struct nfsd4_compound_state *cstate,
596 stateid_t *stateid, unsigned char typemask,
597 struct nfs4_stid **s, struct nfsd_net *nn);
598struct nfs4_stid *nfs4_alloc_stid(struct nfs4_client *cl,
599 struct kmem_cache *slab);
600void nfs4_unhash_stid(struct nfs4_stid *s);
601void nfs4_put_stid(struct nfs4_stid *s);
602void nfs4_inc_and_copy_stateid(stateid_t *dst, struct nfs4_stid *stid);
603void nfs4_remove_reclaim_record(struct nfs4_client_reclaim *, struct nfsd_net *);
604extern void nfs4_release_reclaim(struct nfsd_net *);
605extern struct nfs4_client_reclaim *nfsd4_find_reclaim_client(const char *recdir,
606 struct nfsd_net *nn);
607extern __be32 nfs4_check_open_reclaim(clientid_t *clid,
608 struct nfsd4_compound_state *cstate, struct nfsd_net *nn);
609extern int set_callback_cred(void);
610extern void nfsd4_probe_callback(struct nfs4_client *clp);
611extern void nfsd4_probe_callback_sync(struct nfs4_client *clp);
612extern void nfsd4_change_callback(struct nfs4_client *clp, struct nfs4_cb_conn *);
613extern void nfsd4_init_cb(struct nfsd4_callback *cb, struct nfs4_client *clp,
614 const struct nfsd4_callback_ops *ops, enum nfsd4_cb_op op);
615extern void nfsd4_run_cb(struct nfsd4_callback *cb);
616extern int nfsd4_create_callback_queue(void);
617extern void nfsd4_destroy_callback_queue(void);
618extern void nfsd4_shutdown_callback(struct nfs4_client *);
619extern void nfsd4_prepare_cb_recall(struct nfs4_delegation *dp);
620extern struct nfs4_client_reclaim *nfs4_client_to_reclaim(const char *name,
621 struct nfsd_net *nn);
622extern bool nfs4_has_reclaimed_state(const char *name, struct nfsd_net *nn);
623
624struct nfs4_file *find_file(struct knfsd_fh *fh);
625void put_nfs4_file(struct nfs4_file *fi);
626static inline void get_nfs4_file(struct nfs4_file *fi)
627{
628 atomic_inc(&fi->fi_ref);
629}
630struct file *find_any_file(struct nfs4_file *f);
631
632
633void nfsd4_end_grace(struct nfsd_net *nn);
634
635
636extern int nfsd4_client_tracking_init(struct net *net);
637extern void nfsd4_client_tracking_exit(struct net *net);
638extern void nfsd4_client_record_create(struct nfs4_client *clp);
639extern void nfsd4_client_record_remove(struct nfs4_client *clp);
640extern int nfsd4_client_record_check(struct nfs4_client *clp);
641extern void nfsd4_record_grace_done(struct nfsd_net *nn);
642
643
644#ifdef CONFIG_NFSD_FAULT_INJECTION
645int nfsd_fault_inject_init(void);
646void nfsd_fault_inject_cleanup(void);
647
648u64 nfsd_inject_print_clients(void);
649u64 nfsd_inject_forget_client(struct sockaddr_storage *, size_t);
650u64 nfsd_inject_forget_clients(u64);
651
652u64 nfsd_inject_print_locks(void);
653u64 nfsd_inject_forget_client_locks(struct sockaddr_storage *, size_t);
654u64 nfsd_inject_forget_locks(u64);
655
656u64 nfsd_inject_print_openowners(void);
657u64 nfsd_inject_forget_client_openowners(struct sockaddr_storage *, size_t);
658u64 nfsd_inject_forget_openowners(u64);
659
660u64 nfsd_inject_print_delegations(void);
661u64 nfsd_inject_forget_client_delegations(struct sockaddr_storage *, size_t);
662u64 nfsd_inject_forget_delegations(u64);
663u64 nfsd_inject_recall_client_delegations(struct sockaddr_storage *, size_t);
664u64 nfsd_inject_recall_delegations(u64);
665#else
666static inline int nfsd_fault_inject_init(void) { return 0; }
667static inline void nfsd_fault_inject_cleanup(void) {}
668#endif
669
670#endif
671