Skip to content

Commit

Permalink
[NETNS]: Make the init/exit hooks checks outside the loop
Browse files Browse the repository at this point in the history
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: Pavel Emelyanov <xemul@openvz.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Pavel Emelyanov authored and David S. Miller committed Nov 1, 2007
1 parent 6257ff2 commit 1dba323
Showing 1 changed file with 11 additions and 12 deletions.
23 changes: 11 additions & 12 deletions net/core/net_namespace.c
Original file line number Diff line number Diff line change
Expand Up @@ -187,38 +187,37 @@ static int register_pernet_operations(struct list_head *list,
struct net *net, *undo_net;
int error;

error = 0;
list_add_tail(&ops->list, list);
for_each_net(net) {
if (ops->init) {
if (ops->init) {
for_each_net(net) {
error = ops->init(net);
if (error)
goto out_undo;
}
}
out:
return error;
return 0;

out_undo:
/* If I have an error cleanup all namespaces I initialized */
list_del(&ops->list);
for_each_net(undo_net) {
if (undo_net == net)
goto undone;
if (ops->exit)
if (ops->exit) {
for_each_net(undo_net) {
if (undo_net == net)
goto undone;
ops->exit(undo_net);
}
}
undone:
goto out;
return error;
}

static void unregister_pernet_operations(struct pernet_operations *ops)
{
struct net *net;

list_del(&ops->list);
for_each_net(net)
if (ops->exit)
if (ops->exit)
for_each_net(net)
ops->exit(net);
}

Expand Down

0 comments on commit 1dba323

Please sign in to comment.