diff -NurpP linux-3.7-vs2.3.5.1/kernel/vserver/network.c linux-3.7-vs2.3.5.1.1/kernel/vserver/network.c --- linux-3.7-vs2.3.5.1/kernel/vserver/network.c 2012-12-11 15:56:33.000000000 +0000 +++ linux-3.7-vs2.3.5.1.1/kernel/vserver/network.c 2012-12-13 13:48:35.000000000 +0000 @@ -804,6 +818,31 @@ int do_add_v6_addr(struct nx_info *nxi, return 0; } +int do_remove_v6_addr(struct nx_info *nxi, + struct in6_addr *ip, struct in6_addr *mask, + uint32_t prefix, uint16_t type, uint16_t flags) +{ + struct nx_addr_v6 *nxa = &nxi->v6; + struct nx_addr_v6 *old = NULL; + int ret = 0; + + spin_lock(&nxi->addr_lock); + switch (type) { +/* case NXA_TYPE_ADDR: + break; */ + + case NXA_TYPE_ANY: + old = xchg(&nxa->next, NULL); + memset(nxa, 0, sizeof(*nxa)); + break; + + default: + ret = -EINVAL; + } + spin_unlock(&nxi->addr_lock); + __dealloc_nx_addr_v6_all(old); + return ret; +} int vc_net_add_ipv6(struct nx_info *nxi, void __user *data) { @@ -831,10 +873,8 @@ int vc_net_remove_ipv6(struct nx_info *n switch (vc_data.type) { case NXA_TYPE_ANY: - __dealloc_nx_addr_v6_all(xchg(&nxi->v6.next, NULL)); - memset(&nxi->v6, 0, sizeof(nxi->v6)); + do_remove_v6_addr(nxi, NULL, NULL, 0, vc_data.type, 0); break; - default: return -EINVAL; }