The commit is pushed to "branch-rh7-3.10.0-327.28.2.vz7.17.x-ovz" and will 
appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-327.28.2.vz7.17.6
------>
commit 9a3d0a0422a5f5e4a8b551f8a5a9cdf9c41c6a54
Author: Kirill Tkhai <ktk...@virtuozzo.com>
Date:   Fri Sep 16 17:46:56 2016 +0400

    net: nf_synproxy: Direct conntrack allocation
    
    Since synproxy conntrack allow_conntrack_allocation() is executed
    from pernet init, loading nf_synproxy_core() module allows conntracks
    for all nets.
    
    Fix that by direct allocation of synproxy sample conntrack (and do not
    allow conntracks from pernet init).
    
    https://jira.sw.ru/browse/PSBM-52218
    
    Signed-off-by: Kirill Tkhai <ktk...@virtuozzo.com>
    Acked-by: Andrei Vagin <ava...@virtuozzo.com>
---
 include/net/netfilter/nf_conntrack.h |  5 +++++
 net/netfilter/nf_conntrack_core.c    | 11 ++++++-----
 net/netfilter/nf_synproxy_core.c     |  3 +--
 3 files changed, 12 insertions(+), 7 deletions(-)

diff --git a/include/net/netfilter/nf_conntrack.h 
b/include/net/netfilter/nf_conntrack.h
index b0da003..fefe866 100644
--- a/include/net/netfilter/nf_conntrack.h
+++ b/include/net/netfilter/nf_conntrack.h
@@ -253,6 +253,11 @@ struct nf_conn *nf_conntrack_alloc(struct net *net, u16 
zone,
                                   const struct nf_conntrack_tuple *orig,
                                   const struct nf_conntrack_tuple *repl,
                                   gfp_t gfp);
+struct nf_conn *
+__nf_conntrack_alloc(struct net *net, u16 zone,
+                    const struct nf_conntrack_tuple *orig,
+                    const struct nf_conntrack_tuple *repl,
+                    gfp_t gfp, u32 hash, bool can_alloc);
 
 static inline int nf_ct_is_template(const struct nf_conn *ct)
 {
diff --git a/net/netfilter/nf_conntrack_core.c 
b/net/netfilter/nf_conntrack_core.c
index 15e8479..d46c905 100644
--- a/net/netfilter/nf_conntrack_core.c
+++ b/net/netfilter/nf_conntrack_core.c
@@ -832,16 +832,16 @@ void init_nf_conntrack_hash_rnd(void)
        cmpxchg(&nf_conntrack_hash_rnd, 0, rand);
 }
 
-static struct nf_conn *
+struct nf_conn *
 __nf_conntrack_alloc(struct net *net, u16 zone,
                     const struct nf_conntrack_tuple *orig,
                     const struct nf_conntrack_tuple *repl,
-                    gfp_t gfp, u32 hash)
+                    gfp_t gfp, u32 hash, bool can_alloc)
 {
        unsigned int ct_max = net->ct.max ? net->ct.max : init_net.ct.max;
        struct nf_conn *ct;
 
-       if (!net->ct.can_alloc) {
+       if (!net->ct.can_alloc && !can_alloc) {
                /* No rules loaded */
                return NULL;
        }
@@ -915,13 +915,14 @@ out_free:
        return ERR_PTR(-ENOMEM);
 #endif
 }
+EXPORT_SYMBOL_GPL(__nf_conntrack_alloc);
 
 struct nf_conn *nf_conntrack_alloc(struct net *net, u16 zone,
                                   const struct nf_conntrack_tuple *orig,
                                   const struct nf_conntrack_tuple *repl,
                                   gfp_t gfp)
 {
-       return __nf_conntrack_alloc(net, zone, orig, repl, gfp, 0);
+       return __nf_conntrack_alloc(net, zone, orig, repl, gfp, 0, false);
 }
 EXPORT_SYMBOL_GPL(nf_conntrack_alloc);
 
@@ -968,7 +969,7 @@ init_conntrack(struct net *net, struct nf_conn *tmpl,
        }
 
        ct = __nf_conntrack_alloc(net, zone, tuple, &repl_tuple, GFP_ATOMIC,
-                                 hash);
+                                 hash, false);
        if (IS_ERR_OR_NULL(ct))
                return (struct nf_conntrack_tuple_hash *)ct;
 
diff --git a/net/netfilter/nf_synproxy_core.c b/net/netfilter/nf_synproxy_core.c
index 779e5a6..3184505 100644
--- a/net/netfilter/nf_synproxy_core.c
+++ b/net/netfilter/nf_synproxy_core.c
@@ -353,8 +353,7 @@ static int __net_init synproxy_net_init(struct net *net)
        int err = -ENOMEM;
 
        memset(&t, 0, sizeof(t));
-       allow_conntrack_allocation(net);
-       ct = nf_conntrack_alloc(net, 0, &t, &t, GFP_KERNEL);
+       ct = __nf_conntrack_alloc(net, 0, &t, &t, GFP_KERNEL, 0, true);
        if (IS_ERR(ct)) {
                err = PTR_ERR(ct);
                goto err1;
_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to