[PATCH v2 11/33] net: use ns_common_init()

Christian Brauner posted 33 patches 2 weeks, 6 days ago
[PATCH v2 11/33] net: use ns_common_init()
Posted by Christian Brauner 2 weeks, 6 days ago
Don't cargo-cult the same thing over and over.

Signed-off-by: Christian Brauner <brauner@kernel.org>
---
 net/core/net_namespace.c | 46 +++++++++++++++++++++++++++++++++-------------
 1 file changed, 33 insertions(+), 13 deletions(-)

diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c
index 1b6f3826dd0e..5fb7bd8ac45a 100644
--- a/net/core/net_namespace.c
+++ b/net/core/net_namespace.c
@@ -397,10 +397,22 @@ static __net_init void preinit_net_sysctl(struct net *net)
 }
 
 /* init code that must occur even if setup_net() is not called. */
-static __net_init void preinit_net(struct net *net, struct user_namespace *user_ns)
+static __net_init int preinit_net(struct net *net, struct user_namespace *user_ns)
 {
+	const struct proc_ns_operations *ns_ops;
+	int ret;
+
+#ifdef CONFIG_NET_NS
+	ns_ops = &netns_operations;
+#else
+	ns_ops = NULL;
+#endif
+
+	ret = ns_common_init(&net->ns, ns_ops, false);
+	if (ret)
+		return ret;
+
 	refcount_set(&net->passive, 1);
-	refcount_set(&net->ns.count, 1);
 	ref_tracker_dir_init(&net->refcnt_tracker, 128, "net_refcnt");
 	ref_tracker_dir_init(&net->notrefcnt_tracker, 128, "net_notrefcnt");
 
@@ -420,6 +432,7 @@ static __net_init void preinit_net(struct net *net, struct user_namespace *user_
 	INIT_LIST_HEAD(&net->ptype_all);
 	INIT_LIST_HEAD(&net->ptype_specific);
 	preinit_net_sysctl(net);
+	return 0;
 }
 
 /*
@@ -559,7 +572,9 @@ struct net *copy_net_ns(unsigned long flags,
 		goto dec_ucounts;
 	}
 
-	preinit_net(net, user_ns);
+	rv = preinit_net(net, user_ns);
+	if (rv < 0)
+		goto dec_ucounts;
 	net->ucounts = ucounts;
 	get_user_ns(user_ns);
 
@@ -812,15 +827,15 @@ static void net_ns_net_debugfs(struct net *net)
 
 static __net_init int net_ns_net_init(struct net *net)
 {
-#ifdef CONFIG_NET_NS
-	net->ns.ops = &netns_operations;
-#endif
-	net->ns.inum = PROC_NET_INIT_INO;
-	if (net != &init_net) {
-		int ret = ns_alloc_inum(&net->ns);
-		if (ret)
-			return ret;
-	}
+	int ret = 0;
+
+	if (net == &init_net)
+		net->ns.inum = PROC_NET_INIT_INO;
+	else
+		ret = proc_alloc_inum(&to_ns_common(net)->inum);
+	if (ret)
+		return ret;
+
 	net_ns_net_debugfs(net);
 	return 0;
 }
@@ -1282,7 +1297,12 @@ void __init net_ns_init(void)
 #ifdef CONFIG_KEYS
 	init_net.key_domain = &init_net_key_domain;
 #endif
-	preinit_net(&init_net, &init_user_ns);
+	/*
+	 * This currently cannot fail as the initial network namespace
+	 * has a static inode number.
+	 */
+	if (preinit_net(&init_net, &init_user_ns))
+		panic("Could not preinitialize the initial network namespace");
 
 	down_write(&pernet_ops_rwsem);
 	if (setup_net(&init_net))

-- 
2.47.3
Re: [PATCH v2 11/33] net: use ns_common_init()
Posted by Al Viro 2 weeks, 2 days ago
On Fri, Sep 12, 2025 at 01:52:34PM +0200, Christian Brauner wrote:

> +	ret = ns_common_init(&net->ns, ns_ops, false);
					       ^^^^^
> +	if (ret)
> +		return ret;

How would that possibly fail?  You are not trying to grab inum here,
what's there to fail?

> @@ -559,7 +572,9 @@ struct net *copy_net_ns(unsigned long flags,
>  		goto dec_ucounts;
>  	}
>  
> -	preinit_net(net, user_ns);
> +	rv = preinit_net(net, user_ns);
> +	if (rv < 0)
> +		goto dec_ucounts;

Ditto.
Re: [PATCH v2 11/33] net: use ns_common_init()
Posted by Jan Kara 2 weeks, 3 days ago
On Fri 12-09-25 13:52:34, Christian Brauner wrote:
> Don't cargo-cult the same thing over and over.
> 
> Signed-off-by: Christian Brauner <brauner@kernel.org>

...

> @@ -559,7 +572,9 @@ struct net *copy_net_ns(unsigned long flags,
>  		goto dec_ucounts;
>  	}
>  
> -	preinit_net(net, user_ns);
> +	rv = preinit_net(net, user_ns);
> +	if (rv < 0)
> +		goto dec_ucounts;

Umm, this seems to be leaking 'net' on error exit.

>  	net->ucounts = ucounts;
>  	get_user_ns(user_ns);
>  

								Honza
-- 
Jan Kara <jack@suse.com>
SUSE Labs, CR
Re: [PATCH v2 11/33] net: use ns_common_init()
Posted by Christian Brauner 2 weeks, 3 days ago
On Mon, Sep 15, 2025 at 01:07:06PM +0200, Jan Kara wrote:
> On Fri 12-09-25 13:52:34, Christian Brauner wrote:
> > Don't cargo-cult the same thing over and over.
> > 
> > Signed-off-by: Christian Brauner <brauner@kernel.org>
> 
> ...
> 
> > @@ -559,7 +572,9 @@ struct net *copy_net_ns(unsigned long flags,
> >  		goto dec_ucounts;
> >  	}
> >  
> > -	preinit_net(net, user_ns);
> > +	rv = preinit_net(net, user_ns);
> > +	if (rv < 0)
> > +		goto dec_ucounts;
> 
> Umm, this seems to be leaking 'net' on error exit.

Sorry about this:

diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c
index 5fb7bd8ac45a..466de530c495 100644
--- a/net/core/net_namespace.c
+++ b/net/core/net_namespace.c
@@ -572,12 +572,13 @@ struct net *copy_net_ns(unsigned long flags,
                goto dec_ucounts;
        }

-       rv = preinit_net(net, user_ns);
-       if (rv < 0)
-               goto dec_ucounts;
        net->ucounts = ucounts;
        get_user_ns(user_ns);

+       rv = preinit_net(net, user_ns);
+       if (rv < 0)
+               goto put_userns;
+
        rv = down_read_killable(&pernet_ops_rwsem);
        if (rv < 0)
                goto put_userns;

Thanks for noticing! Fixed in-tree.
Re: [PATCH v2 11/33] net: use ns_common_init()
Posted by Jan Kara 2 weeks, 3 days ago
On Mon 15-09-25 13:42:04, Christian Brauner wrote:
> On Mon, Sep 15, 2025 at 01:07:06PM +0200, Jan Kara wrote:
> > On Fri 12-09-25 13:52:34, Christian Brauner wrote:
> > > Don't cargo-cult the same thing over and over.
> > > 
> > > Signed-off-by: Christian Brauner <brauner@kernel.org>
> > 
> > ...
> > 
> > > @@ -559,7 +572,9 @@ struct net *copy_net_ns(unsigned long flags,
> > >  		goto dec_ucounts;
> > >  	}
> > >  
> > > -	preinit_net(net, user_ns);
> > > +	rv = preinit_net(net, user_ns);
> > > +	if (rv < 0)
> > > +		goto dec_ucounts;
> > 
> > Umm, this seems to be leaking 'net' on error exit.
> 
> Sorry about this:

Looks good now. Feel free to add:

Reviewed-by: Jan Kara <jack@suse.cz>

								Honza

> 
> diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c
> index 5fb7bd8ac45a..466de530c495 100644
> --- a/net/core/net_namespace.c
> +++ b/net/core/net_namespace.c
> @@ -572,12 +572,13 @@ struct net *copy_net_ns(unsigned long flags,
>                 goto dec_ucounts;
>         }
> 
> -       rv = preinit_net(net, user_ns);
> -       if (rv < 0)
> -               goto dec_ucounts;
>         net->ucounts = ucounts;
>         get_user_ns(user_ns);
> 
> +       rv = preinit_net(net, user_ns);
> +       if (rv < 0)
> +               goto put_userns;
> +
>         rv = down_read_killable(&pernet_ops_rwsem);
>         if (rv < 0)
>                 goto put_userns;
> 
> Thanks for noticing! Fixed in-tree.
-- 
Jan Kara <jack@suse.com>
SUSE Labs, CR