mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
ksmbd: add max connections parameter
Add max connections parameter to limit number of maximum simultaneous
connections.
Fixes: 0626e6641f
("cifsd: add server handler for central processing and tranport layers")
Cc: stable@vger.kernel.org
Reviewed-by: Sergey Senozhatsky <senozhatsky@chromium.org>
Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
This commit is contained in:
parent
5dc4c995db
commit
0d0d4680db
4 changed files with 22 additions and 2 deletions
|
@ -106,7 +106,8 @@ struct ksmbd_startup_request {
|
||||||
__u32 sub_auth[3]; /* Subauth value for Security ID */
|
__u32 sub_auth[3]; /* Subauth value for Security ID */
|
||||||
__u32 smb2_max_credits; /* MAX credits */
|
__u32 smb2_max_credits; /* MAX credits */
|
||||||
__u32 smbd_max_io_size; /* smbd read write size */
|
__u32 smbd_max_io_size; /* smbd read write size */
|
||||||
__u32 reserved[127]; /* Reserved room */
|
__u32 max_connections; /* Number of maximum simultaneous connections */
|
||||||
|
__u32 reserved[126]; /* Reserved room */
|
||||||
__u32 ifc_list_sz; /* interfaces list size */
|
__u32 ifc_list_sz; /* interfaces list size */
|
||||||
__s8 ____payload[];
|
__s8 ____payload[];
|
||||||
};
|
};
|
||||||
|
|
|
@ -41,6 +41,7 @@ struct ksmbd_server_config {
|
||||||
unsigned int share_fake_fscaps;
|
unsigned int share_fake_fscaps;
|
||||||
struct smb_sid domain_sid;
|
struct smb_sid domain_sid;
|
||||||
unsigned int auth_mechs;
|
unsigned int auth_mechs;
|
||||||
|
unsigned int max_connections;
|
||||||
|
|
||||||
char *conf[SERVER_CONF_WORK_GROUP + 1];
|
char *conf[SERVER_CONF_WORK_GROUP + 1];
|
||||||
};
|
};
|
||||||
|
|
|
@ -308,6 +308,9 @@ static int ipc_server_config_on_startup(struct ksmbd_startup_request *req)
|
||||||
if (req->smbd_max_io_size)
|
if (req->smbd_max_io_size)
|
||||||
init_smbd_max_io_size(req->smbd_max_io_size);
|
init_smbd_max_io_size(req->smbd_max_io_size);
|
||||||
|
|
||||||
|
if (req->max_connections)
|
||||||
|
server_conf.max_connections = req->max_connections;
|
||||||
|
|
||||||
ret = ksmbd_set_netbios_name(req->netbios_name);
|
ret = ksmbd_set_netbios_name(req->netbios_name);
|
||||||
ret |= ksmbd_set_server_string(req->server_string);
|
ret |= ksmbd_set_server_string(req->server_string);
|
||||||
ret |= ksmbd_set_work_group(req->work_group);
|
ret |= ksmbd_set_work_group(req->work_group);
|
||||||
|
|
|
@ -15,6 +15,8 @@
|
||||||
#define IFACE_STATE_DOWN BIT(0)
|
#define IFACE_STATE_DOWN BIT(0)
|
||||||
#define IFACE_STATE_CONFIGURED BIT(1)
|
#define IFACE_STATE_CONFIGURED BIT(1)
|
||||||
|
|
||||||
|
static atomic_t active_num_conn;
|
||||||
|
|
||||||
struct interface {
|
struct interface {
|
||||||
struct task_struct *ksmbd_kthread;
|
struct task_struct *ksmbd_kthread;
|
||||||
struct socket *ksmbd_socket;
|
struct socket *ksmbd_socket;
|
||||||
|
@ -185,8 +187,10 @@ static int ksmbd_tcp_new_connection(struct socket *client_sk)
|
||||||
struct tcp_transport *t;
|
struct tcp_transport *t;
|
||||||
|
|
||||||
t = alloc_transport(client_sk);
|
t = alloc_transport(client_sk);
|
||||||
if (!t)
|
if (!t) {
|
||||||
|
sock_release(client_sk);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
csin = KSMBD_TCP_PEER_SOCKADDR(KSMBD_TRANS(t)->conn);
|
csin = KSMBD_TCP_PEER_SOCKADDR(KSMBD_TRANS(t)->conn);
|
||||||
if (kernel_getpeername(client_sk, csin) < 0) {
|
if (kernel_getpeername(client_sk, csin) < 0) {
|
||||||
|
@ -239,6 +243,15 @@ static int ksmbd_kthread_fn(void *p)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (server_conf.max_connections &&
|
||||||
|
atomic_inc_return(&active_num_conn) >= server_conf.max_connections) {
|
||||||
|
pr_info_ratelimited("Limit the maximum number of connections(%u)\n",
|
||||||
|
atomic_read(&active_num_conn));
|
||||||
|
atomic_dec(&active_num_conn);
|
||||||
|
sock_release(client_sk);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
ksmbd_debug(CONN, "connect success: accepted new connection\n");
|
ksmbd_debug(CONN, "connect success: accepted new connection\n");
|
||||||
client_sk->sk->sk_rcvtimeo = KSMBD_TCP_RECV_TIMEOUT;
|
client_sk->sk->sk_rcvtimeo = KSMBD_TCP_RECV_TIMEOUT;
|
||||||
client_sk->sk->sk_sndtimeo = KSMBD_TCP_SEND_TIMEOUT;
|
client_sk->sk->sk_sndtimeo = KSMBD_TCP_SEND_TIMEOUT;
|
||||||
|
@ -368,6 +381,8 @@ static int ksmbd_tcp_writev(struct ksmbd_transport *t, struct kvec *iov,
|
||||||
static void ksmbd_tcp_disconnect(struct ksmbd_transport *t)
|
static void ksmbd_tcp_disconnect(struct ksmbd_transport *t)
|
||||||
{
|
{
|
||||||
free_transport(TCP_TRANS(t));
|
free_transport(TCP_TRANS(t));
|
||||||
|
if (server_conf.max_connections)
|
||||||
|
atomic_dec(&active_num_conn);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void tcp_destroy_socket(struct socket *ksmbd_socket)
|
static void tcp_destroy_socket(struct socket *ksmbd_socket)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue