netfilter-devel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* netfilter 00/02: netfilter fixes
@ 2008-10-30  7:31 Patrick McHardy
  2008-10-30  7:31 ` netns 01/02: add register_pernet_gen_subsys/unregister_pernet_gen_subsys Patrick McHardy
  2008-10-30  7:31 ` netfilter 02/02: nf_conntrack_proto_gre: switch to register_pernet_gen_subsys() Patrick McHardy
  0 siblings, 2 replies; 5+ messages in thread
From: Patrick McHardy @ 2008-10-30  7:31 UTC (permalink / raw)
  To: davem; +Cc: netdev, Patrick McHardy, netfilter-devel

Hi Dave,

the following two patches contain the GRE conntrack netns fix for an
oops on unload from Alexey and the preparatory patch, introducing
register_pernet_gen_subsys/unregister_pernet_gen_subsys.

Please apply, thanks.


 include/net/net_namespace.h            |    2 ++
 net/core/net_namespace.c               |   32 ++++++++++++++++++++++++++++++++
 net/netfilter/nf_conntrack_proto_gre.c |    4 ++--
 3 files changed, 36 insertions(+), 2 deletions(-)

Alexey Dobriyan (2):
      netns: add register_pernet_gen_subsys/unregister_pernet_gen_subsys
      netfilter: nf_conntrack_proto_gre: switch to register_pernet_gen_subsys()

^ permalink raw reply	[flat|nested] 5+ messages in thread

* netns 01/02: add register_pernet_gen_subsys/unregister_pernet_gen_subsys
  2008-10-30  7:31 netfilter 00/02: netfilter fixes Patrick McHardy
@ 2008-10-30  7:31 ` Patrick McHardy
  2008-10-31  6:55   ` David Miller
  2008-10-30  7:31 ` netfilter 02/02: nf_conntrack_proto_gre: switch to register_pernet_gen_subsys() Patrick McHardy
  1 sibling, 1 reply; 5+ messages in thread
From: Patrick McHardy @ 2008-10-30  7:31 UTC (permalink / raw)
  To: davem; +Cc: netdev, Patrick McHardy, netfilter-devel

commit 616b16ca5561a4cb0fc6796ebf551e11636a3156
Author: Alexey Dobriyan <adobriyan@gmail.com>
Date:   Thu Oct 30 08:15:35 2008 +0100

    netns: add register_pernet_gen_subsys/unregister_pernet_gen_subsys
    
    netns ops which are registered with register_pernet_gen_device() are
    shutdown strictly before those which are registered with
    register_pernet_subsys(). Sometimes this leads to opposite (read: buggy)
    shutdown ordering between two modules.
    
    Add register_pernet_gen_subsys()/unregister_pernet_gen_subsys() for modules
    which aren't elite enough for entry in struct net, and which can't use
    register_pernet_gen_device(). PPTP conntracking module is such one.
    
    Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
    Signed-off-by: Patrick McHardy <kaber@trash.net>

diff --git a/include/net/net_namespace.h b/include/net/net_namespace.h
index 708009b..700c53a 100644
--- a/include/net/net_namespace.h
+++ b/include/net/net_namespace.h
@@ -214,6 +214,8 @@ struct pernet_operations {
 
 extern int register_pernet_subsys(struct pernet_operations *);
 extern void unregister_pernet_subsys(struct pernet_operations *);
+extern int register_pernet_gen_subsys(int *id, struct pernet_operations *);
+extern void unregister_pernet_gen_subsys(int id, struct pernet_operations *);
 extern int register_pernet_device(struct pernet_operations *);
 extern void unregister_pernet_device(struct pernet_operations *);
 extern int register_pernet_gen_device(int *id, struct pernet_operations *);
diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c
index f1d07b5..1895a4c 100644
--- a/net/core/net_namespace.c
+++ b/net/core/net_namespace.c
@@ -325,6 +325,38 @@ void unregister_pernet_subsys(struct pernet_operations *module)
 }
 EXPORT_SYMBOL_GPL(unregister_pernet_subsys);
 
+int register_pernet_gen_subsys(int *id, struct pernet_operations *ops)
+{
+	int rv;
+
+	mutex_lock(&net_mutex);
+again:
+	rv = ida_get_new_above(&net_generic_ids, 1, id);
+	if (rv < 0) {
+		if (rv == -EAGAIN) {
+			ida_pre_get(&net_generic_ids, GFP_KERNEL);
+			goto again;
+		}
+		goto out;
+	}
+	rv = register_pernet_operations(first_device, ops);
+	if (rv < 0)
+		ida_remove(&net_generic_ids, *id);
+	mutex_unlock(&net_mutex);
+out:
+	return rv;
+}
+EXPORT_SYMBOL_GPL(register_pernet_gen_subsys);
+
+void unregister_pernet_gen_subsys(int id, struct pernet_operations *ops)
+{
+	mutex_lock(&net_mutex);
+	unregister_pernet_operations(ops);
+	ida_remove(&net_generic_ids, id);
+	mutex_unlock(&net_mutex);
+}
+EXPORT_SYMBOL_GPL(unregister_pernet_gen_subsys);
+
 /**
  *      register_pernet_device - register a network namespace device
  *	@ops:  pernet operations structure for the subsystem

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* netfilter 02/02: nf_conntrack_proto_gre: switch to register_pernet_gen_subsys()
  2008-10-30  7:31 netfilter 00/02: netfilter fixes Patrick McHardy
  2008-10-30  7:31 ` netns 01/02: add register_pernet_gen_subsys/unregister_pernet_gen_subsys Patrick McHardy
