Skip to content

Commit 4652b8e

Browse files
committed
Merge tag '6.7-rc-ksmbd-server-fixes' of git://git.samba.org/ksmbd
Pull smb server updates from Steve French: "Seven ksmbd server fixes: - logoff improvement for multichannel bound connections - unicode fix for surrogate pairs - RDMA (smbdirect) fix for IB devices - fix locking deadlock in kern_path_create during rename - iov memory allocation fix - two minor cleanup patches (doc cleanup, and unused variable)" * tag '6.7-rc-ksmbd-server-fixes' of git://git.samba.org/ksmbd: ksmbd: no need to wait for binded connection termination at logoff ksmbd: add support for surrogate pair conversion ksmbd: fix missing RDMA-capable flag for IPoIB device in ksmbd_rdma_capable_netdev() ksmbd: fix recursive locking in vfs helpers ksmbd: fix kernel-doc comment of ksmbd_vfs_setxattr() ksmbd: reorganize ksmbd_iov_pin_rsp() ksmbd: Remove unused field in ksmbd_user struct
2 parents 71fb7b3 + 67797da commit 4652b8e

File tree

6 files changed

+194
-118
lines changed

6 files changed

+194
-118
lines changed

fs/smb/server/connection.c

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -167,23 +167,7 @@ void ksmbd_all_conn_set_status(u64 sess_id, u32 status)
167167

168168
void ksmbd_conn_wait_idle(struct ksmbd_conn *conn, u64 sess_id)
169169
{
170-
struct ksmbd_conn *bind_conn;
171-
172170
wait_event(conn->req_running_q, atomic_read(&conn->req_running) < 2);
173-
174-
down_read(&conn_list_lock);
175-
list_for_each_entry(bind_conn, &conn_list, conns_list) {
176-
if (bind_conn == conn)
177-
continue;
178-
179-
if ((bind_conn->binding || xa_load(&bind_conn->sessions, sess_id)) &&
180-
!ksmbd_conn_releasing(bind_conn) &&
181-
atomic_read(&bind_conn->req_running)) {
182-
wait_event(bind_conn->req_running_q,
183-
atomic_read(&bind_conn->req_running) == 0);
184-
}
185-
}
186-
up_read(&conn_list_lock);
187171
}
188172

189173
int ksmbd_conn_write(struct ksmbd_work *work)

fs/smb/server/ksmbd_work.c

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -95,11 +95,28 @@ bool ksmbd_queue_work(struct ksmbd_work *work)
9595
return queue_work(ksmbd_wq, &work->work);
9696
}
9797

