Commit 1dba323b authored by Pavel Emelyanov's avatar Pavel Emelyanov Committed by David S. Miller

[NETNS]: Make the init/exit hooks checks outside the loop

When the new pernet something (subsys, device or operations) is
being registered, the init callback is to be called for each
namespace, that currently exitst in the system. During the
unregister, the same is to be done with the exit callback.

However, not every pernet something has both calls, but the
check for the appropriate pointer to be not NULL is performed
inside the for_each_net() loop.

This is (at least) strange, so tune this.
Signed-off-by: default avatarPavel Emelyanov <xemul@openvz.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 6257ff21
...@@ -187,29 +187,28 @@ static int register_pernet_operations(struct list_head *list, ...@@ -187,29 +187,28 @@ static int register_pernet_operations(struct list_head *list,
struct net *net, *undo_net; struct net *net, *undo_net;
int error; int error;
error = 0;
list_add_tail(&ops->list, list); list_add_tail(&ops->list, list);
for_each_net(net) { if (ops->init) {
if (ops->init) { for_each_net(net) {
error = ops->init(net); error = ops->init(net);
if (error) if (error)
goto out_undo; goto out_undo;
} }
} }
out: return 0;
return error;
out_undo: out_undo:
/* If I have an error cleanup all namespaces I initialized */ /* If I have an error cleanup all namespaces I initialized */
list_del(&ops->list); list_del(&ops->list);
for_each_net(undo_net) { if (ops->exit) {
if (undo_net == net) for_each_net(undo_net) {
goto undone; if (undo_net == net)
if (ops->exit) goto undone;
ops->exit(undo_net); ops->exit(undo_net);
}
} }
undone: undone:
goto out; return error;
} }
static void unregister_pernet_operations(struct pernet_operations *ops) static void unregister_pernet_operations(struct pernet_operations *ops)
...@@ -217,8 +216,8 @@ static void unregister_pernet_operations(struct pernet_operations *ops) ...@@ -217,8 +216,8 @@ static void unregister_pernet_operations(struct pernet_operations *ops)
struct net *net; struct net *net;
list_del(&ops->list); list_del(&ops->list);
for_each_net(net) if (ops->exit)
if (ops->exit) for_each_net(net)
ops->exit(net); ops->exit(net);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment