mirror of
https://github.com/checkpoint-restore/criu.git
synced 2026-07-26 03:25:30 +00:00
restore: don't desable tcp repair mode twice
TCP repair mode should be disabled after unlocking connections. Disabling of repair mode drops SO_REUSEADDR, so it should be restored. Signed-off-by: Andrey Vagin <avagin@openvz.org> Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
This commit is contained in:
parent
effe3294d9
commit
b1abc3b21c
5 changed files with 36 additions and 15 deletions
|
|
@ -122,7 +122,7 @@ struct task_restore_core_args {
|
|||
int nr_rlim;
|
||||
struct rlimit rlims[RLIM_NLIMITS];
|
||||
|
||||
int *rst_tcp_socks;
|
||||
struct rst_tcp_sock *rst_tcp_socks;
|
||||
int rst_tcp_socks_size;
|
||||
} __aligned(sizeof(long));
|
||||
|
||||
|
|
|
|||
|
|
@ -45,6 +45,11 @@ struct inet_sk_info {
|
|||
int inet_bind(int sk, struct inet_sk_info *);
|
||||
int inet_connect(int sk, struct inet_sk_info *);
|
||||
|
||||
struct rst_tcp_sock {
|
||||
int sk;
|
||||
bool reuseaddr;
|
||||
};
|
||||
|
||||
static inline void tcp_repair_off(int fd)
|
||||
{
|
||||
int aux = 0;
|
||||
|
|
|
|||
|
|
@ -274,15 +274,26 @@ static u64 restore_mapping(const VmaEntry *vma_entry)
|
|||
return addr;
|
||||
}
|
||||
|
||||
static void rst_tcp_socks_all(int *arr, int size)
|
||||
static void rst_tcp_repair_off(struct rst_tcp_sock *rts)
|
||||
{
|
||||
int aux;
|
||||
|
||||
tcp_repair_off(rts->sk);
|
||||
|
||||
aux = rts->reuseaddr;
|
||||
if (sys_setsockopt(rts->sk, SOL_SOCKET, SO_REUSEADDR, &aux, sizeof(aux)) < 0)
|
||||
pr_perror("Failed to restore of SO_REUSEADDR on socket");
|
||||
}
|
||||
|
||||
static void rst_tcp_socks_all(struct rst_tcp_sock *arr, int size)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (size == 0)
|
||||
return;
|
||||
|
||||
for (i =0; arr[i] >= 0; i++)
|
||||
tcp_repair_off(arr[i]);
|
||||
for (i =0; arr[i].sk >= 0; i++)
|
||||
rst_tcp_repair_off(arr + i);
|
||||
|
||||
sys_munmap(arr, size);
|
||||
}
|
||||
|
|
|
|||
13
sk-inet.c
13
sk-inet.c
|
|
@ -439,16 +439,19 @@ static int post_open_inet_sk(struct file_desc *d, int sk)
|
|||
|
||||
ii = container_of(d, struct inet_sk_info, d);
|
||||
|
||||
/*
|
||||
* TCP sockets are handled at the last moment
|
||||
* after unlocking connections.
|
||||
*/
|
||||
if (tcp_connection(ii->ie))
|
||||
return 0;
|
||||
|
||||
/* SO_REUSEADDR is set for all sockets */
|
||||
if (!tcp_connection(ii->ie) && ii->ie->opts->reuseaddr)
|
||||
if (ii->ie->opts->reuseaddr)
|
||||
return 0;
|
||||
|
||||
futex_wait_until(&ii->port->users, 0);
|
||||
|
||||
/* Disabling repair mode drops SO_REUSEADDR */
|
||||
if (tcp_connection(ii->ie))
|
||||
tcp_repair_off(sk);
|
||||
|
||||
val = ii->ie->opts->reuseaddr;
|
||||
if (restore_opt(sk, SOL_SOCKET, SO_REUSEADDR, &val))
|
||||
return -1;
|
||||
|
|
|
|||
14
sk-tcp.c
14
sk-tcp.c
|
|
@ -520,7 +520,7 @@ err:
|
|||
* rst_tcp_socks contains sockets in repair mode,
|
||||
* which will be off in restorer before resuming.
|
||||
*/
|
||||
static int *rst_tcp_socks = NULL;
|
||||
static struct rst_tcp_sock *rst_tcp_socks = NULL;
|
||||
static int rst_tcp_socks_num = 0;
|
||||
int rst_tcp_socks_size = 0;
|
||||
|
||||
|
|
@ -532,7 +532,7 @@ int rst_tcp_socks_remap(void *addr)
|
|||
return 0;
|
||||
}
|
||||
|
||||
rst_tcp_socks[rst_tcp_socks_num] = -1;
|
||||
rst_tcp_socks[rst_tcp_socks_num].sk = -1;
|
||||
|
||||
ret = mmap(addr, rst_tcp_socks_size, PROT_READ | PROT_WRITE,
|
||||
MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0);
|
||||
|
|
@ -547,17 +547,19 @@ int rst_tcp_socks_remap(void *addr)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int rst_tcp_socks_add(int fd)
|
||||
static int rst_tcp_socks_add(int fd, bool reuseaddr)
|
||||
{
|
||||
/* + 2 = ( new one + guard (-1) ) */
|
||||
if ((rst_tcp_socks_num + 2) * sizeof(int) > rst_tcp_socks_size) {
|
||||
if ((rst_tcp_socks_num + 2) * sizeof(struct rst_tcp_sock) > rst_tcp_socks_size) {
|
||||
rst_tcp_socks_size += PAGE_SIZE;
|
||||
rst_tcp_socks = xrealloc(rst_tcp_socks, rst_tcp_socks_size);
|
||||
if (rst_tcp_socks == NULL)
|
||||
return -1;
|
||||
}
|
||||
|
||||
rst_tcp_socks[rst_tcp_socks_num++] = fd;
|
||||
rst_tcp_socks[rst_tcp_socks_num].sk = fd;
|
||||
rst_tcp_socks[rst_tcp_socks_num].reuseaddr = reuseaddr;
|
||||
rst_tcp_socks_num++;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -568,7 +570,7 @@ int restore_one_tcp(int fd, struct inet_sk_info *ii)
|
|||
if (tcp_repair_on(fd))
|
||||
return -1;
|
||||
|
||||
if (rst_tcp_socks_add(fd))
|
||||
if (rst_tcp_socks_add(fd, ii->ie->opts->reuseaddr))
|
||||
return -1;
|
||||
|
||||
if (restore_tcp_conn_state(fd, ii))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue