@@ -161,9 +161,36 @@ static void smbd_disconnect_rdma_work(struct work_struct *work)
161161 container_of (work , struct smbd_connection , disconnect_work );
162162 struct smbdirect_socket * sc = & info -> socket ;
163163
164- if (sc -> status == SMBDIRECT_SOCKET_CONNECTED ) {
164+ switch (sc -> status ) {
165+ case SMBDIRECT_SOCKET_NEGOTIATE_NEEDED :
166+ case SMBDIRECT_SOCKET_NEGOTIATE_RUNNING :
167+ case SMBDIRECT_SOCKET_NEGOTIATE_FAILED :
168+ case SMBDIRECT_SOCKET_CONNECTED :
165169 sc -> status = SMBDIRECT_SOCKET_DISCONNECTING ;
166170 rdma_disconnect (sc -> rdma .cm_id );
171+ break ;
172+
173+ case SMBDIRECT_SOCKET_CREATED :
174+ case SMBDIRECT_SOCKET_RESOLVE_ADDR_NEEDED :
175+ case SMBDIRECT_SOCKET_RESOLVE_ADDR_RUNNING :
176+ case SMBDIRECT_SOCKET_RESOLVE_ADDR_FAILED :
177+ case SMBDIRECT_SOCKET_RESOLVE_ROUTE_NEEDED :
178+ case SMBDIRECT_SOCKET_RESOLVE_ROUTE_RUNNING :
179+ case SMBDIRECT_SOCKET_RESOLVE_ROUTE_FAILED :
180+ case SMBDIRECT_SOCKET_RDMA_CONNECT_NEEDED :
181+ case SMBDIRECT_SOCKET_RDMA_CONNECT_RUNNING :
182+ case SMBDIRECT_SOCKET_RDMA_CONNECT_FAILED :
183+ /*
184+ * rdma_connect() never reached
185+ * RDMA_CM_EVENT_ESTABLISHED
186+ */
187+ sc -> status = SMBDIRECT_SOCKET_DISCONNECTED ;
188+ break ;
189+
190+ case SMBDIRECT_SOCKET_DISCONNECTING :
191+ case SMBDIRECT_SOCKET_DISCONNECTED :
192+ case SMBDIRECT_SOCKET_DESTROYED :
193+ break ;
167194 }
168195}
169196
@@ -187,19 +214,31 @@ static int smbd_conn_upcall(
187214
188215 switch (event -> event ) {
189216 case RDMA_CM_EVENT_ADDR_RESOLVED :
217+ WARN_ON_ONCE (sc -> status != SMBDIRECT_SOCKET_RESOLVE_ADDR_RUNNING );
218+ sc -> status = SMBDIRECT_SOCKET_RESOLVE_ROUTE_NEEDED ;
219+ info -> ri_rc = 0 ;
220+ complete (& info -> ri_done );
221+ break ;
222+
190223 case RDMA_CM_EVENT_ROUTE_RESOLVED :
224+ WARN_ON_ONCE (sc -> status != SMBDIRECT_SOCKET_RESOLVE_ROUTE_RUNNING );
225+ sc -> status = SMBDIRECT_SOCKET_RDMA_CONNECT_NEEDED ;
191226 info -> ri_rc = 0 ;
192227 complete (& info -> ri_done );
193228 break ;
194229
195230 case RDMA_CM_EVENT_ADDR_ERROR :
196231 log_rdma_event (ERR , "connecting failed event=%s\n" , event_name );
232+ WARN_ON_ONCE (sc -> status != SMBDIRECT_SOCKET_RESOLVE_ADDR_RUNNING );
233+ sc -> status = SMBDIRECT_SOCKET_RESOLVE_ADDR_FAILED ;
197234 info -> ri_rc = - EHOSTUNREACH ;
198235 complete (& info -> ri_done );
199236 break ;
200237
201238 case RDMA_CM_EVENT_ROUTE_ERROR :
202239 log_rdma_event (ERR , "connecting failed event=%s\n" , event_name );
240+ WARN_ON_ONCE (sc -> status != SMBDIRECT_SOCKET_RESOLVE_ROUTE_RUNNING );
241+ sc -> status = SMBDIRECT_SOCKET_RESOLVE_ROUTE_FAILED ;
203242 info -> ri_rc = - ENETUNREACH ;
204243 complete (& info -> ri_done );
205244 break ;
@@ -285,15 +324,17 @@ static int smbd_conn_upcall(
285324 min_t (u8 , info -> responder_resources ,
286325 peer_responder_resources );
287326
288- sc -> status = SMBDIRECT_SOCKET_CONNECTED ;
327+ WARN_ON_ONCE (sc -> status != SMBDIRECT_SOCKET_RDMA_CONNECT_RUNNING );
328+ sc -> status = SMBDIRECT_SOCKET_NEGOTIATE_NEEDED ;
289329 wake_up_interruptible (& info -> status_wait );
290330 break ;
291331
292332 case RDMA_CM_EVENT_CONNECT_ERROR :
293333 case RDMA_CM_EVENT_UNREACHABLE :
294334 case RDMA_CM_EVENT_REJECTED :
295335 log_rdma_event (ERR , "connecting failed event=%s\n" , event_name );
296- sc -> status = SMBDIRECT_SOCKET_DISCONNECTED ;
336+ WARN_ON_ONCE (sc -> status != SMBDIRECT_SOCKET_RDMA_CONNECT_RUNNING );
337+ sc -> status = SMBDIRECT_SOCKET_RDMA_CONNECT_FAILED ;
297338 wake_up_interruptible (& info -> status_wait );
298339 break ;
299340
@@ -565,6 +606,12 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
565606 info -> negotiate_done =
566607 process_negotiation_response (response , wc -> byte_len );
567608 put_receive_buffer (info , response );
609+ WARN_ON_ONCE (sc -> status != SMBDIRECT_SOCKET_NEGOTIATE_RUNNING );
610+ if (!info -> negotiate_done )
611+ sc -> status = SMBDIRECT_SOCKET_NEGOTIATE_FAILED ;
612+ else
613+ sc -> status = SMBDIRECT_SOCKET_CONNECTED ;
614+
568615 complete (& info -> negotiate_completion );
569616 return ;
570617
@@ -655,6 +702,7 @@ static struct rdma_cm_id *smbd_create_id(
655702 struct smbd_connection * info ,
656703 struct sockaddr * dstaddr , int port )
657704{
705+ struct smbdirect_socket * sc = & info -> socket ;
658706 struct rdma_cm_id * id ;
659707 int rc ;
660708 __be16 * sport ;
@@ -677,6 +725,8 @@ static struct rdma_cm_id *smbd_create_id(
677725 init_completion (& info -> ri_done );
678726 info -> ri_rc = - ETIMEDOUT ;
679727
728+ WARN_ON_ONCE (sc -> status != SMBDIRECT_SOCKET_RESOLVE_ADDR_NEEDED );
729+ sc -> status = SMBDIRECT_SOCKET_RESOLVE_ADDR_RUNNING ;
680730 rc = rdma_resolve_addr (id , NULL , (struct sockaddr * )dstaddr ,
681731 RDMA_RESOLVE_TIMEOUT );
682732 if (rc ) {
@@ -697,6 +747,8 @@ static struct rdma_cm_id *smbd_create_id(
697747 }
698748
699749 info -> ri_rc = - ETIMEDOUT ;
750+ WARN_ON_ONCE (sc -> status != SMBDIRECT_SOCKET_RESOLVE_ROUTE_NEEDED );
751+ sc -> status = SMBDIRECT_SOCKET_RESOLVE_ROUTE_RUNNING ;
700752 rc = rdma_resolve_route (id , RDMA_RESOLVE_TIMEOUT );
701753 if (rc ) {
702754 log_rdma_event (ERR , "rdma_resolve_route() failed %i\n" , rc );
@@ -743,6 +795,9 @@ static int smbd_ia_open(
743795 struct smbdirect_socket * sc = & info -> socket ;
744796 int rc ;
745797
798+ WARN_ON_ONCE (sc -> status != SMBDIRECT_SOCKET_CREATED );
799+ sc -> status = SMBDIRECT_SOCKET_RESOLVE_ADDR_NEEDED ;
800+
746801 sc -> rdma .cm_id = smbd_create_id (info , dstaddr , port );
747802 if (IS_ERR (sc -> rdma .cm_id )) {
748803 rc = PTR_ERR (sc -> rdma .cm_id );
@@ -1184,6 +1239,9 @@ static int smbd_negotiate(struct smbd_connection *info)
11841239 int rc ;
11851240 struct smbdirect_recv_io * response = get_receive_buffer (info );
11861241
1242+ WARN_ON_ONCE (sc -> status != SMBDIRECT_SOCKET_NEGOTIATE_NEEDED );
1243+ sc -> status = SMBDIRECT_SOCKET_NEGOTIATE_RUNNING ;
1244+
11871245 sc -> recv_io .expected = SMBDIRECT_EXPECT_NEGOTIATE_REP ;
11881246 rc = smbd_post_recv (info , response );
11891247 log_rdma_event (INFO , "smbd_post_recv rc=%d iov.addr=0x%llx iov.length=%u iov.lkey=0x%x\n" ,
@@ -1643,7 +1701,7 @@ static struct smbd_connection *_smbd_get_connection(
16431701 info -> initiator_depth = 1 ;
16441702 info -> responder_resources = SMBD_CM_RESPONDER_RESOURCES ;
16451703
1646- sc -> status = SMBDIRECT_SOCKET_CONNECTING ;
1704+ sc -> status = SMBDIRECT_SOCKET_CREATED ;
16471705 rc = smbd_ia_open (info , dstaddr , port );
16481706 if (rc ) {
16491707 log_rdma_event (INFO , "smbd_ia_open rc=%d\n" , rc );
@@ -1755,6 +1813,9 @@ static struct smbd_connection *_smbd_get_connection(
17551813
17561814 init_waitqueue_head (& info -> status_wait );
17571815 init_waitqueue_head (& sc -> recv_io .reassembly .wait_queue );
1816+
1817+ WARN_ON_ONCE (sc -> status != SMBDIRECT_SOCKET_RDMA_CONNECT_NEEDED );
1818+ sc -> status = SMBDIRECT_SOCKET_RDMA_CONNECT_RUNNING ;
17581819 rc = rdma_connect (sc -> rdma .cm_id , & conn_param );
17591820 if (rc ) {
17601821 log_rdma_event (ERR , "rdma_connect() failed with %i\n" , rc );
@@ -1763,10 +1824,10 @@ static struct smbd_connection *_smbd_get_connection(
17631824
17641825 wait_event_interruptible_timeout (
17651826 info -> status_wait ,
1766- sc -> status != SMBDIRECT_SOCKET_CONNECTING ,
1827+ sc -> status != SMBDIRECT_SOCKET_RDMA_CONNECT_RUNNING ,
17671828 msecs_to_jiffies (RDMA_RESOLVE_TIMEOUT ));
17681829
1769- if (sc -> status != SMBDIRECT_SOCKET_CONNECTED ) {
1830+ if (sc -> status != SMBDIRECT_SOCKET_NEGOTIATE_NEEDED ) {
17701831 log_rdma_event (ERR , "rdma_connect failed port=%d\n" , port );
17711832 goto rdma_connect_failed ;
17721833 }
0 commit comments