ReactOS 0.4.15-dev-8102-g108db8f
nfs41_session.c File Reference
#include <windows.h>
#include <process.h>
#include <stdio.h>
#include "nfs41_ops.h"
#include "nfs41_callback.h"
#include "util.h"
#include "daemon_debug.h"
Include dependency graph for nfs41_session.c:

Go to the source code of this file.

Macros

#define MAX_SLOTS_DELAY   2000 /* in milliseconds */
 

Functions

static int slot_table_avail (IN const nfs41_slot_table *table)
 
static void init_slot_table (nfs41_slot_table *table)
 
static void resize_slot_table (IN nfs41_slot_table *table, IN uint32_t target_highest_slotid)
 
void nfs41_session_bump_seq (IN nfs41_session *session, IN uint32_t slotid, IN uint32_t target_highest_slotid)
 
void nfs41_session_free_slot (IN nfs41_session *session, IN uint32_t slotid)
 
void nfs41_session_get_slot (IN nfs41_session *session, OUT uint32_t *slot, OUT uint32_t *seqid, OUT uint32_t *highest)
 
int nfs41_session_recall_slot (IN nfs41_session *session, IN OUT uint32_t target_highest_slotid)
 
int nfs41_session_bad_slot (IN nfs41_session *session, IN OUT nfs41_sequence_args *args)
 
void nfs41_session_sequence (nfs41_sequence_args *args, nfs41_session *session, bool_t cachethis)
 
static unsigned int WINAPI renew_session (void *args)
 
static int session_alloc (IN nfs41_client *client, OUT nfs41_session **session_out)
 
int nfs41_session_create (IN nfs41_client *client, IN nfs41_session **session_out)
 
int nfs41_session_renew (IN nfs41_session *session)
 
int nfs41_session_set_lease (IN nfs41_session *session, IN uint32_t lease_time)
 
void nfs41_session_free (IN nfs41_session *session)
 

Macro Definition Documentation

◆ MAX_SLOTS_DELAY

#define MAX_SLOTS_DELAY   2000 /* in milliseconds */

Definition at line 34 of file nfs41_session.c.

Function Documentation

◆ init_slot_table()

static void init_slot_table ( nfs41_slot_table table)
static

Definition at line 45 of file nfs41_session.c.

46{
47 uint32_t i;
49 table->max_slots = NFS41_MAX_NUM_SLOTS;
50 for (i = 0; i < NFS41_MAX_NUM_SLOTS; i++) {
51 table->seq_nums[i] = 1;
52 table->used_slots[i] = 0;
53 }
54 table->highest_used = table->num_used = 0;
55 table->target_delay = 0;
56
57 /* wake any threads waiting on a slot */
61}
UINT32 uint32_t
Definition: types.h:75
VOID WINAPI WakeAllConditionVariable(PCONDITION_VARIABLE ConditionVariable)
Definition: sync.c:137
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define NFS41_MAX_NUM_SLOTS
Definition: nfs41.h:218
static int slot_table_avail(IN const nfs41_slot_table *table)
Definition: nfs41_session.c:38
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)

Referenced by nfs41_session_renew(), and session_alloc().

◆ nfs41_session_bad_slot()

int nfs41_session_bad_slot ( IN nfs41_session session,
IN OUT nfs41_sequence_args args 
)

Definition at line 185 of file nfs41_session.c.

188{
189 nfs41_slot_table *table = &session->table;
191
192 if (args->sa_slotid == 0) {
193 eprintf("server bug detected: NFS4ERR_BADSLOT for slotid=0\n");
194 goto out;
195 }
196
197 /* avoid using any slots >= bad_slotid */
199 if (table->max_slots > args->sa_slotid) {
200 resize_slot_table(table, args->sa_slotid);
201 table->target_delay = GetTickCount64() + MAX_SLOTS_DELAY;
202 }
204
205 /* get a new slot */
208 &args->sa_sequenceid, &args->sa_highest_slotid);
209 status = NFS4_OK;
210out:
211 return status;
212}
ULONGLONG WINAPI GetTickCount64(VOID)
Definition: GetTickCount64.c:9
void eprintf(LPCSTR format,...)
Definition: daemon_debug.c:86
@ NFS4ERR_BADSLOT
Definition: nfs41_const.h:162
@ NFS4_OK
Definition: nfs41_const.h:87
void nfs41_session_get_slot(IN nfs41_session *session, OUT uint32_t *slot, OUT uint32_t *seqid, OUT uint32_t *highest)
void nfs41_session_free_slot(IN nfs41_session *session, IN uint32_t slotid)
static void resize_slot_table(IN nfs41_slot_table *table, IN uint32_t target_highest_slotid)
Definition: nfs41_session.c:63
#define MAX_SLOTS_DELAY
Definition: nfs41_session.c:34
static FILE * out
Definition: regtests2xml.c:44
Definition: match.c:390
Definition: ps.c:97

