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