]>
Commit | Line | Data |
---|---|---|
73e39aaa TM |
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 | ||
76e697ba TM |
10 | /* maximum number of slots to use */ |
11 | #define NFS4_DEF_SLOT_TABLE_SIZE (16U) | |
0ca3f482 | 12 | #define NFS4_MAX_SLOT_TABLE (1024U) |
76e697ba TM |
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; | |
76e697ba TM |
22 | u32 slot_nr; |
23 | u32 seq_nr; | |
ac20d163 | 24 | unsigned int interrupted : 1; |
76e697ba TM |
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 */ | |
1fa80644 TM |
41 | s32 d_target_highest_slotid; /* Derivative */ |
42 | s32 d2_target_highest_slotid; /* 2nd derivative */ | |
76e697ba TM |
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 | ||
73e39aaa TM |
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 | ||
76e697ba TM |
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 | ||
b75ad4cd TM |
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 | ||
76e697ba TM |
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 | ||
73e39aaa TM |
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 | ||
76e697ba TM |
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 | ||
73e39aaa | 140 | #endif /* defined(CONFIG_NFS_V4_1) */ |
76e697ba | 141 | #endif /* IS_ENABLED(CONFIG_NFS_V4) */ |
73e39aaa | 142 | #endif /* __LINUX_FS_NFS_NFS4SESSION_H */ |