Skip to content

Commit b2d9937

Browse files
namjaejeonSteve French
authored andcommitted
ksmbd: browse interfaces list on FSCTL_QUERY_INTERFACE_INFO IOCTL
ksmbd.mount will give each interfaces list and bind_interfaces_only flags to ksmbd server. Previously, the interfaces list was sent only when bind_interfaces_only was enabled. ksmbd server browse only interfaces list given from ksmbd.conf on FSCTL_QUERY_INTERFACE_INFO IOCTL. Signed-off-by: Namjae Jeon <linkinjeon@kernel.org> Signed-off-by: Steve French <stfrench@microsoft.com>
1 parent fe4b418 commit b2d9937

File tree

6 files changed

+41
-42
lines changed

6 files changed

+41
-42
lines changed

fs/smb/server/ksmbd_netlink.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,8 @@ struct ksmbd_startup_request {
111111
__u32 smb2_max_credits; /* MAX credits */
112112
__u32 smbd_max_io_size; /* smbd read write size */
113113
__u32 max_connections; /* Number of maximum simultaneous connections */
114-
__u32 reserved[126]; /* Reserved room */
114+
__s8 bind_interfaces_only;
115+
__s8 reserved[503]; /* Reserved room */
115116
__u32 ifc_list_sz; /* interfaces list size */
116117
__s8 ____payload[];
117118
};

fs/smb/server/server.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ struct ksmbd_server_config {
4646

4747
char *conf[SERVER_CONF_WORK_GROUP + 1];
4848
struct task_struct *dh_task;
49+
bool bind_interfaces_only;
4950
};
5051

5152
extern struct ksmbd_server_config server_conf;

fs/smb/server/smb2pdu.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
#include "mgmt/user_session.h"
3939
#include "mgmt/ksmbd_ida.h"
4040
#include "ndr.h"
41+
#include "transport_tcp.h"
4142

