[PATCH 9/18] Netfilter: Clean up the kmod handling code in iptables.c

Thomas Graf tgraf at suug.ch
Wed Jan 5 19:12:49 CET 2005


* Rusty Russell <1104896029.20582.72.camel at localhost.localdomain> 2005-01-05 14:33
> Name: Clean up the kmod handling code in iptables.c
> Status: Tested under nfsim
> 
> 4) Remove __ipt_mutex_up() and __ipt_find_target_lock() which weren't
>    used (even in patch-o-matic AFAICT).

Those are used by ipt action (net/sched/ipt.c).

Readds __ipt_find_target_lock() and __ipt_mutex_up() and adapts ipt.c
to correctly use it. module must be given back properly upon cleanup.
removes the comments demanding for proper module refcnt since
find_target_lock() takes care of this now.

Jamal: Can you please verify?

Signed-off-by: Thomas Graf <tgraf at suug.ch>

diff -Nru linux-2.6.10-bk8.orig/include/linux/netfilter_ipv4/ip_tables.h linux-2.6.10-bk8/include/linux/netfilter_ipv4/ip_tables.h
--- linux-2.6.10-bk8.orig/include/linux/netfilter_ipv4/ip_tables.h	2005-01-05 18:58:14.000000000 +0100
+++ linux-2.6.10-bk8/include/linux/netfilter_ipv4/ip_tables.h	2005-01-05 18:47:43.000000000 +0100
@@ -432,6 +432,9 @@
 extern int ipt_register_match(struct ipt_match *match);
 extern void ipt_unregister_match(struct ipt_match *match);
 
+extern struct ipt_target * __ipt_find_target_lock(const char *name, u8 rev);
+extern void __ipt_mutex_up(void);
+
 /* Furniture shopping... */
 struct ipt_table
 {
diff -Nru linux-2.6.10-bk8.orig/net/ipv4/netfilter/ip_tables.c linux-2.6.10-bk8/net/ipv4/netfilter/ip_tables.c
--- linux-2.6.10-bk8.orig/net/ipv4/netfilter/ip_tables.c	2005-01-05 18:58:14.000000000 +0100
+++ linux-2.6.10-bk8/net/ipv4/netfilter/ip_tables.c	2005-01-05 18:46:33.000000000 +0100
@@ -488,6 +488,16 @@
 	return ERR_PTR(-EPROTOTYPE);
 }
 
+struct ipt_target * __ipt_find_target_lock(const char *name, u8 revision)
+{
+	return find_target_lock(name, revision);
+}
+
+void __ipt_mutex_up(void)
+{
+	up(&ipt_mutex);
+}
+
 static int match_revfn(const char *name, u8 revision, int *bestp)
 {
 	struct ipt_match *m;
@@ -1959,6 +1969,8 @@
 EXPORT_SYMBOL(ipt_do_table);
 EXPORT_SYMBOL(ipt_register_target);
 EXPORT_SYMBOL(ipt_unregister_target);
+EXPORT_SYMBOL_GPL(__ipt_find_target_lock);
+EXPORT_SYMBOL_GPL(__ipt_mutex_up);
 
 module_init(init);
 module_exit(fini);
diff -Nru linux-2.6.10-bk8.orig/net/sched/ipt.c linux-2.6.10-bk8/net/sched/ipt.c
--- linux-2.6.10-bk8.orig/net/sched/ipt.c	2004-12-24 22:33:49.000000000 +0100
+++ linux-2.6.10-bk8/net/sched/ipt.c	2005-01-05 18:55:29.000000000 +0100
@@ -60,19 +60,14 @@
 	struct ipt_target *target;
 	int ret = 0;
 	struct ipt_entry_target *t = p->t;
-	target = __ipt_find_target_lock(t->u.user.name, &ret);
+	target = __ipt_find_target_lock(t->u.user.name, t->u.user.revision);
 
-	if (!target) {
+	if (IS_ERR(target) || !target) {
 		printk("init_targ: Failed to find %s\n", t->u.user.name);
 		return -1;
 	}
 
 	DPRINTK("init_targ: found %s\n", target->name);
-	/* we really need proper ref counting
-	 seems to be only needed for modules?? Talk to laforge */
-/*      if (target->me)
-              __MOD_INC_USE_COUNT(target->me);
-*/
 	t->u.kernel.target = target;
 
 	__ipt_mutex_up();
@@ -81,9 +76,6 @@
 	    && !t->u.kernel.target->checkentry(p->tname, NULL, t->data,
 					       t->u.target_size
 					       - sizeof (*t), p->hook)) {
-/*              if (t->u.kernel.target->me)
-	      __MOD_DEC_USE_COUNT(t->u.kernel.target->me);
-*/
 		DPRINTK("ip_tables: check failed for `%s'.\n",
 			t->u.kernel.target->name);
 		ret = -EINVAL;
@@ -235,8 +227,12 @@
 {
 	struct tcf_ipt *p;
 	p = PRIV(a,ipt);
-	if (NULL != p)
+	if (NULL != p) {
+		struct ipt_entry_target *t = p->t;
+		if (t && t->u.kernel.target)
+			module_put(t->u.kernel.target->me);
 		return tcf_hash_release(p, bind);
+	}
 	return 0;
 }
 



More information about the netfilter-devel mailing list