summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHenry Hu <huhai@kylinos.cn>2026-09-12 00:35:13 +0800
committerNamjae Jeon <linkinjeon@kernel.org>2026-09-15 22:28:52 +0900
commit5943c553c65a033def2c61df152b8da43aea2dc4 (patch)
tree900e02f787be9e0914517652842ac5785aab0974
parent0c4c8e4c0d4a3e83c72986e1b2fc29ca09ec091c (diff)
downloadlinux-next-5943c553c65a033def2c61df152b8da43aea2dc4.tar.gz
linux-next-5943c553c65a033def2c61df152b8da43aea2dc4.zip
ksmbd: fix link speed query in fsctl_query_iface_info_ioctl()
fsctl_query_iface_info_ioctl() used to call netdev->ethtool_ops->get_link_ksettings() directly and never checked the return value. If the callback fails, cmd.base.speed may be left uninitialized. Also, SPEED_UNKNOWN (-1) is treated as a numeric link speed and would be converted into a bogus link speed. Use __ethtool_get_link_ksettings() to acquire the per-netdev ops lock when needed. Fall back to 1Gbps when the query fails, or when the reported speed is 0 or SPEED_UNKNOWN. Fixes: e2f34481b24d ("cifsd: add server-side procedures for SMB3") Signed-off-by: Henry Hu <huhai@kylinos.cn> Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
-rw-r--r--fs/smb/server/smb2pdu.c7
1 files changed, 3 insertions, 4 deletions
diff --git a/fs/smb/server/smb2pdu.c b/fs/smb/server/smb2pdu.c
index 3c0d71fcc79b..bb5007ae4867 100644
--- a/fs/smb/server/smb2pdu.c
+++ b/fs/smb/server/smb2pdu.c
@@ -10502,6 +10502,7 @@ static int fsctl_query_iface_info_ioctl(struct ksmbd_conn *conn,
struct sockaddr_storage_rsp *sockaddr_storage;
unsigned int flags;
unsigned long long speed;
+ struct ethtool_link_ksettings cmd;
rtnl_lock();
for_each_netdev(&init_net, netdev) {
@@ -10536,10 +10537,8 @@ ipv6_retry:
nii_rsp->Next = cpu_to_le32(152);
nii_rsp->Reserved = 0;
- if (netdev->ethtool_ops->get_link_ksettings) {
- struct ethtool_link_ksettings cmd;
-
- netdev->ethtool_ops->get_link_ksettings(netdev, &cmd);
+ if (!__ethtool_get_link_ksettings(netdev, &cmd) &&
+ cmd.base.speed && cmd.base.speed != SPEED_UNKNOWN) {
speed = cmd.base.speed;
} else {
ksmbd_debug(SMB, "%s %s\n", netdev->name,