Skip to content

Commit 81d0b75

Browse files
committed
Merge branch 'net-smc-fixes'
Ursula Braun says: ==================== net/smc: fixes 2018-09-18 here are some fixes in different areas of the smc code for the net tree. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
2 parents 2fe397a + 3818977 commit 81d0b75

File tree

3 files changed

+29
-25
lines changed

3 files changed

+29
-25
lines changed

net/smc/af_smc.c

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -742,7 +742,10 @@ static void smc_connect_work(struct work_struct *work)
742742
smc->sk.sk_err = -rc;
743743

744744
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);
746749
kfree(smc->connect_info);
747750
smc->connect_info = NULL;
748751
release_sock(&smc->sk);
@@ -1150,9 +1153,9 @@ static int smc_listen_rdma_reg(struct smc_sock *new_smc, int local_contact)
11501153
}
11511154

11521155
/* 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)
11561159
{
11571160
struct smc_link *link = &new_smc->conn.lgr->lnk[SMC_SINGLE_LINK];
11581161
int reason_code = 0;
@@ -1175,11 +1178,12 @@ static void smc_listen_rdma_finish(struct smc_sock *new_smc,
11751178
if (reason_code)
11761179
goto decline;
11771180
}
1178-
return;
1181+
return 0;
11791182

11801183
decline:
11811184
mutex_unlock(&smc_create_lgr_pending);
11821185
smc_listen_decline(new_smc, reason_code, local_contact);
1186+
return reason_code;
11831187
}
11841188

11851189
/* setup for RDMA connection of server */
@@ -1276,8 +1280,10 @@ static void smc_listen_work(struct work_struct *work)
12761280
}
12771281

12781282
/* 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+
}
12811287
smc_conn_save_peer_info(new_smc, &cclc);
12821288
mutex_unlock(&smc_create_lgr_pending);
12831289
smc_listen_out_connected(new_smc);
@@ -1529,7 +1535,7 @@ static __poll_t smc_poll(struct file *file, struct socket *sock,
15291535
return EPOLLNVAL;
15301536

15311537
smc = smc_sk(sock->sk);
1532-
if ((sk->sk_state == SMC_INIT) || smc->use_fallback) {
1538+
if (smc->use_fallback) {
15331539
/* delegate to CLC child sock */
15341540
mask = smc->clcsock->ops->poll(file, smc->clcsock, wait);
15351541
sk->sk_err = smc->clcsock->sk->sk_err;
@@ -1560,9 +1566,9 @@ static __poll_t smc_poll(struct file *file, struct socket *sock,
15601566
mask |= EPOLLIN | EPOLLRDNORM | EPOLLRDHUP;
15611567
if (sk->sk_state == SMC_APPCLOSEWAIT1)
15621568
mask |= EPOLLIN;
1569+
if (smc->conn.urg_state == SMC_URG_VALID)
1570+
mask |= EPOLLPRI;
15631571
}
1564-
if (smc->conn.urg_state == SMC_URG_VALID)
1565-
mask |= EPOLLPRI;
15661572
}
15671573

15681574
return mask;

net/smc/smc_clc.c

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -446,14 +446,12 @@ int smc_clc_send_proposal(struct smc_sock *smc, int smc_type,
446446
vec[i++].iov_len = sizeof(trl);
447447
/* due to the few bytes needed for clc-handshake this cannot block */
448448
len = kernel_sendmsg(smc->clcsock, &msg, vec, i, plen);
449-
if (len < sizeof(pclc)) {
450-
if (len >= 0) {
451-
reason_code = -ENETUNREACH;
452-
smc->sk.sk_err = -reason_code;
453-
} else {
454-
smc->sk.sk_err = smc->clcsock->sk->sk_err;
455-
reason_code = -smc->sk.sk_err;
456-
}
449+
if (len < 0) {
450+
smc->sk.sk_err = smc->clcsock->sk->sk_err;
451+
reason_code = -smc->sk.sk_err;
452+
} else if (len < (int)sizeof(pclc)) {
453+
reason_code = -ENETUNREACH;
454+
smc->sk.sk_err = -reason_code;
457455
}
458456

459457
return reason_code;

net/smc/smc_close.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -100,15 +100,14 @@ static void smc_close_active_abort(struct smc_sock *smc)
100100
struct smc_cdc_conn_state_flags *txflags =
101101
&smc->conn.local_tx_ctrl.conn_state_flags;
102102

103-
sk->sk_err = ECONNABORTED;
104-
if (smc->clcsock && smc->clcsock->sk) {
105-
smc->clcsock->sk->sk_err = ECONNABORTED;
106-
smc->clcsock->sk->sk_state_change(smc->clcsock->sk);
103+
if (sk->sk_state != SMC_INIT && smc->clcsock && smc->clcsock->sk) {
104+
sk->sk_err = ECONNABORTED;
105+
if (smc->clcsock && smc->clcsock->sk) {
106+
smc->clcsock->sk->sk_err = ECONNABORTED;
107+
smc->clcsock->sk->sk_state_change(smc->clcsock->sk);
108+
}
107109
}
108110
switch (sk->sk_state) {
109-
case SMC_INIT:
110-
sk->sk_state = SMC_PEERABORTWAIT;
111-
break;
112111
case SMC_ACTIVE:
113112
sk->sk_state = SMC_PEERABORTWAIT;
114113
release_sock(sk);
@@ -143,6 +142,7 @@ static void smc_close_active_abort(struct smc_sock *smc)
143142
case SMC_PEERFINCLOSEWAIT:
144143
sock_put(sk); /* passive closing */
145144
break;
145+
case SMC_INIT:
146146
case SMC_PEERABORTWAIT:
147147
case SMC_CLOSED:
148148
break;

0 commit comments

Comments
 (0)