Skip to content

Commit 1b83099

Browse files
committed
Merge branch 's390-net'
Ursula Braun says: ==================== s390: af_iucv patches here are 2 patches for the s390-only af_iucv socket family code. ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents b07bf5f + 8c68b1a commit 1b83099

File tree

1 file changed

+26
-8
lines changed

1 file changed

+26
-8
lines changed

net/iucv/af_iucv.c

+26-8
Original file line numberDiff line numberDiff line change
@@ -453,19 +453,27 @@ static void iucv_sever_path(struct sock *sk, int with_user_data)
453453
}
454454
}
455455

456-
/* Send FIN through an IUCV socket for HIPER transport */
456+
/* Send controlling flags through an IUCV socket for HIPER transport */
457457
static int iucv_send_ctrl(struct sock *sk, u8 flags)
458458
{
459459
int err = 0;
460460
int blen;
461461
struct sk_buff *skb;
462+
u8 shutdown = 0;
462463

463464
blen = sizeof(struct af_iucv_trans_hdr) + ETH_HLEN;
465+
if (sk->sk_shutdown & SEND_SHUTDOWN) {
466+
/* controlling flags should be sent anyway */
467+
shutdown = sk->sk_shutdown;
468+
sk->sk_shutdown &= RCV_SHUTDOWN;
469+
}
464470
skb = sock_alloc_send_skb(sk, blen, 1, &err);
465471
if (skb) {
466472
skb_reserve(skb, blen);
467473
err = afiucv_hs_send(NULL, sk, skb, flags);
468474
}
475+
if (shutdown)
476+
sk->sk_shutdown = shutdown;
469477
return err;
470478
}
471479

@@ -1315,8 +1323,13 @@ static void iucv_process_message(struct sock *sk, struct sk_buff *skb,
13151323
}
13161324

13171325
IUCV_SKB_CB(skb)->offset = 0;
1318-
if (sock_queue_rcv_skb(sk, skb))
1319-
skb_queue_head(&iucv_sk(sk)->backlog_skb_q, skb);
1326+
if (sk_filter(sk, skb)) {
1327+
atomic_inc(&sk->sk_drops); /* skb rejected by filter */
1328+
kfree_skb(skb);
1329+
return;
1330+
}
1331+
if (__sock_queue_rcv_skb(sk, skb)) /* handle rcv queue full */
1332+
skb_queue_tail(&iucv_sk(sk)->backlog_skb_q, skb);
13201333
}
13211334

13221335
/* iucv_process_message_q() - Process outstanding IUCV messages
@@ -1430,13 +1443,13 @@ static int iucv_sock_recvmsg(struct socket *sock, struct msghdr *msg,
14301443
rskb = skb_dequeue(&iucv->backlog_skb_q);
14311444
while (rskb) {
14321445
IUCV_SKB_CB(rskb)->offset = 0;
1433-
if (sock_queue_rcv_skb(sk, rskb)) {
1446+
if (__sock_queue_rcv_skb(sk, rskb)) {
1447+
/* handle rcv queue full */
14341448
skb_queue_head(&iucv->backlog_skb_q,
14351449
rskb);
14361450
break;
1437-
} else {
1438-
rskb = skb_dequeue(&iucv->backlog_skb_q);
14391451
}
1452+
rskb = skb_dequeue(&iucv->backlog_skb_q);
14401453
}
14411454
if (skb_queue_empty(&iucv->backlog_skb_q)) {
14421455
if (!list_empty(&iucv->message_q.list))
@@ -2116,12 +2129,17 @@ static int afiucv_hs_callback_rx(struct sock *sk, struct sk_buff *skb)
21162129
skb_reset_transport_header(skb);
21172130
skb_reset_network_header(skb);
21182131
IUCV_SKB_CB(skb)->offset = 0;
2132+
if (sk_filter(sk, skb)) {
2133+
atomic_inc(&sk->sk_drops); /* skb rejected by filter */
2134+
kfree_skb(skb);
2135+
return NET_RX_SUCCESS;
2136+
}
2137+
21192138
spin_lock(&iucv->message_q.lock);
21202139
if (skb_queue_empty(&iucv->backlog_skb_q)) {
2121-
if (sock_queue_rcv_skb(sk, skb)) {
2140+
if (__sock_queue_rcv_skb(sk, skb))
21222141
/* handle rcv queue full */
21232142
skb_queue_tail(&iucv->backlog_skb_q, skb);
2124-
}
21252143
} else
21262144
skb_queue_tail(&iucv_sk(sk)->backlog_skb_q, skb);
21272145
spin_unlock(&iucv->message_q.lock);

0 commit comments

Comments
 (0)