|
@@ -411,27 +411,25 @@ struct net *copy_net_ns(unsigned long flags,
|
|
|
|
|
|
net = net_alloc();
|
|
|
if (!net) {
|
|
|
- dec_net_namespaces(ucounts);
|
|
|
- return ERR_PTR(-ENOMEM);
|
|
|
+ rv = -ENOMEM;
|
|
|
+ goto dec_ucounts;
|
|
|
}
|
|
|
-
|
|
|
+ refcount_set(&net->passive, 1);
|
|
|
+ net->ucounts = ucounts;
|
|
|
get_user_ns(user_ns);
|
|
|
|
|
|
rv = mutex_lock_killable(&net_mutex);
|
|
|
- if (rv < 0) {
|
|
|
- net_free(net);
|
|
|
- dec_net_namespaces(ucounts);
|
|
|
- put_user_ns(user_ns);
|
|
|
- return ERR_PTR(rv);
|
|
|
- }
|
|
|
+ if (rv < 0)
|
|
|
+ goto put_userns;
|
|
|
|
|
|
- net->ucounts = ucounts;
|
|
|
rv = setup_net(net, user_ns);
|
|
|
mutex_unlock(&net_mutex);
|
|
|
if (rv < 0) {
|
|
|
- dec_net_namespaces(ucounts);
|
|
|
+put_userns:
|
|
|
put_user_ns(user_ns);
|
|
|
net_drop_ns(net);
|
|
|
+dec_ucounts:
|
|
|
+ dec_net_namespaces(ucounts);
|
|
|
return ERR_PTR(rv);
|
|
|
}
|
|
|
return net;
|