]> git.ipfire.org Git - thirdparty/ipset.git/commitdiff
Compatibility: Check for the fourth arg of list_for_each_entry_rcu()
authorJozsef Kadlecsik <kadlec@netfilter.org>
Thu, 19 Nov 2020 12:05:45 +0000 (13:05 +0100)
committerJozsef Kadlecsik <kadlec@netfilter.org>
Thu, 19 Nov 2020 12:05:45 +0000 (13:05 +0100)
A forth argument of list_for_each_entry_rcu() was introduced, handle the
compatibility issue.

Signed-off-by: Jozsef Kadlecsik <kadlec@netfilter.org>
configure.ac
kernel/include/linux/netfilter/ipset/ip_set_compat.h.in
kernel/net/netfilter/ipset/ip_set_core.c

index 10583157e6ed30808d2f262a11893d9d1f99f595..7388cdda5981b8abcddccd527022144186679133 100644 (file)
@@ -746,6 +746,16 @@ else
        AC_SUBST(HAVE_SYNCHRONIZE_RCU_BH, undef)
 fi
 
+AC_MSG_CHECKING([kernel source for the fourth arg of list_for_each_entry_rcu() in rculist.h])
+if test -f $ksourcedir/include/linux/rculist.h && \
+   $GREP -q 'define list_for_each_entry_rcu(pos, head, member, cond' $ksourcedir/include/linux/rculist.h; then
+       AC_MSG_RESULT(yes)
+       AC_SUBST(HAVE_LIST_FOR_EACH_ENTRY_RCU_FOUR_ARGS, define)
+else
+       AC_MSG_RESULT(no)
+       AC_SUBST(HAVE_LIST_FOR_EACH_ENTRY_RCU_FOUR_ARGS, 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
index 87e06414f35cb4e9321f0603049addefb2765db2..0bcff2c0e56e782ea5aeb98b329198bbe7bc0d46 100644 (file)
@@ -56,6 +56,7 @@
 #@HAVE_LOCKDEP_NFNL_IS_HELD@ HAVE_LOCKDEP_NFNL_IS_HELD
 #@HAVE_COND_RESCHED_RCU@ HAVE_COND_RESCHED_RCU
 #@HAVE_SKB_IIF@ HAVE_SKB_IIF
+#@HAVE_LIST_FOR_EACH_ENTRY_RCU_FOUR_ARGS@ HAVE_LIST_FOR_EACH_ENTRY_RCU_FOUR_ARGS
 
 #ifdef HAVE_EXPORT_SYMBOL_GPL_IN_MODULE_H
 #include <linux/module.h>
@@ -469,6 +470,14 @@ static inline u16 nfnl_msg_type(u8 subsys, u8 msg_type)
 #define dev_get_by_index_rcu __dev_get_by_index
 #endif
 
+#ifdef HAVE_LIST_FOR_EACH_ENTRY_RCU_FOUR_ARGS
+#define list_for_each_entry_rcu_compat(pos, head, member, cond) \
+       list_for_each_entry_rcu(pos, head, member, cond)
+#else
+#define list_for_each_entry_rcu_compat(pos, head, member, cond) \
+       list_for_each_entry_rcu(pos, head, member)
+#endif
+
 /* Compiler attributes */
 #ifndef __has_attribute
 # define __has_attribute(x) __GCC4_has_attribute_##x
index fb35e23fbe0c99bf9958c35a6e040518b4f2cb22..9de828974fac473b245d03dba647ba0f736ed84e 100644 (file)
@@ -86,8 +86,8 @@ find_set_type(const char *name, u8 family, u8 revision)
 {
        struct ip_set_type *type;
 
-       list_for_each_entry_rcu(type, &ip_set_type_list, list,
-                               lockdep_is_held(&ip_set_type_mutex))
+       list_for_each_entry_rcu_compat(type, &ip_set_type_list, list,
+                                      lockdep_is_held(&ip_set_type_mutex))
                if (STRNCMP(type->name, name) &&
                    (type->family == family ||
                     type->family == NFPROTO_UNSPEC) &&