From: Rusty Russell <rusty@rustcorp.com.au>
To: Michal Schmidt <mschmidt@redhat.com>
Cc: linux-kernel@vger.kernel.org, Randy Dunlap <rdunlap@xenotime.net>
Subject: Re: [PATCH] params: make dashes and underscores in parameter names truly equal
Date: Tue, 18 Oct 2011 14:28:46 +1030 [thread overview]
Message-ID: <87obxfq7bd.fsf@rustcorp.com.au> (raw)
In-Reply-To: <4E96F887.5050103@redhat.com>
On Thu, 13 Oct 2011 16:41:11 +0200, Michal Schmidt <mschmidt@redhat.com> wrote:
> On 10/13/2011 01:28 AM, Rusty Russell wrote:
> > Idea is solid, implementation has a few quirks. As the name
> > obsolete_checksetup() implies, this was only supposed to be a crutch for
> > old __setup() calls. Modern code should be using module_param() or
> > core_param().
>
> ... instead of __setup()?
Yep.
> No objection to the change in do_early_param() ?
Well, for the moment I've applied that, with parameq and parameqn
reimplemented more cleanly. See below.
> > Did you have a specific example?
>
> The specific example I had in mind was the one from
> Documentation/kernel-parameters.txt:
>
> log_buf_len=1M print-fatal-signals=1
> can also be entered as
> log-buf-len=1M print_fatal_signals=1
Oops.
> Let's see how many __setup() parameters there are:
> $ git grep -E '^__setup\("' |wc -l
> 457
>
> Only the ones with a dash or underscore in the name:
> $ git grep -E '__setup\(".*[_-].*"' | wc -l
> 180
>
> It will take some time.
The easy things have already been done ;)
Just do the non-arch ones, first, and see where that gets us.
Thanks!
Rusty.
From: Michal Schmidt <mschmidt@redhat.com>
Subject: params: make dashes and underscores in parameter names truly equal
Date: Mon, 10 Oct 2011 00:03:37 +0200
The user may use "foo-bar" for a kernel parameter defined as "foo_bar".
Make sure it works the other way around too.
Apply the equality of dashes and underscores on early_params and __setup
params as well.
The example given in Documentation/kernel-parameters.txt indicates that
this is the intended behaviour.
With the patch the kernel accepts "log-buf-len=1M" as expected.
https://bugzilla.redhat.com/show_bug.cgi?id=744545
Signed-off-by: Michal Schmidt <mschmidt@redhat.com>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> (neatened implementations)
---
include/linux/moduleparam.h | 20 ++++++++++++++++++++
init/main.c | 4 ++--
kernel/params.c | 21 ++++++++++++++-------
3 files changed, 36 insertions(+), 9 deletions(-)
diff --git a/include/linux/moduleparam.h b/include/linux/moduleparam.h
--- a/include/linux/moduleparam.h
+++ b/include/linux/moduleparam.h
@@ -262,6 +262,26 @@ static inline void __kernel_param_unlock
.str = &__param_string_##name, 0, perm); \
__MODULE_PARM_TYPE(name, "string")
+/**
+ * parameq - checks if two parameter names match
+ * @name1: parameter name 1
+ * @name2: parameter name 2
+ *
+ * Returns true if the two parameter names are equal.
+ * Dashes (-) are considered equal to underscores (_).
+ */
+extern bool parameq(const char *name1, const char *name2);
+
+/**
+ * parameqn - checks if two parameter names match
+ * @name1: parameter name 1
+ * @name2: parameter name 2
+ * @n: the length to compare
+ *
+ * Similar to parameq(), except it compares @n characters.
+ */
+extern bool parameqn(const char *name1, const char *name2, size_t n);
+
/* Called on module insert or kernel boot */
extern int parse_args(const char *name,
char *args,
diff --git a/init/main.c b/init/main.c
--- a/init/main.c
+++ b/init/main.c
@@ -163,7 +163,7 @@ static int __init obsolete_checksetup(ch
p = __setup_start;
do {
int n = strlen(p->str);
- if (!strncmp(line, p->str, n)) {
+ if (parameqn(line, p->str, n)) {
if (p->early) {
/* Already done in parse_early_param?
* (Needs exact match on param part).
@@ -392,7 +392,7 @@ static int __init do_early_param(char *p
const struct obs_kernel_param *p;
for (p = __setup_start; p < __setup_end; p++) {
- if ((p->early && strcmp(param, p->str) == 0) ||
+ if ((p->early && parameq(param, p->str)) ||
(strcmp(param, "console") == 0 &&
strcmp(p->str, "earlycon") == 0)
) {
diff --git a/kernel/params.c b/kernel/params.c
--- a/kernel/params.c
+++ b/kernel/params.c
@@ -67,20 +67,27 @@ static void maybe_kfree_parameter(void *
}
}
-static inline char dash2underscore(char c)
+static char dash2underscore(char c)
{
if (c == '-')
return '_';
return c;
}
-static inline int parameq(const char *input, const char *paramname)
+bool parameqn(const char *a, const char *b, size_t n)
{
- unsigned int i;
- for (i = 0; dash2underscore(input[i]) == paramname[i]; i++)
- if (input[i] == '\0')
- return 1;
- return 0;
+ size_t i;
+
+ for (i = 0; i < n; i++) {
+ if (dash2underscore(a[i]) != dash2underscore(b[i]))
+ return false;
+ }
+ return true;
+}
+
+bool parameq(const char *a, const char *b)
+{
+ return parameqn(a, b, strlen(a)+1);
}
static int parse_one(char *param,
next prev parent reply other threads:[~2011-10-18 6:51 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-10-09 22:03 [PATCH] params: make dashes and underscores in parameter names truly equal Michal Schmidt
2011-10-12 23:28 ` Rusty Russell
2011-10-13 14:41 ` Michal Schmidt
2011-10-18 3:58 ` Rusty Russell [this message]
2011-10-18 19:01 ` Randy Dunlap
2011-10-19 3:00 ` Rusty Russell
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=87obxfq7bd.fsf@rustcorp.com.au \
--to=rusty@rustcorp.com.au \
--cc=linux-kernel@vger.kernel.org \
--cc=mschmidt@redhat.com \
--cc=rdunlap@xenotime.net \
/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.