diff options
Diffstat (limited to 'net/tipc/socket.c')
-rw-r--r-- | net/tipc/socket.c | 51 |
1 files changed, 24 insertions, 27 deletions
diff --git a/net/tipc/socket.c b/net/tipc/socket.c index adb2eff4a102..9440a3d48ca0 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c | |||
@@ -49,7 +49,7 @@ struct tipc_sock { | |||
49 | struct sock sk; | 49 | struct sock sk; |
50 | struct tipc_port *p; | 50 | struct tipc_port *p; |
51 | struct tipc_portid peer_name; | 51 | struct tipc_portid peer_name; |
52 | long conn_timeout; | 52 | unsigned int conn_timeout; |
53 | }; | 53 | }; |
54 | 54 | ||
55 | #define tipc_sk(sk) ((struct tipc_sock *)(sk)) | 55 | #define tipc_sk(sk) ((struct tipc_sock *)(sk)) |
@@ -231,7 +231,7 @@ static int tipc_create(struct net *net, struct socket *sock, int protocol, | |||
231 | sock_init_data(sock, sk); | 231 | sock_init_data(sock, sk); |
232 | sk->sk_backlog_rcv = backlog_rcv; | 232 | sk->sk_backlog_rcv = backlog_rcv; |
233 | tipc_sk(sk)->p = tp_ptr; | 233 | tipc_sk(sk)->p = tp_ptr; |
234 | tipc_sk(sk)->conn_timeout = msecs_to_jiffies(CONN_TIMEOUT_DEFAULT); | 234 | tipc_sk(sk)->conn_timeout = CONN_TIMEOUT_DEFAULT; |
235 | 235 | ||
236 | spin_unlock_bh(tp_ptr->lock); | 236 | spin_unlock_bh(tp_ptr->lock); |
237 | 237 | ||
@@ -525,6 +525,7 @@ static int send_msg(struct kiocb *iocb, struct socket *sock, | |||
525 | struct tipc_port *tport = tipc_sk_port(sk); | 525 | struct tipc_port *tport = tipc_sk_port(sk); |
526 | struct sockaddr_tipc *dest = (struct sockaddr_tipc *)m->msg_name; | 526 | struct sockaddr_tipc *dest = (struct sockaddr_tipc *)m->msg_name; |
527 | int needs_conn; | 527 | int needs_conn; |
528 | long timeout_val; | ||
528 | int res = -EINVAL; | 529 | int res = -EINVAL; |
529 | 530 | ||
530 | if (unlikely(!dest)) | 531 | if (unlikely(!dest)) |
@@ -564,6 +565,8 @@ static int send_msg(struct kiocb *iocb, struct socket *sock, | |||
564 | reject_rx_queue(sk); | 565 | reject_rx_queue(sk); |
565 | } | 566 | } |
566 | 567 | ||
568 | timeout_val = sock_sndtimeo(sk, m->msg_flags & MSG_DONTWAIT); | ||
569 | |||
567 | do { | 570 | do { |
568 | if (dest->addrtype == TIPC_ADDR_NAME) { | 571 | if (dest->addrtype == TIPC_ADDR_NAME) { |
569 | res = dest_name_check(dest, m); | 572 | res = dest_name_check(dest, m); |
@@ -600,16 +603,14 @@ static int send_msg(struct kiocb *iocb, struct socket *sock, | |||
600 | sock->state = SS_CONNECTING; | 603 | sock->state = SS_CONNECTING; |
601 | break; | 604 | break; |
602 | } | 605 | } |
603 | if (m->msg_flags & MSG_DONTWAIT) { | 606 | if (timeout_val <= 0L) { |
604 | res = -EWOULDBLOCK; | 607 | res = timeout_val ? timeout_val : -EWOULDBLOCK; |
605 | break; | 608 | break; |
606 | } | 609 | } |
607 | release_sock(sk); | 610 | release_sock(sk); |
608 | res = wait_event_interruptible(*sk_sleep(sk), | 611 | timeout_val = wait_event_interruptible_timeout(*sk_sleep(sk), |
609 | !tport->congested); | 612 | !tport->congested, timeout_val); |
610 | lock_sock(sk); | 613 | lock_sock(sk); |
611 | if (res) | ||
612 | break; | ||
613 | } while (1); | 614 | } while (1); |
614 | 615 | ||
615 | exit: | 616 | exit: |
@@ -636,6 +637,7 @@ static int send_packet(struct kiocb *iocb, struct socket *sock, | |||
636 | struct sock *sk = sock->sk; | 637 | struct sock *sk = sock->sk; |
637 | struct tipc_port *tport = tipc_sk_port(sk); | 638 | struct tipc_port *tport = tipc_sk_port(sk); |
638 | struct sockaddr_tipc *dest = (struct sockaddr_tipc *)m->msg_name; | 639 | struct sockaddr_tipc *dest = (struct sockaddr_tipc *)m->msg_name; |
640 | long timeout_val; | ||
639 | int res; | 641 | int res; |
640 | 642 | ||
641 | /* Handle implied connection establishment */ | 643 | /* Handle implied connection establishment */ |
@@ -650,6 +652,8 @@ static int send_packet(struct kiocb *iocb, struct socket *sock, | |||
650 | if (iocb) | 652 | if (iocb) |
651 | lock_sock(sk); | 653 | lock_sock(sk); |
652 | 654 | ||
655 | timeout_val = sock_sndtimeo(sk, m->msg_flags & MSG_DONTWAIT); | ||
656 | |||
653 | do { | 657 | do { |
654 | if (unlikely(sock->state != SS_CONNECTED)) { | 658 | if (unlikely(sock->state != SS_CONNECTED)) { |
655 | if (sock->state == SS_DISCONNECTING) | 659 | if (sock->state == SS_DISCONNECTING) |
@@ -663,16 +667,14 @@ static int send_packet(struct kiocb *iocb, struct socket *sock, | |||
663 | total_len); | 667 | total_len); |
664 | if (likely(res != -ELINKCONG)) | 668 | if (likely(res != -ELINKCONG)) |
665 | break; | 669 | break; |
666 | if (m->msg_flags & MSG_DONTWAIT) { | 670 | if (timeout_val <= 0L) { |
667 | res = -EWOULDBLOCK; | 671 | res = timeout_val ? timeout_val : -EWOULDBLOCK; |
668 | break; | 672 | break; |
669 | } | 673 | } |
670 | release_sock(sk); | 674 | release_sock(sk); |
671 | res = wait_event_interruptible(*sk_sleep(sk), | 675 | timeout_val = wait_event_interruptible_timeout(*sk_sleep(sk), |
672 | (!tport->congested || !tport->connected)); | 676 | (!tport->congested || !tport->connected), timeout_val); |
673 | lock_sock(sk); | 677 | lock_sock(sk); |
674 | if (res) | ||
675 | break; | ||
676 | } while (1); | 678 | } while (1); |
677 | 679 | ||
678 | if (iocb) | 680 | if (iocb) |
@@ -1369,7 +1371,7 @@ static int connect(struct socket *sock, struct sockaddr *dest, int destlen, | |||
1369 | struct msghdr m = {NULL,}; | 1371 | struct msghdr m = {NULL,}; |
1370 | struct sk_buff *buf; | 1372 | struct sk_buff *buf; |
1371 | struct tipc_msg *msg; | 1373 | struct tipc_msg *msg; |
1372 | long timeout; | 1374 | unsigned int timeout; |
1373 | int res; | 1375 | int res; |
1374 | 1376 | ||
1375 | lock_sock(sk); | 1377 | lock_sock(sk); |
@@ -1434,7 +1436,8 @@ static int connect(struct socket *sock, struct sockaddr *dest, int destlen, | |||
1434 | res = wait_event_interruptible_timeout(*sk_sleep(sk), | 1436 | res = wait_event_interruptible_timeout(*sk_sleep(sk), |
1435 | (!skb_queue_empty(&sk->sk_receive_queue) || | 1437 | (!skb_queue_empty(&sk->sk_receive_queue) || |
1436 | (sock->state != SS_CONNECTING)), | 1438 | (sock->state != SS_CONNECTING)), |
1437 | timeout ? timeout : MAX_SCHEDULE_TIMEOUT); | 1439 | timeout ? (long)msecs_to_jiffies(timeout) |
1440 | : MAX_SCHEDULE_TIMEOUT); | ||
1438 | lock_sock(sk); | 1441 | lock_sock(sk); |
1439 | 1442 | ||
1440 | if (res > 0) { | 1443 | if (res > 0) { |
@@ -1480,9 +1483,7 @@ static int listen(struct socket *sock, int len) | |||
1480 | 1483 | ||
1481 | lock_sock(sk); | 1484 | lock_sock(sk); |
1482 | 1485 | ||
1483 | if (sock->state == SS_READY) | 1486 | if (sock->state != SS_UNCONNECTED) |
1484 | res = -EOPNOTSUPP; | ||
1485 | else if (sock->state != SS_UNCONNECTED) | ||
1486 | res = -EINVAL; | 1487 | res = -EINVAL; |
1487 | else { | 1488 | else { |
1488 | sock->state = SS_LISTENING; | 1489 | sock->state = SS_LISTENING; |
@@ -1510,10 +1511,6 @@ static int accept(struct socket *sock, struct socket *new_sock, int flags) | |||
1510 | 1511 | ||
1511 | lock_sock(sk); | 1512 | lock_sock(sk); |
1512 | 1513 | ||
1513 | if (sock->state == SS_READY) { | ||
1514 | res = -EOPNOTSUPP; | ||
1515 | goto exit; | ||
1516 | } | ||
1517 | if (sock->state != SS_LISTENING) { | 1514 | if (sock->state != SS_LISTENING) { |
1518 | res = -EINVAL; | 1515 | res = -EINVAL; |
1519 | goto exit; | 1516 | goto exit; |
@@ -1696,7 +1693,7 @@ static int setsockopt(struct socket *sock, | |||
1696 | res = tipc_set_portunreturnable(tport->ref, value); | 1693 | res = tipc_set_portunreturnable(tport->ref, value); |
1697 | break; | 1694 | break; |
1698 | case TIPC_CONN_TIMEOUT: | 1695 | case TIPC_CONN_TIMEOUT: |
1699 | tipc_sk(sk)->conn_timeout = msecs_to_jiffies(value); | 1696 | tipc_sk(sk)->conn_timeout = value; |
1700 | /* no need to set "res", since already 0 at this point */ | 1697 | /* no need to set "res", since already 0 at this point */ |
1701 | break; | 1698 | break; |
1702 | default: | 1699 | default: |
@@ -1752,7 +1749,7 @@ static int getsockopt(struct socket *sock, | |||
1752 | res = tipc_portunreturnable(tport->ref, &value); | 1749 | res = tipc_portunreturnable(tport->ref, &value); |
1753 | break; | 1750 | break; |
1754 | case TIPC_CONN_TIMEOUT: | 1751 | case TIPC_CONN_TIMEOUT: |
1755 | value = jiffies_to_msecs(tipc_sk(sk)->conn_timeout); | 1752 | value = tipc_sk(sk)->conn_timeout; |
1756 | /* no need to set "res", since already 0 at this point */ | 1753 | /* no need to set "res", since already 0 at this point */ |
1757 | break; | 1754 | break; |
1758 | case TIPC_NODE_RECVQ_DEPTH: | 1755 | case TIPC_NODE_RECVQ_DEPTH: |
@@ -1790,11 +1787,11 @@ static const struct proto_ops msg_ops = { | |||
1790 | .bind = bind, | 1787 | .bind = bind, |
1791 | .connect = connect, | 1788 | .connect = connect, |
1792 | .socketpair = sock_no_socketpair, | 1789 | .socketpair = sock_no_socketpair, |
1793 | .accept = accept, | 1790 | .accept = sock_no_accept, |
1794 | .getname = get_name, | 1791 | .getname = get_name, |
1795 | .poll = poll, | 1792 | .poll = poll, |
1796 | .ioctl = sock_no_ioctl, | 1793 | .ioctl = sock_no_ioctl, |
1797 | .listen = listen, | 1794 | .listen = sock_no_listen, |
1798 | .shutdown = shutdown, | 1795 | .shutdown = shutdown, |
1799 | .setsockopt = setsockopt, | 1796 | .setsockopt = setsockopt, |
1800 | .getsockopt = getsockopt, | 1797 | .getsockopt = getsockopt, |