98-
static int ksmbd_realloc_iov_pin(struct ksmbd_work *work, void *ib,
99-
unsigned int ib_len)
98+
static inline void __ksmbd_iov_pin(struct ksmbd_work *work, void *ib,
99+
unsigned int ib_len)
100100
{
101+
work->iov[++work->iov_idx].iov_base = ib;
102+
work->iov[work->iov_idx].iov_len = ib_len;
103+
work->iov_cnt++;
104+
}
105+
106+
static int __ksmbd_iov_pin_rsp(struct ksmbd_work *work, void *ib, int len,
107+
void *aux_buf, unsigned int aux_size)
108+
{
109+
struct aux_read *ar;
110+
int need_iov_cnt = 1;
101111

102-
if (work->iov_alloc_cnt <= work->iov_cnt) {
112+
if (aux_size) {
113+
need_iov_cnt++;
114+
ar = kmalloc(sizeof(struct aux_read), GFP_KERNEL);
115+
if (!ar)
116+
return -ENOMEM;
117+
}
118+
119+
if (work->iov_alloc_cnt < work->iov_cnt + need_iov_cnt) {
103120
struct kvec *new;
104121

105122
work->iov_alloc_cnt += 4;
@@ -111,16 +128,6 @@ static int ksmbd_realloc_iov_pin(struct ksmbd_work *work, void *ib,
111128
work->iov = new;
112129
}
113130

114-
work->iov[++work->iov_idx].iov_base = ib;
115-
work->iov[work->iov_idx].iov_len = ib_len;
116-
work->iov_cnt++;
117-
118-
return 0;
119-
}
120-
121-
static int __ksmbd_iov_pin_rsp(struct ksmbd_work *work, void *ib, int len,
122-
void *aux_buf, unsigned int aux_size)
123-
{
124131
/* Plus rfc_length size on first iov */
125132
if (!work->iov_idx) {
126133
work->iov[work->iov_idx].iov_base = work->response_buf;
@@ -129,19 +136,13 @@ static int __ksmbd_iov_pin_rsp(struct ksmbd_work *work, void *ib, int len,
129136
work->iov_cnt++;
130137
}
131138

132-
ksmbd_realloc_iov_pin(work, ib, len);
139+
__ksmbd_iov_pin(work, ib, len);
133140
inc_rfc1001_len(work->iov[0].iov_base, len);
134141

135142
if (aux_size) {
136-
struct aux_read *ar;
137-
138-
ksmbd_realloc_iov_pin(work, aux_buf, aux_size);
143+
__ksmbd_iov_pin(work, aux_buf, aux_size);
139144
inc_rfc1001_len(work->iov[0].iov_base, aux_size);
140145

141-
ar = kmalloc(sizeof(struct aux_read), GFP_KERNEL);
142-
if (!ar)
143-
return -ENOMEM;
144-
145146
ar->buf = aux_buf;
146147
list_add(&ar->entry, &work->aux_read_list);
147148
}

fs/smb/server/mgmt/user_config.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ struct ksmbd_user {
1818

1919
size_t passkey_sz;
2020
char *passkey;
21-
unsigned int failed_login_count;
2221
};
2322

2423
static inline bool user_guest(struct ksmbd_user *user)

fs/smb/server/transport_rdma.c

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2140,8 +2140,7 @@ static int smb_direct_ib_client_add(struct ib_device *ib_dev)
21402140
if (ib_dev->node_type != RDMA_NODE_IB_CA)
21412141
smb_direct_port = SMB_DIRECT_PORT_IWARP;
21422142

2143-
if (!ib_dev->ops.get_netdev ||
2144-
!rdma_frwr_is_supported(&ib_dev->attrs))
2143+
if (!rdma_frwr_is_supported(&ib_dev->attrs))
21452144
return 0;
21462145

21472146
smb_dev = kzalloc(sizeof(*smb_dev), GFP_KERNEL);
@@ -2241,17 +2240,38 @@ bool ksmbd_rdma_capable_netdev(struct net_device *netdev)
22412240
for (i = 0; i < smb_dev->ib_dev->phys_port_cnt; i++) {
22422241
struct net_device *ndev;
22432242

2244-
ndev = smb_dev->ib_dev->ops.get_netdev(smb_dev->ib_dev,
2245-
i + 1);
2246-
if (!ndev)
2247-
continue;
2243+
if (smb_dev->ib_dev->ops.get_netdev) {
2244+
ndev = smb_dev->ib_dev->ops.get_netdev(
2245+
smb_dev->ib_dev, i + 1);
2246+
if (!ndev)
2247+
continue;
22482248

2249-
if (ndev == netdev) {
2249+
if (ndev == netdev) {
2250+
dev_put(ndev);
2251+
rdma_capable = true;
2252+
goto out;
2253+
}
22502254
dev_put(ndev);
2251-
rdma_capable = true;
2252-
goto out;
2255+
/* if ib_dev does not implement ops.get_netdev
2256+
* check for matching infiniband GUID in hw_addr
2257+
*/
2258+
} else if (netdev->type == ARPHRD_INFINIBAND) {
2259+
struct netdev_hw_addr *ha;
2260+
union ib_gid gid;
2261+
u32 port_num;
2262+
int ret;
2263+
2264+
netdev_hw_addr_list_for_each(
2265+
ha, &netdev->dev_addrs) {
2266+
memcpy(&gid, ha->addr + 4, sizeof(gid));
2267+
ret = ib_find_gid(smb_dev->ib_dev, &gid,
2268+
&port_num, NULL);
2269+
if (!ret) {
2270+
rdma_capable = true;
2271+
goto out;
2272+
}
2273+
}
22532274
}
2254-
dev_put(ndev);
22552275
}
22562276
}
22572277
out:

0 commit comments

Comments
 (0)