After multi-channel connection with windows, Several channels of session are connected. Among them, if there is a problem in one channel, Windows connects again after disconnecting the channel. In this process, the session is released and a kernel oop can occurs while processing requests to other channels. When the channel is disconnected, if other channels still exist in the session after deleting the channel from the channel list in the session, the session should not be released. Finally, the session will be released after all channels are disconnected. Signed-off-by: Namjae Jeon <linkinjeon@kernel.org> Reviewed-by: Hyunchul Lee <hyc.lee@gmail.com> Signed-off-by: Steve French <stfrench@microsoft.com>
59 lines
1.3 KiB
C
59 lines
1.3 KiB
C
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
/*
|
|
* Copyright (C) 2018 Samsung Electronics Co., Ltd.
|
|
*/
|
|
|
|
#ifndef __TREE_CONNECT_MANAGEMENT_H__
|
|
#define __TREE_CONNECT_MANAGEMENT_H__
|
|
|
|
#include <linux/hashtable.h>
|
|
|
|
#include "../ksmbd_netlink.h"
|
|
|
|
struct ksmbd_share_config;
|
|
struct ksmbd_user;
|
|
struct ksmbd_conn;
|
|
|
|
struct ksmbd_tree_connect {
|
|
int id;
|
|
|
|
unsigned int flags;
|
|
struct ksmbd_share_config *share_conf;
|
|
struct ksmbd_user *user;
|
|
|
|
struct list_head list;
|
|
|
|
int maximal_access;
|
|
bool posix_extensions;
|
|
};
|
|
|
|
struct ksmbd_tree_conn_status {
|
|
unsigned int ret;
|
|
struct ksmbd_tree_connect *tree_conn;
|
|
};
|
|
|
|
static inline int test_tree_conn_flag(struct ksmbd_tree_connect *tree_conn,
|
|
int flag)
|
|
{
|
|
return tree_conn->flags & flag;
|
|
}
|
|
|
|
struct ksmbd_session;
|
|
|
|
struct ksmbd_tree_conn_status
|
|
ksmbd_tree_conn_connect(struct ksmbd_conn *conn, struct ksmbd_session *sess,
|
|
char *share_name);
|
|
|
|
int ksmbd_tree_conn_disconnect(struct ksmbd_session *sess,
|
|
struct ksmbd_tree_connect *tree_conn);
|
|
|
|
struct ksmbd_tree_connect *ksmbd_tree_conn_lookup(struct ksmbd_session *sess,
|
|
unsigned int id);
|
|
|
|
struct ksmbd_share_config *ksmbd_tree_conn_share(struct ksmbd_session *sess,
|
|
unsigned int id);
|
|
|
|
int ksmbd_tree_conn_session_logoff(struct ksmbd_session *sess);
|
|
|
|
#endif /* __TREE_CONNECT_MANAGEMENT_H__ */
|