#define __NET_FIB_NOTIFIER_H
#include <linux/types.h>
+#include <linux/module.h>
#include <linux/notifier.h>
#include <net/net_namespace.h>
struct list_head list;
unsigned int (*fib_seq_read)(struct net *net);
int (*fib_dump)(struct net *net, struct notifier_block *nb);
+ struct module *owner;
struct rcu_head rcu;
};
#include <linux/notifier.h>
#include <linux/rcupdate.h>
#include <linux/kernel.h>
+#include <linux/module.h>
#include <linux/init.h>
#include <net/net_namespace.h>
#include <net/fib_notifier.h>
rtnl_lock();
for_each_net(net) {
- list_for_each_entry(ops, &net->fib_notifier_ops, list)
+ list_for_each_entry(ops, &net->fib_notifier_ops, list) {
+ if (!try_module_get(ops->owner))
+ continue;
fib_seq += ops->fib_seq_read(net);
+ module_put(ops->owner);
+ }
}
rtnl_unlock();
struct fib_notifier_ops *ops;
list_for_each_entry_rcu(ops, &net->fib_notifier_ops, list) {
- int err = ops->fib_dump(net, nb);
+ int err;
+ if (!try_module_get(ops->owner))
+ continue;
+ err = ops->fib_dump(net, nb);
+ module_put(ops->owner);
if (err)
return err;
}
#include <linux/notifier.h>
#include <linux/socket.h>
#include <linux/kernel.h>
+#include <linux/export.h>
#include <net/net_namespace.h>
#include <net/fib_notifier.h>
#include <net/netns/ipv4.h>
.family = AF_INET,
.fib_seq_read = fib4_seq_read,
.fib_dump = fib4_dump,
+ .owner = THIS_MODULE,
};
int __net_init fib4_notifier_init(struct net *net)
#include <linux/notifier.h>
#include <linux/socket.h>
#include <linux/kernel.h>
+#include <linux/export.h>
#include <net/net_namespace.h>
#include <net/fib_notifier.h>
#include <net/netns/ipv6.h>
.family = AF_INET6,
.fib_seq_read = fib6_seq_read,
.fib_dump = fib6_dump,
+ .owner = THIS_MODULE,
};
int __net_init fib6_notifier_init(struct net *net)