Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755920AbbHZBM5 (ORCPT ); Tue, 25 Aug 2015 21:12:57 -0400 Received: from ozlabs.org ([103.22.144.67]:40025 "EHLO ozlabs.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751739AbbHZBM4 (ORCPT ); Tue, 25 Aug 2015 21:12:56 -0400 From: Rusty Russell To: Oleg Nesterov Cc: "Paul E. McKenney" , Ingo Molnar , Linus Torvalds , Peter Zijlstra , Tejun Heo , linux-kernel@vger.kernel.org Subject: Re: [PATCH 1/1] params: don't ignore the rest of cmdline if parse_one() fails In-Reply-To: <20150825151841.GB29462@redhat.com> References: <20150821174230.GA17867@redhat.com> <20150822163810.GV11078@linux.vnet.ibm.com> <20150824153431.GB24949@redhat.com> <20150824183126.GA8388@redhat.com> <871tesjh29.fsf@rustcorp.com.au> <20150825151826.GA29462@redhat.com> <20150825151841.GB29462@redhat.com> User-Agent: Notmuch/0.17 (http://notmuchmail.org) Emacs/24.4.1 (x86_64-pc-linux-gnu) Date: Wed, 26 Aug 2015 09:43:01 +0930 Message-ID: <87si76j4aa.fsf@rustcorp.com.au> MIME-Version: 1.0 Content-Type: text/plain Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2253 Lines: 78 Oleg Nesterov writes: > parse_args() just aborts after it hits an error, so other args > at the same initcall level are simply ignored. This can lead to > other hard-to-understand problems, for example my testing machine > panics during the boot if I pass "locktorture.verbose=true". > > Change parse_args() to save the err code for return and continue. > > Signed-off-by: Oleg Nesterov Thanks! Applied, Rusty. > --- > kernel/params.c | 17 +++++++++-------- > 1 files changed, 9 insertions(+), 8 deletions(-) > > diff --git a/kernel/params.c b/kernel/params.c > index a22d6a7..b21139f 100644 > --- a/kernel/params.c > +++ b/kernel/params.c > @@ -223,7 +223,7 @@ char *parse_args(const char *doing, > int (*unknown)(char *param, char *val, > const char *doing, void *arg)) > { > - char *param, *val; > + char *param, *val, *err = NULL; > > /* Chew leading spaces */ > args = skip_spaces(args); > @@ -238,7 +238,7 @@ char *parse_args(const char *doing, > args = next_arg(args, ¶m, &val); > /* Stop at -- */ > if (!val && strcmp(param, "--") == 0) > - return args; > + return err ?: args; > irq_was_disabled = irqs_disabled(); > ret = parse_one(param, val, doing, params, num, > min_level, max_level, arg, unknown); > @@ -247,24 +247,25 @@ char *parse_args(const char *doing, > doing, param); > > switch (ret) { > + case 0: > + continue; > case -ENOENT: > pr_err("%s: Unknown parameter `%s'\n", doing, param); > - return ERR_PTR(ret); > + break; > case -ENOSPC: > pr_err("%s: `%s' too large for parameter `%s'\n", > doing, val ?: "", param); > - return ERR_PTR(ret); > - case 0: > break; > default: > pr_err("%s: `%s' invalid for parameter `%s'\n", > doing, val ?: "", param); > - return ERR_PTR(ret); > + break; > } > + > + err = ERR_PTR(ret); > } > > - /* All parsed OK. */ > - return NULL; > + return err; > } > > /* Lazy bastard, eh? */ -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/