mirror of
https://github.com/adulau/aha.git
synced 2024-12-28 11:46:19 +00:00
af_iucv: Change if condition in sendmsg() for more readability
Change the if condition to exit sendmsg() if the socket in not connected. Signed-off-by: Hendrik Brueckner <brueckner@linux.vnet.ibm.com> Signed-off-by: Ursula Braun <ursula.braun@de.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
cb2107be43
commit
bb664f49f8
1 changed files with 87 additions and 88 deletions
|
@ -747,108 +747,107 @@ static int iucv_sock_sendmsg(struct kiocb *iocb, struct socket *sock,
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sk->sk_state == IUCV_CONNECTED) {
|
/* Return if the socket is not in connected state */
|
||||||
/* initialize defaults */
|
if (sk->sk_state != IUCV_CONNECTED) {
|
||||||
cmsg_done = 0; /* check for duplicate headers */
|
err = -ENOTCONN;
|
||||||
txmsg.class = 0;
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
/* iterate over control messages */
|
/* initialize defaults */
|
||||||
for (cmsg = CMSG_FIRSTHDR(msg); cmsg;
|
cmsg_done = 0; /* check for duplicate headers */
|
||||||
cmsg = CMSG_NXTHDR(msg, cmsg)) {
|
txmsg.class = 0;
|
||||||
|
|
||||||
if (!CMSG_OK(msg, cmsg)) {
|
/* iterate over control messages */
|
||||||
err = -EINVAL;
|
for (cmsg = CMSG_FIRSTHDR(msg); cmsg;
|
||||||
goto out;
|
cmsg = CMSG_NXTHDR(msg, cmsg)) {
|
||||||
}
|
|
||||||
|
|
||||||
if (cmsg->cmsg_level != SOL_IUCV)
|
if (!CMSG_OK(msg, cmsg)) {
|
||||||
continue;
|
err = -EINVAL;
|
||||||
|
|
||||||
if (cmsg->cmsg_type & cmsg_done) {
|
|
||||||
err = -EINVAL;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
cmsg_done |= cmsg->cmsg_type;
|
|
||||||
|
|
||||||
switch (cmsg->cmsg_type) {
|
|
||||||
case SCM_IUCV_TRGCLS:
|
|
||||||
if (cmsg->cmsg_len != CMSG_LEN(TRGCLS_SIZE)) {
|
|
||||||
err = -EINVAL;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* set iucv message target class */
|
|
||||||
memcpy(&txmsg.class,
|
|
||||||
(void *) CMSG_DATA(cmsg), TRGCLS_SIZE);
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
err = -EINVAL;
|
|
||||||
goto out;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* allocate one skb for each iucv message:
|
|
||||||
* this is fine for SOCK_SEQPACKET (unless we want to support
|
|
||||||
* segmented records using the MSG_EOR flag), but
|
|
||||||
* for SOCK_STREAM we might want to improve it in future */
|
|
||||||
if (!(skb = sock_alloc_send_skb(sk, len,
|
|
||||||
msg->msg_flags & MSG_DONTWAIT,
|
|
||||||
&err)))
|
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (memcpy_fromiovec(skb_put(skb, len), msg->msg_iov, len)) {
|
|
||||||
err = -EFAULT;
|
|
||||||
goto fail;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* increment and save iucv message tag for msg_completion cbk */
|
if (cmsg->cmsg_level != SOL_IUCV)
|
||||||
txmsg.tag = iucv->send_tag++;
|
continue;
|
||||||
memcpy(CB_TAG(skb), &txmsg.tag, CB_TAG_LEN);
|
|
||||||
skb_queue_tail(&iucv->send_skb_q, skb);
|
|
||||||
|
|
||||||
if (((iucv->path->flags & IUCV_IPRMDATA) & iucv->flags)
|
if (cmsg->cmsg_type & cmsg_done) {
|
||||||
&& skb->len <= 7) {
|
err = -EINVAL;
|
||||||
err = iucv_send_iprm(iucv->path, &txmsg, skb);
|
goto out;
|
||||||
|
}
|
||||||
|
cmsg_done |= cmsg->cmsg_type;
|
||||||
|
|
||||||
/* on success: there is no message_complete callback
|
switch (cmsg->cmsg_type) {
|
||||||
* for an IPRMDATA msg; remove skb from send queue */
|
case SCM_IUCV_TRGCLS:
|
||||||
if (err == 0) {
|
if (cmsg->cmsg_len != CMSG_LEN(TRGCLS_SIZE)) {
|
||||||
skb_unlink(skb, &iucv->send_skb_q);
|
err = -EINVAL;
|
||||||
kfree_skb(skb);
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* this error should never happen since the
|
/* set iucv message target class */
|
||||||
* IUCV_IPRMDATA path flag is set... sever path */
|
memcpy(&txmsg.class,
|
||||||
if (err == 0x15) {
|
(void *) CMSG_DATA(cmsg), TRGCLS_SIZE);
|
||||||
iucv_path_sever(iucv->path, NULL);
|
|
||||||
skb_unlink(skb, &iucv->send_skb_q);
|
break;
|
||||||
err = -EPIPE;
|
|
||||||
goto fail;
|
default:
|
||||||
}
|
err = -EINVAL;
|
||||||
} else
|
goto out;
|
||||||
err = iucv_message_send(iucv->path, &txmsg, 0, 0,
|
break;
|
||||||
(void *) skb->data, skb->len);
|
}
|
||||||
if (err) {
|
}
|
||||||
if (err == 3) {
|
|
||||||
user_id[8] = 0;
|
/* allocate one skb for each iucv message:
|
||||||
memcpy(user_id, iucv->dst_user_id, 8);
|
* this is fine for SOCK_SEQPACKET (unless we want to support
|
||||||
appl_id[8] = 0;
|
* segmented records using the MSG_EOR flag), but
|
||||||
memcpy(appl_id, iucv->dst_name, 8);
|
* for SOCK_STREAM we might want to improve it in future */
|
||||||
pr_err("Application %s on z/VM guest %s"
|
skb = sock_alloc_send_skb(sk, len, msg->msg_flags & MSG_DONTWAIT,
|
||||||
" exceeds message limit\n",
|
&err);
|
||||||
user_id, appl_id);
|
if (!skb)
|
||||||
}
|
goto out;
|
||||||
|
if (memcpy_fromiovec(skb_put(skb, len), msg->msg_iov, len)) {
|
||||||
|
err = -EFAULT;
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* increment and save iucv message tag for msg_completion cbk */
|
||||||
|
txmsg.tag = iucv->send_tag++;
|
||||||
|
memcpy(CB_TAG(skb), &txmsg.tag, CB_TAG_LEN);
|
||||||
|
skb_queue_tail(&iucv->send_skb_q, skb);
|
||||||
|
|
||||||
|
if (((iucv->path->flags & IUCV_IPRMDATA) & iucv->flags)
|
||||||
|
&& skb->len <= 7) {
|
||||||
|
err = iucv_send_iprm(iucv->path, &txmsg, skb);
|
||||||
|
|
||||||
|
/* on success: there is no message_complete callback
|
||||||
|
* for an IPRMDATA msg; remove skb from send queue */
|
||||||
|
if (err == 0) {
|
||||||
|
skb_unlink(skb, &iucv->send_skb_q);
|
||||||
|
kfree_skb(skb);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* this error should never happen since the
|
||||||
|
* IUCV_IPRMDATA path flag is set... sever path */
|
||||||
|
if (err == 0x15) {
|
||||||
|
iucv_path_sever(iucv->path, NULL);
|
||||||
skb_unlink(skb, &iucv->send_skb_q);
|
skb_unlink(skb, &iucv->send_skb_q);
|
||||||
err = -EPIPE;
|
err = -EPIPE;
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
} else
|
||||||
} else {
|
err = iucv_message_send(iucv->path, &txmsg, 0, 0,
|
||||||
err = -ENOTCONN;
|
(void *) skb->data, skb->len);
|
||||||
goto out;
|
if (err) {
|
||||||
|
if (err == 3) {
|
||||||
|
user_id[8] = 0;
|
||||||
|
memcpy(user_id, iucv->dst_user_id, 8);
|
||||||
|
appl_id[8] = 0;
|
||||||
|
memcpy(appl_id, iucv->dst_name, 8);
|
||||||
|
pr_err("Application %s on z/VM guest %s"
|
||||||
|
" exceeds message limit\n",
|
||||||
|
appl_id, user_id);
|
||||||
|
}
|
||||||
|
skb_unlink(skb, &iucv->send_skb_q);
|
||||||
|
err = -EPIPE;
|
||||||
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
release_sock(sk);
|
release_sock(sk);
|
||||||
|
|
Loading…
Reference in a new issue