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