|
@@ -1480,6 +1480,14 @@ static int o2net_set_nodelay(struct socket *sock)
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+static int o2net_set_usertimeout(struct socket *sock)
|
|
|
+{
|
|
|
+ int user_timeout = O2NET_TCP_USER_TIMEOUT;
|
|
|
+
|
|
|
+ return kernel_setsockopt(sock, SOL_TCP, TCP_USER_TIMEOUT,
|
|
|
+ (char *)&user_timeout, sizeof(user_timeout));
|
|
|
+}
|
|
|
+
|
|
|
static void o2net_initialize_handshake(void)
|
|
|
{
|
|
|
o2net_hand->o2hb_heartbeat_timeout_ms = cpu_to_be32(
|
|
@@ -1663,6 +1671,12 @@ static void o2net_start_connect(struct work_struct *work)
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
+ ret = o2net_set_usertimeout(sock);
|
|
|
+ if (ret) {
|
|
|
+ mlog(ML_ERROR, "set TCP_USER_TIMEOUT failed with %d\n", ret);
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
o2net_register_callbacks(sc->sc_sock->sk, sc);
|
|
|
|
|
|
spin_lock(&nn->nn_lock);
|
|
@@ -1844,6 +1858,12 @@ static int o2net_accept_one(struct socket *sock, int *more)
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
+ ret = o2net_set_usertimeout(new_sock);
|
|
|
+ if (ret) {
|
|
|
+ mlog(ML_ERROR, "set TCP_USER_TIMEOUT failed with %d\n", ret);
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
slen = sizeof(sin);
|
|
|
ret = new_sock->ops->getname(new_sock, (struct sockaddr *) &sin,
|
|
|
&slen, 1);
|