Skip to content

Commit 665e858

Browse files
namjaejeongregkh
authored andcommitted
ksmbd: mark SMB2_SESSION_EXPIRED to session when destroying previous session
[ Upstream commit fa9415d ] Currently ksmbd exit connection as well destroying previous session. When testing durable handle feaure, I found that destroy_previous_session() should destroy only session, i.e. the connection should be still alive. This patch mark SMB2_SESSION_EXPIRED on the previous session to be destroyed later and not used anymore. Signed-off-by: Namjae Jeon <[email protected]> Signed-off-by: Steve French <[email protected]> Signed-off-by: Sasha Levin <[email protected]>
1 parent eb4a05e commit 665e858

File tree

3 files changed

+29
-25
lines changed

3 files changed

+29
-25
lines changed

fs/smb/server/mgmt/user_session.c

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ void ksmbd_session_destroy(struct ksmbd_session *sess)
156156
kfree(sess);
157157
}
158158

159-
static struct ksmbd_session *__session_lookup(unsigned long long id)
159+
struct ksmbd_session *__session_lookup(unsigned long long id)
160160
{
161161
struct ksmbd_session *sess;
162162

@@ -305,6 +305,31 @@ struct preauth_session *ksmbd_preauth_session_alloc(struct ksmbd_conn *conn,
305305
return sess;
306306
}
307307

308+
void destroy_previous_session(struct ksmbd_conn *conn,
309+
struct ksmbd_user *user, u64 id)
310+
{
311+
struct ksmbd_session *prev_sess;
312+
struct ksmbd_user *prev_user;
313+
314+
down_write(&sessions_table_lock);
315+
down_write(&conn->session_lock);
316+
prev_sess = __session_lookup(id);
317+
if (!prev_sess || prev_sess->state == SMB2_SESSION_EXPIRED)
318+
goto out;
319+
320+
prev_user = prev_sess->user;
321+
if (!prev_user ||
322+
strcmp(user->name, prev_user->name) ||
323+
user->passkey_sz != prev_user->passkey_sz ||
324+
memcmp(user->passkey, prev_user->passkey, user->passkey_sz))
325+
goto out;
326+
327+
prev_sess->state = SMB2_SESSION_EXPIRED;
328+
out:
329+
up_write(&conn->session_lock);
330+
up_write(&sessions_table_lock);
331+
}
332+
308333
static bool ksmbd_preauth_session_id_match(struct preauth_session *sess,
309334
unsigned long long id)
310335
{

fs/smb/server/mgmt/user_session.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,11 @@ struct ksmbd_session *ksmbd_session_lookup(struct ksmbd_conn *conn,
8888
int ksmbd_session_register(struct ksmbd_conn *conn,
8989
struct ksmbd_session *sess);
9090
void ksmbd_sessions_deregister(struct ksmbd_conn *conn);
91+
struct ksmbd_session *__session_lookup(unsigned long long id);
9192
struct ksmbd_session *ksmbd_session_lookup_all(struct ksmbd_conn *conn,
9293
unsigned long long id);
94+
void destroy_previous_session(struct ksmbd_conn *conn,
95+
struct ksmbd_user *user, u64 id);
9396
struct preauth_session *ksmbd_preauth_session_alloc(struct ksmbd_conn *conn,
9497
u64 sess_id);
9598
struct preauth_session *ksmbd_preauth_session_lookup(struct ksmbd_conn *conn,

fs/smb/server/smb2pdu.c

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -611,30 +611,6 @@ int smb2_check_user_session(struct ksmbd_work *work)
611611
return -ENOENT;
612612
}
613613

614-
static void destroy_previous_session(struct ksmbd_conn *conn,
615-
struct ksmbd_user *user, u64 id)
616-
{
617-
struct ksmbd_session *prev_sess = ksmbd_session_lookup_slowpath(id);
618-
struct ksmbd_user *prev_user;
619-
struct channel *chann;
620-
long index;
621-
622-
if (!prev_sess)
623-
return;
624-
625-
prev_user = prev_sess->user;
626-
627-
if (!prev_user ||
628-
strcmp(user->name, prev_user->name) ||
629-
user->passkey_sz != prev_user->passkey_sz ||
630-
memcmp(user->passkey, prev_user->passkey, user->passkey_sz))
631-
return;
632-
633-
prev_sess->state = SMB2_SESSION_EXPIRED;
634-
xa_for_each(&prev_sess->ksmbd_chann_list, index, chann)
635-
ksmbd_conn_set_exiting(chann->conn);
636-
}
637-
638614
/**
639615
* smb2_get_name() - get filename string from on the wire smb format
640616
* @src: source buffer

0 commit comments

Comments
 (0)