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