◆ nfs41_session_bump_seq()

void nfs41_session_bump_seq ( IN nfs41_session session,
IN uint32_t  slotid,
IN uint32_t  target_highest_slotid 
)

Definition at line 80 of file nfs41_session.c.

84{
86
87 AcquireSRWLockShared(&session->client->session_lock);
89
90 if (slotid < NFS41_MAX_NUM_SLOTS)
91 table->seq_nums[slotid]++;
92
93 /* adjust max_slots in response to changes in target_highest_slotid,
94 * but not immediately after a CB_RECALL_SLOT or NFS4ERR_BADSLOT error */
95 if (table->target_delay <= GetTickCount64())
96 resize_slot_table(table, target_highest_slotid);
97
99 ReleaseSRWLockShared(&session->client->session_lock);
100}
VOID WINAPI ReleaseSRWLockShared(PSRWLOCK Lock)
Definition: sync.c:89
VOID WINAPI AcquireSRWLockShared(PSRWLOCK Lock)
Definition: sync.c:61

Referenced by compound_encode_send_decode().

◆ nfs41_session_create()

int nfs41_session_create ( IN nfs41_client client,
IN nfs41_session **  session_out 
)

Definition at line 278 of file nfs41_session.c.

281{
283 int status;
284
286 if (status) {
287 eprintf("session_alloc() failed with %d\n", status);
288 goto out;
289 }
290
291 AcquireSRWLockShared(&client->exid_lock);
292 if (client->rpc->needcb)
295 ReleaseSRWLockShared(&client->exid_lock);
296
298 if (status) {
299 eprintf("nfs41_create_session failed %d\n", status);
301 goto out_err;
302 }
303
304 AcquireSRWLockExclusive(&session->client->session_lock);
305 client->session = session;
306 session->isValidState = TRUE;
307 ReleaseSRWLockExclusive(&session->client->session_lock);
308 *session_out = session;
309out:
310 return status;
311
312out_err:
314 goto out;
315}
#define TRUE
Definition: types.h:120
VOID WINAPI AcquireSRWLockExclusive(PSRWLOCK Lock)
Definition: sync.c:54
VOID WINAPI ReleaseSRWLockExclusive(PSRWLOCK Lock)
Definition: sync.c:82
#define CREATE_SESSION4_FLAG_PERSIST
Definition: nfs41_const.h:307
#define CREATE_SESSION4_FLAG_CONN_BACK_CHAN
Definition: nfs41_const.h:308
int nfs41_create_session(nfs41_client *clnt, nfs41_session *session, bool_t try_recovery)
Definition: nfs41_ops.c:101
static int session_alloc(IN nfs41_client *client, OUT nfs41_session **session_out)
void nfs41_session_free(IN nfs41_session *session)
static FILE * client
Definition: client.c:41
#define ERROR_BAD_NET_RESP
Definition: winerror.h:150

Referenced by root_client_create().

◆ nfs41_session_free()

void nfs41_session_free ( IN nfs41_session session)

Definition at line 363 of file nfs41_session.c.

365{
366 AcquireSRWLockExclusive(&session->client->session_lock);
367 if (valid_handle(session->renew_thread)) {
368 dprintf(1, "nfs41_session_free: terminating session renewal thread\n");
369 if (!TerminateThread(session->renew_thread, NO_ERROR))
370 eprintf("failed to terminate renewal thread %p\n",
371 session->renew_thread);
372 }
373
374 if (session->isValidState) {
375 session->client->rpc->is_valid_session = FALSE;
377 }
378 DeleteCriticalSection(&session->table.lock);
379 ReleaseSRWLockExclusive(&session->client->session_lock);
380 free(session);
381}
__inline int valid_handle(HANDLE handle)
Definition: util.h:281
#define NO_ERROR
Definition: dderror.h:5
#define free
Definition: debug_ros.c:5
#define FALSE
Definition: types.h:117
BOOL WINAPI TerminateThread(IN HANDLE hThread, IN DWORD dwExitCode)
Definition: thread.c:587
int nfs41_destroy_session(IN nfs41_session *session)
Definition: nfs41_ops.c:214
#define dprintf
Definition: regdump.c:33
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)