4243
static void __wbuf(struct ksmbd_work *work, void **req, void **rsp)
4344
{
@@ -7759,6 +7760,9 @@ static int fsctl_query_iface_info_ioctl(struct ksmbd_conn *conn,
77597760
if (netdev->type == ARPHRD_LOOPBACK)
77607761
continue;
77617762

7763+
if (!ksmbd_find_netdev_name_iface_list(netdev->name))
7764+
continue;
7765+
77627766
flags = dev_get_flags(netdev);
77637767
if (!(flags & IFF_RUNNING))
77647768
continue;

fs/smb/server/transport_ipc.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,7 @@ static int ipc_server_config_on_startup(struct ksmbd_startup_request *req)
333333
ret = ksmbd_set_netbios_name(req->netbios_name);
334334
ret |= ksmbd_set_server_string(req->server_string);
335335
ret |= ksmbd_set_work_group(req->work_group);
336+
server_conf.bind_interfaces_only = req->bind_interfaces_only;
336337
ret |= ksmbd_tcp_set_interfaces(KSMBD_STARTUP_CONFIG_INTERFACES(req),
337338
req->ifc_list_sz);
338339
if (ret) {

fs/smb/server/transport_tcp.c

Lines changed: 32 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -504,32 +504,37 @@ static int create_socket(struct interface *iface)
504504
return ret;
505505
}
506506

507+
struct interface *ksmbd_find_netdev_name_iface_list(char *netdev_name)
508+
{
509+
struct interface *iface;
510+
511+
list_for_each_entry(iface, &iface_list, entry)
512+
if (!strcmp(iface->name, netdev_name))
513+
return iface;
514+
return NULL;
515+
}
516+
507517
static int ksmbd_netdev_event(struct notifier_block *nb, unsigned long event,
508518
void *ptr)
509519
{
510520
struct net_device *netdev = netdev_notifier_info_to_dev(ptr);
511521
struct interface *iface;
512-
int ret, found = 0;
522+
int ret;
513523

514524
switch (event) {
515525
case NETDEV_UP:
516526
if (netif_is_bridge_port(netdev))
517527
return NOTIFY_OK;
518528

519-
list_for_each_entry(iface, &iface_list, entry) {
520-
if (!strcmp(iface->name, netdev->name)) {
521-
found = 1;
522-
if (iface->state != IFACE_STATE_DOWN)
523-
break;
524-
ksmbd_debug(CONN, "netdev-up event: netdev(%s) is going up\n",
525-
iface->name);
526-
ret = create_socket(iface);
527-
if (ret)
528-
return NOTIFY_OK;
529-
break;
530-
}
529+
iface = ksmbd_find_netdev_name_iface_list(netdev->name);
530+
if (iface && iface->state == IFACE_STATE_DOWN) {
531+
ksmbd_debug(CONN, "netdev-up event: netdev(%s) is going up\n",
532+
iface->name);
533+
ret = create_socket(iface);
534+
if (ret)
535+
return NOTIFY_OK;
531536
}
532-
if (!found && bind_additional_ifaces) {
537+
if (!iface && bind_additional_ifaces) {
533538
iface = alloc_iface(kstrdup(netdev->name, KSMBD_DEFAULT_GFP));
534539
if (!iface)
535540
return NOTIFY_OK;
@@ -541,21 +546,19 @@ static int ksmbd_netdev_event(struct notifier_block *nb, unsigned long event,
541546
}
542547
break;
543548
case NETDEV_DOWN:
544-
list_for_each_entry(iface, &iface_list, entry) {
545-
if (!strcmp(iface->name, netdev->name) &&
546-
iface->state == IFACE_STATE_CONFIGURED) {
547-
ksmbd_debug(CONN, "netdev-down event: netdev(%s) is going down\n",
548-
iface->name);
549-
tcp_stop_kthread(iface->ksmbd_kthread);
550-
iface->ksmbd_kthread = NULL;
551-
mutex_lock(&iface->sock_release_lock);
552-
tcp_destroy_socket(iface->ksmbd_socket);
553-
iface->ksmbd_socket = NULL;
554-
mutex_unlock(&iface->sock_release_lock);
555-
556-
iface->state = IFACE_STATE_DOWN;
557-
break;
558-
}
549+
iface = ksmbd_find_netdev_name_iface_list(netdev->name);
550+
if (iface && iface->state == IFACE_STATE_CONFIGURED) {
551+
ksmbd_debug(CONN, "netdev-down event: netdev(%s) is going down\n",
552+
iface->name);
553+
tcp_stop_kthread(iface->ksmbd_kthread);
554+
iface->ksmbd_kthread = NULL;
555+
mutex_lock(&iface->sock_release_lock);
556+
tcp_destroy_socket(iface->ksmbd_socket);
557+
iface->ksmbd_socket = NULL;
558+
mutex_unlock(&iface->sock_release_lock);
559+
560+
iface->state = IFACE_STATE_DOWN;
561+
break;
559562
}
560563
break;
561564
}
@@ -624,18 +627,6 @@ int ksmbd_tcp_set_interfaces(char *ifc_list, int ifc_list_sz)
624627
int sz = 0;
625628

626629
if (!ifc_list_sz) {
627-
struct net_device *netdev;
628-
629-
rtnl_lock();
630-
for_each_netdev(&init_net, netdev) {
631-
if (netif_is_bridge_port(netdev))
632-
continue;
633-
if (!alloc_iface(kstrdup(netdev->name, KSMBD_DEFAULT_GFP))) {
634-
rtnl_unlock();
635-
return -ENOMEM;
636-
}
637-
}
638-
rtnl_unlock();
639630
bind_additional_ifaces = 1;
640631
return 0;
641632
}

fs/smb/server/transport_tcp.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#define __KSMBD_TRANSPORT_TCP_H__
88

99
int ksmbd_tcp_set_interfaces(char *ifc_list, int ifc_list_sz);
10+
struct interface *ksmbd_find_netdev_name_iface_list(char *netdev_name);
1011
int ksmbd_tcp_init(void);
1112
void ksmbd_tcp_destroy(void);
1213

0 commit comments

Comments
 (0)