@@ -2032,6 +2032,8 @@ static int smc_listen_prfx_check(struct smc_sock *new_smc,
2032
2032
if (pclc -> hdr .typev1 == SMC_TYPE_N )
2033
2033
return 0 ;
2034
2034
pclc_prfx = smc_clc_proposal_get_prefix (pclc );
2035
+ if (!pclc_prfx )
2036
+ return - EPROTO ;
2035
2037
if (smc_clc_prfx_match (newclcsock , pclc_prfx ))
2036
2038
return SMC_CLC_DECL_DIFFPREFIX ;
2037
2039
@@ -2145,6 +2147,8 @@ static void smc_find_ism_v2_device_serv(struct smc_sock *new_smc,
2145
2147
pclc_smcd = smc_get_clc_msg_smcd (pclc );
2146
2148
smc_v2_ext = smc_get_clc_v2_ext (pclc );
2147
2149
smcd_v2_ext = smc_get_clc_smcd_v2_ext (smc_v2_ext );
2150
+ if (!pclc_smcd || !smc_v2_ext || !smcd_v2_ext )
2151
+ goto not_found ;
2148
2152
2149
2153
mutex_lock (& smcd_dev_list .mutex );
2150
2154
if (pclc_smcd -> ism .chid ) {
@@ -2221,7 +2225,9 @@ static void smc_find_ism_v1_device_serv(struct smc_sock *new_smc,
2221
2225
int rc = 0 ;
2222
2226
2223
2227
/* check if ISM V1 is available */
2224
- if (!(ini -> smcd_version & SMC_V1 ) || !smcd_indicated (ini -> smc_type_v1 ))
2228
+ if (!(ini -> smcd_version & SMC_V1 ) ||
2229
+ !smcd_indicated (ini -> smc_type_v1 ) ||
2230
+ !pclc_smcd )
2225
2231
goto not_found ;
2226
2232
ini -> is_smcd = true; /* prepare ISM check */
2227
2233
ini -> ism_peer_gid [0 ].gid = ntohll (pclc_smcd -> ism .gid );
@@ -2272,7 +2278,8 @@ static void smc_find_rdma_v2_device_serv(struct smc_sock *new_smc,
2272
2278
goto not_found ;
2273
2279
2274
2280
smc_v2_ext = smc_get_clc_v2_ext (pclc );
2275
- if (!smc_clc_match_eid (ini -> negotiated_eid , smc_v2_ext , NULL , NULL ))
2281
+ if (!smc_v2_ext ||
2282
+ !smc_clc_match_eid (ini -> negotiated_eid , smc_v2_ext , NULL , NULL ))
2276
2283
goto not_found ;
2277
2284
2278
2285
/* prepare RDMA check */
@@ -2881,6 +2888,13 @@ __poll_t smc_poll(struct file *file, struct socket *sock,
2881
2888
} else {
2882
2889
sk_set_bit (SOCKWQ_ASYNC_NOSPACE , sk );
2883
2890
set_bit (SOCK_NOSPACE , & sk -> sk_socket -> flags );
2891
+
2892
+ if (sk -> sk_state != SMC_INIT ) {
2893
+ /* Race breaker the same way as tcp_poll(). */
2894
+ smp_mb__after_atomic ();
2895
+ if (atomic_read (& smc -> conn .sndbuf_space ))
2896
+ mask |= EPOLLOUT | EPOLLWRNORM ;
2897
+ }
2884
2898
}
2885
2899
if (atomic_read (& smc -> conn .bytes_to_rcv ))
2886
2900
mask |= EPOLLIN | EPOLLRDNORM ;
0 commit comments