Referenced by nfs41_client_free(), and nfs41_session_create().

◆ nfs41_session_free_slot()

void nfs41_session_free_slot ( IN nfs41_session session,
IN uint32_t  slotid 
)

Definition at line 102 of file nfs41_session.c.

105{
106 nfs41_slot_table *table = &session->table;
107
108 AcquireSRWLockShared(&session->client->session_lock);
110
111 /* flag the slot as unused */
112 if (slotid < NFS41_MAX_NUM_SLOTS && table->used_slots[slotid]) {
113 table->used_slots[slotid] = 0;
114 table->num_used--;
115 }
116 /* update highest_used if necessary */
117 if (slotid == table->highest_used) {
118 while (table->highest_used && !table->used_slots[table->highest_used])
119 table->highest_used--;
120 }
121 dprintf(3, "freeing slot#=%d used=%d highest=%d\n",
122 slotid, table->num_used, table->highest_used);
123
124 /* wake any threads waiting on a slot */
127
129 ReleaseSRWLockShared(&session->client->session_lock);
130}

Referenced by compound_encode_send_decode(), and nfs41_session_bad_slot().

◆ nfs41_session_get_slot()

void nfs41_session_get_slot ( IN nfs41_session session,
OUT uint32_t slot,
OUT uint32_t seqid,
OUT uint32_t highest 
)

Definition at line 132 of file nfs41_session.c.

137{
138 nfs41_slot_table *table = &session->table;
139 uint32_t i;
140
141 AcquireSRWLockShared(&session->client->session_lock);
143
144 /* wait for an available slot */
145 while (!slot_table_avail(table))
147
148 for (i = 0; i < table->max_slots; i++) {
149 if (table->used_slots[i])
150 continue;
151
152 table->used_slots[i] = 1;
153 table->num_used++;
154 if (i > table->highest_used)
155 table->highest_used = i;
156
157 *slot = i;
158 *seqid = table->seq_nums[i];
159 *highest = table->highest_used;
160 break;
161 }
163 ReleaseSRWLockShared(&session->client->session_lock);
164
165 dprintf(2, "session %p: using slot#=%d with seq#=%d highest=%d\n",
166 session, *slot, *seqid, *highest);
167}
BOOL WINAPI SleepConditionVariableCS(PCONDITION_VARIABLE ConditionVariable, PCRITICAL_SECTION CriticalSection, DWORD Timeout)
Definition: sync.c:105
#define INFINITE
Definition: serial.h:102
Definition: vfat.h:185

Referenced by compound_encode_send_decode(), nfs41_session_bad_slot(), and nfs41_session_sequence().

◆ nfs41_session_recall_slot()

int nfs41_session_recall_slot ( IN nfs41_session session,
IN OUT uint32_t  target_highest_slotid 
)

Definition at line 169 of file nfs41_session.c.

172{
173 nfs41_slot_table *table = &session->table;
174
175 AcquireSRWLockShared(&session->client->session_lock);
177 resize_slot_table(table, target_highest_slotid);
178 table->target_delay = GetTickCount64() + MAX_SLOTS_DELAY;
180 ReleaseSRWLockShared(&session->client->session_lock);
181
182 return NFS4_OK;
183}

Referenced by handle_cb_recall_slot().

◆ nfs41_session_renew()

int nfs41_session_renew ( IN nfs41_session session)

Definition at line 318 of file nfs41_session.c.

320{
321 int status;
322
323 AcquireSRWLockExclusive(&session->client->session_lock);
324 session->cb_session.cb_seqnum = 0;
325 init_slot_table(&session->table);
326
328 ReleaseSRWLockExclusive(&session->client->session_lock);
329 return status;
330}
static void init_slot_table(nfs41_slot_table *table)
Definition: nfs41_session.c:45

Referenced by nfs41_recover_session().

◆ nfs41_session_sequence()

◆ nfs41_session_set_lease()

int nfs41_session_set_lease ( IN nfs41_session session,
IN uint32_t  lease_time 
)

Definition at line 332 of file nfs41_session.c.

