diff options
| author | Henry Hu <huhai@kylinos.cn> | 2026-09-12 00:35:13 +0800 |
|---|---|---|
| committer | Namjae Jeon <linkinjeon@kernel.org> | 2026-09-15 22:28:52 +0900 |
| commit | 5943c553c65a033def2c61df152b8da43aea2dc4 (patch) | |
| tree | 900e02f787be9e0914517652842ac5785aab0974 | |
| parent | 0c4c8e4c0d4a3e83c72986e1b2fc29ca09ec091c (diff) | |
| download | linux-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.c | 7 |
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, |