@ 2008-10-30  7:31 ` Patrick McHardy
  2008-10-31  6:55   ` David Miller
  1 sibling, 1 reply; 5+ messages in thread
From: Patrick McHardy @ 2008-10-30  7:31 UTC (permalink / raw)
  To: davem; +Cc: netdev, Patrick McHardy, netfilter-devel

commit fd0e558a126650fa335acaacc42e697cc84deb12
Author: Alexey Dobriyan <adobriyan@gmail.com>
Date:   Thu Oct 30 08:15:36 2008 +0100

    netfilter: nf_conntrack_proto_gre: switch to register_pernet_gen_subsys()
    
    register_pernet_gen_device() can't be used is nf_conntrack_pptp module is
    also used (compiled in or loaded).
    
    Right now, proto_gre_net_exit() is called before nf_conntrack_pptp_net_exit().
    The former shutdowns and frees GRE piece of netns, however the latter
    absolutely needs it to flush keymap. Oops is inevitable.
    
    Switch to shiny new register_pernet_gen_subsys() to get correct ordering in
    netns ops list.
    
    Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
    Signed-off-by: Patrick McHardy <kaber@trash.net>

diff --git a/net/netfilter/nf_conntrack_proto_gre.c b/net/netfilter/nf_conntrack_proto_gre.c
index a2cdbcb..4ab62ad 100644
--- a/net/netfilter/nf_conntrack_proto_gre.c
+++ b/net/netfilter/nf_conntrack_proto_gre.c
@@ -335,7 +335,7 @@ static int __init nf_ct_proto_gre_init(void)
 	rv = nf_conntrack_l4proto_register(&nf_conntrack_l4proto_gre4);
 	if (rv < 0)
 		return rv;
-	rv = register_pernet_gen_device(&proto_gre_net_id, &proto_gre_net_ops);
+	rv = register_pernet_gen_subsys(&proto_gre_net_id, &proto_gre_net_ops);
 	if (rv < 0)
 		nf_conntrack_l4proto_unregister(&nf_conntrack_l4proto_gre4);
 	return rv;
@@ -344,7 +344,7 @@ static int __init nf_ct_proto_gre_init(void)
 static void nf_ct_proto_gre_fini(void)
 {
 	nf_conntrack_l4proto_unregister(&nf_conntrack_l4proto_gre4);
-	unregister_pernet_gen_device(proto_gre_net_id, &proto_gre_net_ops);
+	unregister_pernet_gen_subsys(proto_gre_net_id, &proto_gre_net_ops);
 }
 
 module_init(nf_ct_proto_gre_init);

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: netns 01/02: add register_pernet_gen_subsys/unregister_pernet_gen_subsys
  2008-10-30  7:31 ` netns 01/02: add register_pernet_gen_subsys/unregister_pernet_gen_subsys Patrick McHardy
@ 2008-10-31  6:55   ` David Miller
  0 siblings, 0 replies; 5+ messages in thread
From: David Miller @ 2008-10-31  6:55 UTC (permalink / raw)
  To: kaber; +Cc: netdev, netfilter-devel

From: Patrick McHardy <kaber@trash.net>
Date: Thu, 30 Oct 2008 08:31:46 +0100 (MET)

>     netns: add register_pernet_gen_subsys/unregister_pernet_gen_subsys
>     
>     netns ops which are registered with register_pernet_gen_device() are
>     shutdown strictly before those which are registered with
>     register_pernet_subsys(). Sometimes this leads to opposite (read: buggy)
>     shutdown ordering between two modules.
>     
>     Add register_pernet_gen_subsys()/unregister_pernet_gen_subsys() for modules
>     which aren't elite enough for entry in struct net, and which can't use
>     register_pernet_gen_device(). PPTP conntracking module is such one.
>     
>     Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
>     Signed-off-by: Patrick McHardy <kaber@trash.net>

Applied.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: netfilter 02/02: nf_conntrack_proto_gre: switch to register_pernet_gen_subsys()
  2008-10-30  7:31 ` netfilter 02/02: nf_conntrack_proto_gre: switch to register_pernet_gen_subsys() Patrick McHardy
@ 2008-10-31  6:55   ` David Miller
  0 siblings, 0 replies; 5+ messages in thread
From: David Miller @ 2008-10-31  6:55 UTC (permalink / raw)
  To: kaber; +Cc: netdev, netfilter-devel

From: Patrick McHardy <kaber@trash.net>
Date: Thu, 30 Oct 2008 08:31:47 +0100 (MET)

>     netfilter: nf_conntrack_proto_gre: switch to register_pernet_gen_subsys()
>     
>     register_pernet_gen_device() can't be used is nf_conntrack_pptp module is
>     also used (compiled in or loaded).
>     
>     Right now, proto_gre_net_exit() is called before nf_conntrack_pptp_net_exit().
>     The former shutdowns and frees GRE piece of netns, however the latter
>     absolutely needs it to flush keymap. Oops is inevitable.
>     
>     Switch to shiny new register_pernet_gen_subsys() to get correct ordering in
>     netns ops list.
>     
>     Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
>     Signed-off-by: Patrick McHardy <kaber@trash.net>

Also applied, thanks.

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2008-10-31  6:56 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-10-30  7:31 netfilter 00/02: netfilter fixes Patrick McHardy
2008-10-30  7:31 ` netns 01/02: add register_pernet_gen_subsys/unregister_pernet_gen_subsys Patrick McHardy
2008-10-31  6:55   ` David Miller
2008-10-30  7:31 ` netfilter 02/02: nf_conntrack_proto_gre: switch to register_pernet_gen_subsys() Patrick McHardy
2008-10-31  6:55   ` David Miller

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).