335{
336 int status = NO_ERROR;
338
339 if (valid_handle(session->renew_thread)) {
340 eprintf("nfs41_session_set_lease(): session "
341 "renewal thread already started!\n");
342 goto out;
343 }
344
345 if (lease_time == 0) {
346 eprintf("nfs41_session_set_lease(): invalid lease_time=0\n");
348 goto out;
349 }
350
351 session->lease_time = lease_time;
352 session->renew_thread = (HANDLE)_beginthreadex(NULL,
354 if (!valid_handle(session->renew_thread)) {
356 eprintf("_beginthreadex failed %d\n", status);
357 goto out;
358 }
359out:
360 return status;
361}
#define NULL
Definition: types.h:112
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
static DWORD thread_id
Definition: protocol.c:159
static unsigned int WINAPI renew_session(void *args)
_CRTIMP uintptr_t __cdecl _beginthreadex(_In_opt_ void *_Security, _In_ unsigned _StackSize, _In_ unsigned(__stdcall *_StartAddress)(void *), _In_opt_ void *_ArgList, _In_ unsigned _InitFlag, _Out_opt_ unsigned *_ThrdAddr)
PVOID HANDLE
Definition: typedefs.h:73
DWORD WINAPI GetLastError(void)
Definition: except.c:1042

Referenced by session_get_lease().

◆ renew_session()

static unsigned int WINAPI renew_session ( void args)
static

Definition at line 227 of file nfs41_session.c.

228{
229 int status = NO_ERROR;
231 /* sleep for 2/3 of lease_time */
232 const uint32_t sleep_time = (2 * session->lease_time*1000)/3;
233
234 dprintf(1, "Creating renew_session thread: %p\n", session->renew_thread);
235 while(1) {
236 dprintf(1, "Going to sleep for %dmsecs\n", sleep_time);
237 Sleep(sleep_time);
239 if (status)
240 dprintf(1, "renewal thread: nfs41_send_sequence failed %d\n", status);
241 }
242 return status;
243}
int nfs41_send_sequence(IN nfs41_session *session)
Definition: nfs41_ops.c:1599
VOID WINAPI DECLSPEC_HOTPATCH Sleep(IN DWORD dwMilliseconds)
Definition: synch.c:790

Referenced by nfs41_session_set_lease().

◆ resize_slot_table()

static void resize_slot_table ( IN nfs41_slot_table table,
IN uint32_t  target_highest_slotid 
)
static

Definition at line 63 of file nfs41_session.c.

66{
67 if (target_highest_slotid >= NFS41_MAX_NUM_SLOTS)
68 target_highest_slotid = NFS41_MAX_NUM_SLOTS - 1;
69
70 if (table->max_slots != target_highest_slotid + 1) {
71 dprintf(2, "updated max_slots %u to %u\n",
72 table->max_slots, target_highest_slotid + 1);
73 table->max_slots = target_highest_slotid + 1;
74
77 }
78}

Referenced by nfs41_session_bad_slot(), nfs41_session_bump_seq(), and nfs41_session_recall_slot().

◆ session_alloc()

static int session_alloc ( IN nfs41_client client,
OUT nfs41_session **  session_out 
)
static

Definition at line 246 of file nfs41_session.c.

249{
251 int status = NO_ERROR;
252
253 session = calloc(1, sizeof(nfs41_session));
254 if (session == NULL) {
256 goto out;
257 }
258 session->client = client;
259 session->renew_thread = INVALID_HANDLE_VALUE;
260 session->isValidState = FALSE;
261
264
265 init_slot_table(&session->table);
266
267 //initialize session lock
268 InitializeSRWLock(&client->session_lock);
269
270 /* initialize the back channel */
272
273 *session_out = session;
274out:
275 return status;
276}
void nfs41_callback_session_init(IN nfs41_session *session)
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
VOID WINAPI InitializeSRWLock(PSRWLOCK Lock)
Definition: sync.c:75
VOID WINAPI InitializeConditionVariable(PCONDITION_VARIABLE ConditionVariable)
Definition: sync.c:68
#define calloc
Definition: rosglue.h:14
VOID WINAPI InitializeCriticalSection(OUT LPCRITICAL_SECTION lpCriticalSection)
Definition: synch.c:751

Referenced by nfs41_session_create().

◆ slot_table_avail()

static int slot_table_avail ( IN const nfs41_slot_table table)
static

Definition at line 38 of file nfs41_session.c.

40{
41 return table->num_used < table->max_slots;
42}

Referenced by init_slot_table(), nfs41_session_free_slot(), nfs41_session_get_slot(), and resize_slot_table().