From: Jiri Pirko <jiri@resnulli.us>
To: Jakub Kicinski <kuba@kernel.org>
Cc: davem@davemloft.net, netdev@vger.kernel.org, edumazet@google.com,
pabeni@redhat.com, johannes.berg@intel.com, mpe@ellerman.id.au,
j@w1.fi
Subject: Re: [PATCH net-next 2/6] net: make dev_alloc_name() call dev_prep_valid_name()
Date: Fri, 20 Oct 2023 12:24:57 +0200 [thread overview]
Message-ID: <ZTJVeUJy9WhOgiAU@nanopsycho> (raw)
In-Reply-To: <20231020011856.3244410-3-kuba@kernel.org>
Fri, Oct 20, 2023 at 03:18:52AM CEST, kuba@kernel.org wrote:
>__dev_alloc_name() handles both the sprintf and non-sprintf
>target names. This complicates the code.
>
>dev_prep_valid_name() already handles the non-sprintf case,
>before calling __dev_alloc_name(), make the only other caller
>also go thru dev_prep_valid_name(). This way we can drop
>the non-sprintf handling in __dev_alloc_name() in one of
>the next changes.
>
>commit 55a5ec9b7710 ("Revert "net: core: dev_get_valid_name is now the same as dev_alloc_name_ns"") and
>commit 029b6d140550 ("Revert "net: core: maybe return -EEXIST in __dev_alloc_name"")
>tell us that we can't start returning -EEXIST from dev_alloc_name()
>on name duplicates. Bite the bullet and pass the expected errno to
>dev_prep_valid_name().
>
>dev_prep_valid_name() must now propagate out the allocated id
>for printf names.
>
>Signed-off-by: Jakub Kicinski <kuba@kernel.org>
>---
> net/core/dev.c | 20 +++++++++++---------
> 1 file changed, 11 insertions(+), 9 deletions(-)
>
>diff --git a/net/core/dev.c b/net/core/dev.c
>index 874c7daa81f5..004e9f26b160 100644
>--- a/net/core/dev.c
>+++ b/net/core/dev.c
>@@ -1137,19 +1137,18 @@ static int __dev_alloc_name(struct net *net, const char *name, char *res)
> return -ENFILE;
> }
>
>+/* Returns negative errno or allocated unit id (see __dev_alloc_name()) */
> static int dev_prep_valid_name(struct net *net, struct net_device *dev,
>- const char *want_name, char *out_name)
>+ const char *want_name, char *out_name,
>+ int dup_errno)
> {
>- int ret;
>-
> if (!dev_valid_name(want_name))
> return -EINVAL;
>
> if (strchr(want_name, '%')) {
>- ret = __dev_alloc_name(net, want_name, out_name);
>- return ret < 0 ? ret : 0;
>+ return __dev_alloc_name(net, want_name, out_name);
> } else if (netdev_name_in_use(net, want_name)) {
>- return -EEXIST;
>+ return -dup_errno;
> } else if (out_name != want_name) {
> strscpy(out_name, want_name, IFNAMSIZ);
> }
>@@ -1173,14 +1172,17 @@ static int dev_prep_valid_name(struct net *net, struct net_device *dev,
>
> int dev_alloc_name(struct net_device *dev, const char *name)
> {
>- return __dev_alloc_name(dev_net(dev), name, dev->name);
>+ return dev_prep_valid_name(dev_net(dev), dev, name, dev->name, ENFILE);
> }
> EXPORT_SYMBOL(dev_alloc_name);
>
> static int dev_get_valid_name(struct net *net, struct net_device *dev,
> const char *name)
> {
>- return dev_prep_valid_name(net, dev, name, dev->name);
>+ int ret;
>+
>+ ret = dev_prep_valid_name(net, dev, name, dev->name, EEXIST);
>+ return ret < 0 ? ret : 0;
Why can't you just return dev_prep_valid_name() ?
No caller seems to care about ret > 0
> }
>
> /**
>@@ -11118,7 +11120,7 @@ int __dev_change_net_namespace(struct net_device *dev, struct net *net,
> /* We get here if we can't use the current device name */
> if (!pat)
> goto out;
>- err = dev_prep_valid_name(net, dev, pat, new_name);
>+ err = dev_prep_valid_name(net, dev, pat, new_name, EEXIST);
> if (err < 0)
> goto out;
> }
>--
>2.41.0
>
next prev parent reply other threads:[~2023-10-20 10:25 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-10-20 1:18 [PATCH net-next 0/6] net: deduplicate netdev name allocation Jakub Kicinski
2023-10-20 1:18 ` [PATCH net-next 1/6] net: don't use input buffer of __dev_alloc_name() as a scratch space Jakub Kicinski
2023-10-20 10:15 ` Jiri Pirko
2023-10-20 1:18 ` [PATCH net-next 2/6] net: make dev_alloc_name() call dev_prep_valid_name() Jakub Kicinski
2023-10-20 10:24 ` Jiri Pirko [this message]
2023-10-20 19:01 ` Jakub Kicinski
2023-10-21 7:01 ` Jiri Pirko
2023-10-20 1:18 ` [PATCH net-next 3/6] net: reduce indentation of __dev_alloc_name() Jakub Kicinski
2023-10-20 10:26 ` Jiri Pirko
2023-10-20 1:18 ` [PATCH net-next 4/6] net: trust the bitmap in __dev_alloc_name() Jakub Kicinski
2023-10-20 10:38 ` Jiri Pirko
2023-10-20 19:04 ` Jakub Kicinski
2023-10-21 7:00 ` Jiri Pirko
2023-10-20 1:18 ` [PATCH net-next 5/6] net: remove dev_valid_name() check from __dev_alloc_name() Jakub Kicinski
2023-10-20 10:39 ` Jiri Pirko
2023-10-20 1:18 ` [PATCH net-next 6/6] net: remove else after return in dev_prep_valid_name() Jakub Kicinski
2023-10-20 10:45 ` Jiri Pirko
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ZTJVeUJy9WhOgiAU@nanopsycho \
--to=jiri@resnulli.us \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=j@w1.fi \
--cc=johannes.berg@intel.com \
--cc=kuba@kernel.org \
--cc=mpe@ellerman.id.au \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.