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