Skip to content

Commit dc10cf1

Browse files
metze-sambasmfrench
authored andcommitted
smb: client: relax WARN_ON_ONCE(SMBDIRECT_SOCKET_*) checks in recv_done() and smbd_conn_upcall()
sc->first_error might already be set and sc->status is thus unexpected, so this should avoid the WARN[_ON]_ONCE() if sc->first_error is already set and have a usable error path. While there set sc->first_error as soon as possible. This is done based on a problem seen in similar places on the server. And there it was already very useful in order to find the problem when we have a meaningful WARN_ONCE() that prints details about the connection. This is much more useful: [ 309.560973] expected[NEGOTIATE_NEEDED] != RDMA_CONNECT_RUNNING first_error=0 local=192.168.0.200:445 remote=192.168.0.100:60445 [ 309.561034] WARNING: CPU: 2 PID: 78 at transport_rdma.c:643 recv_done+0x2fa/0x3d0 [ksmbd] than what we had before (only): [ 894.140316] WARNING: CPU: 1 PID: 116 at fs/smb/server/transport_rdma.c:642 recv_done+0x308/0x360 [ksmbd] Fixes: 58dfba8 ("smb: client/smbdirect: replace SMBDIRECT_SOCKET_CONNECTING with more detailed states") Cc: Steve French <smfrench@gmail.com> Cc: Tom Talpey <tom@talpey.com> Cc: Long Li <longli@microsoft.com> Cc: Namjae Jeon <linkinjeon@kernel.org> Cc: Paulo Alcantara <pc@manguebit.org> Cc: linux-cifs@vger.kernel.org Cc: samba-technical@lists.samba.org Signed-off-by: Stefan Metzmacher <metze@samba.org> Acked-by: Namjae Jeon <linkinjeon@kernel.org> Signed-off-by: Steve French <stfrench@microsoft.com>
1 parent 425c327 commit dc10cf1

1 file changed

Lines changed: 15 additions & 13 deletions

File tree

fs/smb/client/smbdirect.c

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <linux/module.h>
88
#include <linux/highmem.h>
99
#include <linux/folio_queue.h>
10+
#define __SMBDIRECT_SOCKET_DISCONNECT(__sc) smbd_disconnect_rdma_connection(__sc)
1011
#include "../common/smbdirect/smbdirect_pdu.h"
1112
#include "smbdirect.h"
1213
#include "cifs_debug.h"
@@ -186,6 +187,9 @@ static void smbd_disconnect_rdma_work(struct work_struct *work)
186187
struct smbdirect_socket *sc =
187188
container_of(work, struct smbdirect_socket, disconnect_work);
188189

