diff options
Diffstat (limited to 'net/core/net_namespace.c')
| -rw-r--r-- | net/core/net_namespace.c | 32 | 
1 files changed, 32 insertions, 0 deletions
diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c index f1d07b5c1e17..1895a4ca9c4f 100644 --- a/net/core/net_namespace.c +++ b/net/core/net_namespace.c @@ -325,6 +325,38 @@ void unregister_pernet_subsys(struct pernet_operations *module)  }  EXPORT_SYMBOL_GPL(unregister_pernet_subsys); +int register_pernet_gen_subsys(int *id, struct pernet_operations *ops) +{ +	int rv; + +	mutex_lock(&net_mutex); +again: +	rv = ida_get_new_above(&net_generic_ids, 1, id); +	if (rv < 0) { +		if (rv == -EAGAIN) { +			ida_pre_get(&net_generic_ids, GFP_KERNEL); +			goto again; +		} +		goto out; +	} +	rv = register_pernet_operations(first_device, ops); +	if (rv < 0) +		ida_remove(&net_generic_ids, *id); +	mutex_unlock(&net_mutex); +out: +	return rv; +} +EXPORT_SYMBOL_GPL(register_pernet_gen_subsys); + +void unregister_pernet_gen_subsys(int id, struct pernet_operations *ops) +{ +	mutex_lock(&net_mutex); +	unregister_pernet_operations(ops); +	ida_remove(&net_generic_ids, id); +	mutex_unlock(&net_mutex); +} +EXPORT_SYMBOL_GPL(unregister_pernet_gen_subsys); +  /**   *      register_pernet_device - register a network namespace device   *	@ops:  pernet operations structure for the subsystem  | 
