Skip to content

Commit 0491f26

Browse files
metze-sambasmfrench
authored andcommitted
smb: server: let {free_transport,smb_direct_disconnect_rdma_{work,connection}}() wake up all wait queues
This is important in order to let all waiters notice a broken connection. We also go via smb_direct_disconnect_rdma_{work,connection}() for broken connections. Acked-by: Namjae Jeon <linkinjeon@kernel.org> Cc: Steve French <smfrench@gmail.com> Cc: Tom Talpey <tom@talpey.com> Cc: linux-cifs@vger.kernel.org Cc: samba-technical@lists.samba.org Signed-off-by: Stefan Metzmacher <metze@samba.org> Signed-off-by: Steve French <stfrench@microsoft.com>
1 parent 7d729df commit 0491f26

1 file changed

Lines changed: 34 additions & 6 deletions

File tree

fs/smb/server/transport_rdma.c

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,19 @@ static struct smbdirect_recv_io *get_first_reassembly(struct smbdirect_socket *s
207207
return NULL;
208208
}
209209

210+
static void smb_direct_disconnect_wake_up_all(struct smbdirect_socket *sc)
211+
{
212+
/*
213+
* Wake up all waiters in all wait queues
214+
* in order to notice the broken connection.
215+
*/
216+
wake_up_all(&sc->status_wait);
217+
wake_up_all(&sc->send_io.credits.wait_queue);
218+
wake_up_all(&sc->send_io.pending.zero_wait_queue);
219+
wake_up_all(&sc->recv_io.reassembly.wait_queue);
220+
wake_up_all(&sc->rw_io.credits.wait_queue);
221+
}
222+
210223
static void smb_direct_disconnect_rdma_work(struct work_struct *work)
211224
{
212225
struct smbdirect_socket *sc =
@@ -257,6 +270,12 @@ static void smb_direct_disconnect_rdma_work(struct work_struct *work)
257270
case SMBDIRECT_SOCKET_DESTROYED:
258271
break;
259272
}
273+
274+
/*
275+
* Wake up all waiters in all wait queues
276+
* in order to notice the broken connection.
277+
*/
278+
smb_direct_disconnect_wake_up_all(sc);
260279
}
261280

262281
static void
@@ -314,6 +333,12 @@ smb_direct_disconnect_rdma_connection(struct smbdirect_socket *sc)
314333
break;
315334
}
316335

336+
/*
337+
* Wake up all waiters in all wait queues
338+
* in order to notice the broken connection.
339+
*/
340+
smb_direct_disconnect_wake_up_all(sc);
341+
317342
queue_work(sc->workqueue, &sc->disconnect_work);
318343
}
319344

@@ -421,8 +446,14 @@ static void free_transport(struct smb_direct_transport *t)
421446
sc->status == SMBDIRECT_SOCKET_DISCONNECTED);
422447
}
423448

424-
wake_up_all(&sc->send_io.credits.wait_queue);
425-
wake_up_all(&sc->send_io.pending.zero_wait_queue);
449+
/*
450+
* Wake up all waiters in all wait queues
451+
* in order to notice the broken connection.
452+
*
453+
* Most likely this was already called via
454+
* smb_direct_disconnect_rdma_work(), but call it again...
455+
*/
456+
smb_direct_disconnect_wake_up_all(sc);
426457

427458
disable_work_sync(&sc->recv_io.posted.refill_work);
428459
disable_delayed_work_sync(&sc->idle.timer_work);
@@ -1644,14 +1675,11 @@ static int smb_direct_cm_handler(struct rdma_cm_id *cm_id,
16441675

16451676
sc->status = SMBDIRECT_SOCKET_DISCONNECTED;
16461677
smb_direct_disconnect_rdma_work(&sc->disconnect_work);
1647-
wake_up_all(&sc->status_wait);
1648-
wake_up_all(&sc->recv_io.reassembly.wait_queue);
1649-
wake_up_all(&sc->send_io.credits.wait_queue);
16501678
break;
16511679
}
16521680
case RDMA_CM_EVENT_CONNECT_ERROR: {
16531681
sc->status = SMBDIRECT_SOCKET_DISCONNECTED;
1654-
wake_up_all(&sc->status_wait);
1682+
smb_direct_disconnect_rdma_work(&sc->disconnect_work);
16551683
break;
16561684
}
16571685
default:

0 commit comments

Comments
 (0)