190+
if (sc->first_error == 0)
191+
sc->first_error = -ECONNABORTED;
192+
189193
/*
190194
* make sure this and other work is not queued again
191195
* but here we don't block and avoid
@@ -197,9 +201,6 @@ static void smbd_disconnect_rdma_work(struct work_struct *work)
197201
disable_work(&sc->idle.immediate_work);
198202
disable_delayed_work(&sc->idle.timer_work);
199203

200-
if (sc->first_error == 0)
201-
sc->first_error = -ECONNABORTED;
202-
203204
switch (sc->status) {
204205
case SMBDIRECT_SOCKET_NEGOTIATE_NEEDED:
205206
case SMBDIRECT_SOCKET_NEGOTIATE_RUNNING:
@@ -242,6 +243,9 @@ static void smbd_disconnect_rdma_work(struct work_struct *work)
242243

243244
static void smbd_disconnect_rdma_connection(struct smbdirect_socket *sc)
244245
{
246+
if (sc->first_error == 0)
247+
sc->first_error = -ECONNABORTED;
248+
245249
/*
246250
* make sure other work (than disconnect_work) is
247251
* not queued again but here we don't block and avoid
@@ -252,9 +256,6 @@ static void smbd_disconnect_rdma_connection(struct smbdirect_socket *sc)
252256
disable_work(&sc->idle.immediate_work);
253257
disable_delayed_work(&sc->idle.timer_work);
254258

255-
if (sc->first_error == 0)
256-
sc->first_error = -ECONNABORTED;
257-
258259
switch (sc->status) {
259260
case SMBDIRECT_SOCKET_RESOLVE_ADDR_FAILED:
260261
case SMBDIRECT_SOCKET_RESOLVE_ROUTE_FAILED:
@@ -322,27 +323,27 @@ static int smbd_conn_upcall(
322323

323324
switch (event->event) {
324325
case RDMA_CM_EVENT_ADDR_RESOLVED:
325-
WARN_ON_ONCE(sc->status != SMBDIRECT_SOCKET_RESOLVE_ADDR_RUNNING);
326+
if (SMBDIRECT_CHECK_STATUS_DISCONNECT(sc, SMBDIRECT_SOCKET_RESOLVE_ADDR_RUNNING))
327+
break;
326328
sc->status = SMBDIRECT_SOCKET_RESOLVE_ROUTE_NEEDED;
327329
wake_up(&sc->status_wait);
328330
break;
329331

330332
case RDMA_CM_EVENT_ROUTE_RESOLVED:
331-
WARN_ON_ONCE(sc->status != SMBDIRECT_SOCKET_RESOLVE_ROUTE_RUNNING);
333+
if (SMBDIRECT_CHECK_STATUS_DISCONNECT(sc, SMBDIRECT_SOCKET_RESOLVE_ROUTE_RUNNING))
334+
break;
332335
sc->status = SMBDIRECT_SOCKET_RDMA_CONNECT_NEEDED;
333336
wake_up(&sc->status_wait);
334337
break;
335338

336339
case RDMA_CM_EVENT_ADDR_ERROR:
337340
log_rdma_event(ERR, "connecting failed event=%s\n", event_name);
338-
WARN_ON_ONCE(sc->status != SMBDIRECT_SOCKET_RESOLVE_ADDR_RUNNING);
339341
sc->status = SMBDIRECT_SOCKET_RESOLVE_ADDR_FAILED;
340342
smbd_disconnect_rdma_work(&sc->disconnect_work);
341343
break;
342344

343345
case RDMA_CM_EVENT_ROUTE_ERROR:
344346
log_rdma_event(ERR, "connecting failed event=%s\n", event_name);
345-
WARN_ON_ONCE(sc->status != SMBDIRECT_SOCKET_RESOLVE_ROUTE_RUNNING);
346347
sc->status = SMBDIRECT_SOCKET_RESOLVE_ROUTE_FAILED;
347348
smbd_disconnect_rdma_work(&sc->disconnect_work);
348349
break;
@@ -428,7 +429,8 @@ static int smbd_conn_upcall(
428429
min_t(u8, sp->responder_resources,
429430
peer_responder_resources);
430431

431-
WARN_ON_ONCE(sc->status != SMBDIRECT_SOCKET_RDMA_CONNECT_RUNNING);
432+
if (SMBDIRECT_CHECK_STATUS_DISCONNECT(sc, SMBDIRECT_SOCKET_RDMA_CONNECT_RUNNING))
433+
break;
432434
sc->status = SMBDIRECT_SOCKET_NEGOTIATE_NEEDED;
433435
wake_up(&sc->status_wait);
434436
break;
@@ -437,7 +439,6 @@ static int smbd_conn_upcall(
437439
case RDMA_CM_EVENT_UNREACHABLE:
438440
case RDMA_CM_EVENT_REJECTED:
439441
log_rdma_event(ERR, "connecting failed event=%s\n", event_name);
440-
WARN_ON_ONCE(sc->status != SMBDIRECT_SOCKET_RDMA_CONNECT_RUNNING);
441442
sc->status = SMBDIRECT_SOCKET_RDMA_CONNECT_FAILED;
442443
smbd_disconnect_rdma_work(&sc->disconnect_work);
443444
break;
@@ -699,7 +700,8 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
699700
negotiate_done =
700701
process_negotiation_response(response, wc->byte_len);
701702
put_receive_buffer(sc, response);
702-
WARN_ON_ONCE(sc->status != SMBDIRECT_SOCKET_NEGOTIATE_RUNNING);
703+
if (SMBDIRECT_CHECK_STATUS_WARN(sc, SMBDIRECT_SOCKET_NEGOTIATE_RUNNING))
704+
negotiate_done = false;
703705
if (!negotiate_done) {
704706
sc->status = SMBDIRECT_SOCKET_NEGOTIATE_FAILED;
705707
smbd_disconnect_rdma_connection(sc);

0 commit comments

Comments
 (0)