Skip to content

Commit

Permalink
drbd: pull prepare_listen_socket() out of drbd_wait_for_connect()
Browse files Browse the repository at this point in the history
Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
  • Loading branch information
Philipp Reisner committed Nov 8, 2012
1 parent 9a51ab1 commit 1f3e509
Showing 1 changed file with 46 additions and 14 deletions.
60 changes: 46 additions & 14 deletions drivers/block/drbd/drbd_receiver.c
Original file line number Diff line number Diff line change
Expand Up @@ -666,12 +666,11 @@ static struct socket *drbd_try_connect(struct drbd_tconn *tconn)
return sock;
}

static struct socket *drbd_wait_for_connect(struct drbd_tconn *tconn)
static struct socket *prepare_listen_socket(struct drbd_tconn *tconn)
{
int timeo, err, my_addr_len;
int sndbuf_size, rcvbuf_size, connect_int;
struct socket *s_estab = NULL, *s_listen;
int err, sndbuf_size, rcvbuf_size, my_addr_len;
struct sockaddr_in6 my_addr;
struct socket *s_listen;
struct net_conf *nc;
const char *what;

Expand All @@ -683,26 +682,20 @@ static struct socket *drbd_wait_for_connect(struct drbd_tconn *tconn)
}
sndbuf_size = nc->sndbuf_size;
rcvbuf_size = nc->rcvbuf_size;
connect_int = nc->connect_int;
rcu_read_unlock();

my_addr_len = min_t(int, tconn->my_addr_len, sizeof(struct sockaddr_in6));
memcpy(&my_addr, &tconn->my_addr, my_addr_len);

what = "sock_create_kern";
err = sock_create_kern(((struct sockaddr *)&my_addr)->sa_family,
SOCK_STREAM, IPPROTO_TCP, &s_listen);
SOCK_STREAM, IPPROTO_TCP, &s_listen);
if (err) {
s_listen = NULL;
goto out;
}

timeo = connect_int * HZ;
timeo += (random32() & 1) ? timeo / 7 : -timeo / 7; /* 28.5% random jitter */

s_listen->sk->sk_reuse = 1; /* SO_REUSEADDR */
s_listen->sk->sk_rcvtimeo = timeo;
s_listen->sk->sk_sndtimeo = timeo;
s_listen->sk->sk_reuse = 1; /* SO_REUSEADDR */
drbd_setbufsize(s_listen, sndbuf_size, rcvbuf_size);

what = "bind before listen";
Expand All @@ -715,15 +708,54 @@ static struct socket *drbd_wait_for_connect(struct drbd_tconn *tconn)
if (err < 0)
goto out;

what = "accept";
return s_listen;
out:
if (s_listen)
sock_release(s_listen);
if (err < 0) {
if (err != -EAGAIN && err != -EINTR && err != -ERESTARTSYS) {
conn_err(tconn, "%s failed, err = %d\n", what, err);
conn_request_state(tconn, NS(conn, C_DISCONNECTING), CS_HARD);
}
}

return NULL;
}

static struct socket *drbd_wait_for_connect(struct drbd_tconn *tconn)
{
int timeo, connect_int, err = 0;
struct socket *s_estab = NULL;
struct socket *s_listen;
struct net_conf *nc;

rcu_read_lock();
nc = rcu_dereference(tconn->net_conf);
if (!nc) {
rcu_read_unlock();
return NULL;
}
connect_int = nc->connect_int;
rcu_read_unlock();

timeo = connect_int * HZ;
timeo += (random32() & 1) ? timeo / 7 : -timeo / 7; /* 28.5% random jitter */

s_listen = prepare_listen_socket(tconn);
if (!s_listen)
goto out;

s_listen->sk->sk_rcvtimeo = timeo;
s_listen->sk->sk_sndtimeo = timeo;

err = kernel_accept(s_listen, &s_estab, 0);

out:
if (s_listen)
sock_release(s_listen);
if (err < 0) {
if (err != -EAGAIN && err != -EINTR && err != -ERESTARTSYS) {
conn_err(tconn, "%s failed, err = %d\n", what, err);
conn_err(tconn, "accept failed, err = %d\n", err);
conn_request_state(tconn, NS(conn, C_DISCONNECTING), CS_HARD);
}
}
Expand Down

0 comments on commit 1f3e509

Please sign in to comment.