summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--configure.ac10
-rw-r--r--kernel/include/linux/netfilter/ipset/ip_set_compat.h.in3
-rw-r--r--kernel/net/netfilter/ipset/ip_set_hash_netiface.c9
3 files changed, 21 insertions, 1 deletions
diff --git a/configure.ac b/configure.ac
index 228000b..b886778 100644
--- a/configure.ac
+++ b/configure.ac
@@ -313,6 +313,16 @@ else
AC_SUBST(HAVE_USER_NS_IN_STRUCT_NET, undef)
fi
+AC_MSG_CHECKING([kernel source for rbtree_postorder_for_each_entry_safe])
+if test -f $ksourcedir/include/linux/rbtree.h && \
+ $GREP -q 'rbtree_postorder_for_each_entry_safe' $ksourcedir/include/linux/rbtree.h; then
+ AC_MSG_RESULT(yes)
+ AC_SUBST(HAVE_RBTREE_POSTORDER_FOR_EACH_ENTRY_SAFE, define)
+else
+ AC_MSG_RESULT(no)
+ AC_SUBST(HAVE_RBTREE_POSTORDER_FOR_EACH_ENTRY_SAFE, undef)
+fi
+
AC_MSG_CHECKING([kernel source for struct net_generic])
if test -f $ksourcedir/include/net/netns/generic.h && \
$GREP -q 'struct net_generic' $ksourcedir/include/net/netns/generic.h; then
diff --git a/kernel/include/linux/netfilter/ipset/ip_set_compat.h.in b/kernel/include/linux/netfilter/ipset/ip_set_compat.h.in
index 4a076f8..85684f3 100644
--- a/kernel/include/linux/netfilter/ipset/ip_set_compat.h.in
+++ b/kernel/include/linux/netfilter/ipset/ip_set_compat.h.in
@@ -22,7 +22,8 @@
#@HAVE_CHECKENTRY_BOOL@ HAVE_CHECKENTRY_BOOL
#@HAVE_XT_TARGET_PARAM@ HAVE_XT_TARGET_PARAM
#@HAVE_NET_OPS_ID@ HAVE_NET_OPS_ID
-#@HAVE_USER_NS_IN_STRUCT_NET@ HAVE_USER_NS_IN_STRUCT_NET
+#@HAVE_USER_NS_IN_STRUCT_NET@ HAVE_USER_NS_IN_STRUCT_NET
+#@HAVE_RBTREE_POSTORDER_FOR_EACH_ENTRY_SAFE@ HAVE_RBTREE_POSTORDER_FOR_EACH_ENTRY_SAFE
/* Not everything could be moved here. Compatibility stuffs can be found in
* xt_set.c, ip_set_core.c, ip_set_getport.c, pfxlen.c too.
diff --git a/kernel/net/netfilter/ipset/ip_set_hash_netiface.c b/kernel/net/netfilter/ipset/ip_set_hash_netiface.c
index 3f64a66..788825b 100644
--- a/kernel/net/netfilter/ipset/ip_set_hash_netiface.c
+++ b/kernel/net/netfilter/ipset/ip_set_hash_netiface.c
@@ -46,6 +46,14 @@ struct iface_node {
static void
rbtree_destroy(struct rb_root *root)
{
+#ifdef HAVE_RBTREE_POSTORDER_FOR_EACH_ENTRY_SAFE
+ struct iface_node *node, *next;
+
+ rbtree_postorder_for_each_entry_safe(node, next, root, node)
+ kfree(node);
+
+ *root = RB_ROOT;
+#else
struct rb_node *p, *n = root->rb_node;
struct iface_node *node;
@@ -71,6 +79,7 @@ rbtree_destroy(struct rb_root *root)
kfree(node);
n = p;
}
+#endif
}
static int