@@ -742,7 +742,10 @@ static void smc_connect_work(struct work_struct *work)
742
742
smc -> sk .sk_err = - rc ;
743
743
744
744
out :
745
- smc -> sk .sk_state_change (& smc -> sk );
745
+ if (smc -> sk .sk_err )
746
+ smc -> sk .sk_state_change (& smc -> sk );
747
+ else
748
+ smc -> sk .sk_write_space (& smc -> sk );
746
749
kfree (smc -> connect_info );
747
750
smc -> connect_info = NULL ;
748
751
release_sock (& smc -> sk );
@@ -1150,9 +1153,9 @@ static int smc_listen_rdma_reg(struct smc_sock *new_smc, int local_contact)
1150
1153
}
1151
1154
1152
1155
/* listen worker: finish RDMA setup */
1153
- static void smc_listen_rdma_finish (struct smc_sock * new_smc ,
1154
- struct smc_clc_msg_accept_confirm * cclc ,
1155
- int local_contact )
1156
+ static int smc_listen_rdma_finish (struct smc_sock * new_smc ,
1157
+ struct smc_clc_msg_accept_confirm * cclc ,
1158
+ int local_contact )
1156
1159
{
1157
1160
struct smc_link * link = & new_smc -> conn .lgr -> lnk [SMC_SINGLE_LINK ];
1158
1161
int reason_code = 0 ;
@@ -1175,11 +1178,12 @@ static void smc_listen_rdma_finish(struct smc_sock *new_smc,
1175
1178
if (reason_code )
1176
1179
goto decline ;
1177
1180
}
1178
- return ;
1181
+ return 0 ;
1179
1182
1180
1183
decline :
1181
1184
mutex_unlock (& smc_create_lgr_pending );
1182
1185
smc_listen_decline (new_smc , reason_code , local_contact );
1186
+ return reason_code ;
1183
1187
}
1184
1188
1185
1189
/* setup for RDMA connection of server */
@@ -1276,8 +1280,10 @@ static void smc_listen_work(struct work_struct *work)
1276
1280
}
1277
1281
1278
1282
/* finish worker */
1279
- if (!ism_supported )
1280
- smc_listen_rdma_finish (new_smc , & cclc , local_contact );
1283
+ if (!ism_supported ) {
1284
+ if (smc_listen_rdma_finish (new_smc , & cclc , local_contact ))
1285
+ return ;
1286
+ }
1281
1287
smc_conn_save_peer_info (new_smc , & cclc );
1282
1288
mutex_unlock (& smc_create_lgr_pending );
1283
1289
smc_listen_out_connected (new_smc );
@@ -1529,7 +1535,7 @@ static __poll_t smc_poll(struct file *file, struct socket *sock,
1529
1535
return EPOLLNVAL ;
1530
1536
1531
1537
smc = smc_sk (sock -> sk );
1532
- if (( sk -> sk_state == SMC_INIT ) || smc -> use_fallback ) {
1538
+ if (smc -> use_fallback ) {
1533
1539
/* delegate to CLC child sock */
1534
1540
mask = smc -> clcsock -> ops -> poll (file , smc -> clcsock , wait );
1535
1541
sk -> sk_err = smc -> clcsock -> sk -> sk_err ;
@@ -1560,9 +1566,9 @@ static __poll_t smc_poll(struct file *file, struct socket *sock,
1560
1566
mask |= EPOLLIN | EPOLLRDNORM | EPOLLRDHUP ;
1561
1567
if (sk -> sk_state == SMC_APPCLOSEWAIT1 )
1562
1568
mask |= EPOLLIN ;
1569
+ if (smc -> conn .urg_state == SMC_URG_VALID )
1570
+ mask |= EPOLLPRI ;
1563
1571
}
1564
- if (smc -> conn .urg_state == SMC_URG_VALID )
1565
- mask |= EPOLLPRI ;
1566
1572
}
1567
1573
1568
1574
return mask ;
0 commit comments