Skip to content

Commit

Permalink
tipc: Prevent rounding issues when saving connect timeout option
Browse files Browse the repository at this point in the history
Saves a socket's TIPC_CONN_TIMEOUT socket option value in its original
form (milliseconds), rather than jiffies. This ensures that the exact
value set using setsockopt() is always returned by getsockopt(), without
being subject to rounding issues introduced by a ms->jiffies->ms
conversion sequence.

Signed-off-by: Allan Stephens <[email protected]>
Signed-off-by: Paul Gortmaker <[email protected]>
  • Loading branch information
ajstephens authored and Paul Gortmaker committed Sep 1, 2011
1 parent ff60af8 commit a0f40f0
Showing 1 changed file with 7 additions and 6 deletions.
13 changes: 7 additions & 6 deletions net/tipc/socket.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ struct tipc_sock {
struct sock sk;
struct tipc_port *p;
struct tipc_portid peer_name;
long conn_timeout;
unsigned int conn_timeout;
};

#define tipc_sk(sk) ((struct tipc_sock *)(sk))
Expand Down Expand Up @@ -231,7 +231,7 @@ static int tipc_create(struct net *net, struct socket *sock, int protocol,
sock_init_data(sock, sk);
sk->sk_backlog_rcv = backlog_rcv;
tipc_sk(sk)->p = tp_ptr;
tipc_sk(sk)->conn_timeout = msecs_to_jiffies(CONN_TIMEOUT_DEFAULT);
tipc_sk(sk)->conn_timeout = CONN_TIMEOUT_DEFAULT;

spin_unlock_bh(tp_ptr->lock);

Expand Down Expand Up @@ -1369,7 +1369,7 @@ static int connect(struct socket *sock, struct sockaddr *dest, int destlen,
struct msghdr m = {NULL,};
struct sk_buff *buf;
struct tipc_msg *msg;
long timeout;
unsigned int timeout;
int res;

lock_sock(sk);
Expand Down Expand Up @@ -1434,7 +1434,8 @@ static int connect(struct socket *sock, struct sockaddr *dest, int destlen,
res = wait_event_interruptible_timeout(*sk_sleep(sk),
(!skb_queue_empty(&sk->sk_receive_queue) ||
(sock->state != SS_CONNECTING)),
timeout ? timeout : MAX_SCHEDULE_TIMEOUT);
timeout ? (long)msecs_to_jiffies(timeout)
: MAX_SCHEDULE_TIMEOUT);
lock_sock(sk);

if (res > 0) {
Expand Down Expand Up @@ -1696,7 +1697,7 @@ static int setsockopt(struct socket *sock,
res = tipc_set_portunreturnable(tport->ref, value);
break;
case TIPC_CONN_TIMEOUT:
tipc_sk(sk)->conn_timeout = msecs_to_jiffies(value);
tipc_sk(sk)->conn_timeout = value;
/* no need to set "res", since already 0 at this point */
break;
default:
Expand Down Expand Up @@ -1752,7 +1753,7 @@ static int getsockopt(struct socket *sock,
res = tipc_portunreturnable(tport->ref, &value);
break;
case TIPC_CONN_TIMEOUT:
value = jiffies_to_msecs(tipc_sk(sk)->conn_timeout);
value = tipc_sk(sk)->conn_timeout;
/* no need to set "res", since already 0 at this point */
break;
case TIPC_NODE_RECVQ_DEPTH:
Expand Down

0 comments on commit a0f40f0

Please sign in to comment.