diff options
Diffstat (limited to 'fs/nfs/nfs4session.h')
-rw-r--r-- | fs/nfs/nfs4session.h | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/fs/nfs/nfs4session.h b/fs/nfs/nfs4session.h new file mode 100644 index 000000000000..6f3cb39386d4 --- /dev/null +++ b/fs/nfs/nfs4session.h | |||
@@ -0,0 +1,142 @@ | |||
1 | /* | ||
2 | * fs/nfs/nfs4session.h | ||
3 | * | ||
4 | * Copyright (c) 2012 Trond Myklebust <Trond.Myklebust@netapp.com> | ||
5 | * | ||
6 | */ | ||
7 | #ifndef __LINUX_FS_NFS_NFS4SESSION_H | ||
8 | #define __LINUX_FS_NFS_NFS4SESSION_H | ||
9 | |||
10 | /* maximum number of slots to use */ | ||
11 | #define NFS4_DEF_SLOT_TABLE_SIZE (16U) | ||
12 | #define NFS4_MAX_SLOT_TABLE (1024U) | ||
13 | #define NFS4_NO_SLOT ((u32)-1) | ||
14 | |||
15 | #if IS_ENABLED(CONFIG_NFS_V4) | ||
16 | |||
17 | /* Sessions slot seqid */ | ||
18 | struct nfs4_slot { | ||
19 | struct nfs4_slot_table *table; | ||
20 | struct nfs4_slot *next; | ||
21 | unsigned long generation; | ||
22 | u32 slot_nr; | ||
23 | u32 seq_nr; | ||
24 | unsigned int interrupted : 1; | ||
25 | }; | ||
26 | |||
27 | /* Sessions */ | ||
28 | #define SLOT_TABLE_SZ DIV_ROUND_UP(NFS4_MAX_SLOT_TABLE, 8*sizeof(long)) | ||
29 | struct nfs4_slot_table { | ||
30 | struct nfs4_session *session; /* Parent session */ | ||
31 | struct nfs4_slot *slots; /* seqid per slot */ | ||
32 | unsigned long used_slots[SLOT_TABLE_SZ]; /* used/unused bitmap */ | ||
33 | spinlock_t slot_tbl_lock; | ||
34 | struct rpc_wait_queue slot_tbl_waitq; /* allocators may wait here */ | ||
35 | u32 max_slots; /* # slots in table */ | ||
36 | u32 max_slotid; /* Max allowed slotid value */ | ||
37 | u32 highest_used_slotid; /* sent to server on each SEQ. | ||
38 | * op for dynamic resizing */ | ||
39 | u32 target_highest_slotid; /* Server max_slot target */ | ||
40 | u32 server_highest_slotid; /* Server highest slotid */ | ||
41 | s32 d_target_highest_slotid; /* Derivative */ | ||
42 | s32 d2_target_highest_slotid; /* 2nd derivative */ | ||
43 | unsigned long generation; /* Generation counter for | ||
44 | target_highest_slotid */ | ||
45 | struct completion complete; | ||
46 | }; | ||
47 | |||
48 | /* | ||
49 | * Session related parameters | ||
50 | */ | ||
51 | struct nfs4_session { | ||
52 | struct nfs4_sessionid sess_id; | ||
53 | u32 flags; | ||
54 | unsigned long session_state; | ||
55 | u32 hash_alg; | ||
56 | u32 ssv_len; | ||
57 | |||
58 | /* The fore and back channel */ | ||
59 | struct nfs4_channel_attrs fc_attrs; | ||
60 | struct nfs4_slot_table fc_slot_table; | ||
61 | struct nfs4_channel_attrs bc_attrs; | ||
62 | struct nfs4_slot_table bc_slot_table; | ||
63 | struct nfs_client *clp; | ||
64 | /* Create session arguments */ | ||
65 | unsigned int fc_target_max_rqst_sz; | ||
66 | unsigned int fc_target_max_resp_sz; | ||
67 | }; | ||
68 | |||
69 | enum nfs4_session_state { | ||
70 | NFS4_SESSION_INITING, | ||
71 | NFS4_SESSION_DRAINING, | ||
72 | }; | ||
73 | |||
74 | #if defined(CONFIG_NFS_V4_1) | ||
75 | extern struct nfs4_slot *nfs4_alloc_slot(struct nfs4_slot_table *tbl); | ||
76 | extern void nfs4_free_slot(struct nfs4_slot_table *tbl, struct nfs4_slot *slot); | ||
77 | |||
78 | extern void nfs41_set_target_slotid(struct nfs4_slot_table *tbl, | ||
79 | u32 target_highest_slotid); | ||
80 | extern void nfs41_update_target_slotid(struct nfs4_slot_table *tbl, | ||
81 | struct nfs4_slot *slot, | ||
82 | struct nfs4_sequence_res *res); | ||
83 | |||
84 | extern int nfs4_setup_session_slot_tables(struct nfs4_session *ses); | ||
85 | |||
86 | extern struct nfs4_session *nfs4_alloc_session(struct nfs_client *clp); | ||
87 | extern void nfs4_destroy_session(struct nfs4_session *session); | ||
88 | extern int nfs4_init_session(struct nfs_server *server); | ||
89 | extern int nfs4_init_ds_session(struct nfs_client *, unsigned long); | ||
90 | |||
91 | extern void nfs4_session_drain_complete(struct nfs4_session *session, | ||
92 | struct nfs4_slot_table *tbl); | ||
93 | |||
94 | static inline bool nfs4_session_draining(struct nfs4_session *session) | ||
95 | { | ||
96 | return !!test_bit(NFS4_SESSION_DRAINING, &session->session_state); | ||
97 | } | ||
98 | |||
99 | bool nfs41_wake_and_assign_slot(struct nfs4_slot_table *tbl, | ||
100 | struct nfs4_slot *slot); | ||
101 | void nfs41_wake_slot_table(struct nfs4_slot_table *tbl); | ||
102 | |||
103 | /* | ||
104 | * Determine if sessions are in use. | ||
105 | */ | ||
106 | static inline int nfs4_has_session(const struct nfs_client *clp) | ||
107 | { | ||
108 | if (clp->cl_session) | ||
109 | return 1; | ||
110 | return 0; | ||
111 | } | ||
112 | |||
113 | static inline int nfs4_has_persistent_session(const struct nfs_client *clp) | ||
114 | { | ||
115 | if (nfs4_has_session(clp)) | ||
116 | return (clp->cl_session->flags & SESSION4_PERSIST); | ||
117 | return 0; | ||
118 | } | ||
119 | |||
120 | #else /* defined(CONFIG_NFS_V4_1) */ | ||
121 | |||
122 | static inline int nfs4_init_session(struct nfs_server *server) | ||
123 | { | ||
124 | return 0; | ||
125 | } | ||
126 | |||
127 | /* | ||
128 | * Determine if sessions are in use. | ||
129 | */ | ||
130 | static inline int nfs4_has_session(const struct nfs_client *clp) | ||
131 | { | ||
132 | return 0; | ||
133 | } | ||
134 | |||
135 | static inline int nfs4_has_persistent_session(const struct nfs_client *clp) | ||
136 | { | ||
137 | return 0; | ||
138 | } | ||
139 | |||
140 | #endif /* defined(CONFIG_NFS_V4_1) */ | ||
141 | #endif /* IS_ENABLED(CONFIG_NFS_V4) */ | ||
142 | #endif /* __LINUX_FS_NFS_NFS4SESSION_H */ | ||