static int nf_ct_netns_do_get(struct net *net, u8 nfproto)
{
	const struct nf_conntrack_l3proto *l3proto;
	int ret;

	might_sleep();

	ret = nf_ct_l3proto_try_module_get(nfproto);
	if (ret < 0)
		return ret;

	/* we already have a reference, can't fail */
	rcu_read_lock();
	l3proto = __nf_ct_l3proto_find(nfproto);
	rcu_read_unlock();

	if (!l3proto->net_ns_get)
		return 0;

	ret = l3proto->net_ns_get(net);
	if (ret < 0)
		nf_ct_l3proto_module_put(nfproto);

	return ret;
}
Example #2
0
void nf_ct_l3proto_module_put(unsigned short l3proto)
{
    struct nf_conntrack_l3proto *p;

    /* rcu_read_lock not necessary since the caller holds a reference */
    p = __nf_ct_l3proto_find(l3proto);
    module_put(p->me);
}
Example #3
0
void nf_ct_l3proto_module_put(unsigned short l3proto)
{
	struct nf_conntrack_l3proto *p;

	preempt_disable();
	p = __nf_ct_l3proto_find(l3proto);
	preempt_enable();

	module_put(p->me);
}
Example #4
0
void nf_ct_l3proto_module_put(unsigned short l3proto)
{
    struct nf_conntrack_l3proto *p;

    /* rcu_read_lock not necessary since the caller holds a reference, but
     * taken anyways to avoid lockdep warnings in __nf_ct_l3proto_find()
     */
    rcu_read_lock();
    p = __nf_ct_l3proto_find(l3proto);
    module_put(p->me);
    rcu_read_unlock();
}
Example #5
0
struct nf_conntrack_l3proto *
nf_ct_l3proto_find_get(u_int16_t l3proto)
{
    struct nf_conntrack_l3proto *p;

    rcu_read_lock();
    p = __nf_ct_l3proto_find(l3proto);
    if (!try_module_get(p->me))
        p = &nf_conntrack_l3proto_generic;
    rcu_read_unlock();

    return p;
}
Example #6
0
struct nf_conntrack_l3proto *
nf_ct_l3proto_find_get(u_int16_t l3proto)
{
	struct nf_conntrack_l3proto *p;

	preempt_disable();
	p = __nf_ct_l3proto_find(l3proto);
	if (!try_module_get(p->me))
		p = &nf_conntrack_l3proto_generic;
	preempt_enable();

	return p;
}
static void nf_ct_netns_do_put(struct net *net, u8 nfproto)
{
	const struct nf_conntrack_l3proto *l3proto;

	might_sleep();

	/* same as nf_conntrack_netns_get(), reference assumed */
	rcu_read_lock();
	l3proto = __nf_ct_l3proto_find(nfproto);
	rcu_read_unlock();

	if (WARN_ON(!l3proto))
		return;

	if (l3proto->net_ns_put)
		l3proto->net_ns_put(net);

	nf_ct_l3proto_module_put(nfproto);
}