From: Jens Axboe <axboe@kernel.dk>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Linux Kernel Mailing List <linux-kernel@vger.kernel.org>
Subject: Re: block: new gcc-5.1 warnings..
Date: Wed, 27 May 2015 17:16:19 -0600 [thread overview]
Message-ID: <55665043.1040904@kernel.dk> (raw)
In-Reply-To: <CA+55aFyfXJedGRwteFR30V0Qce9jJ0rJUuN=mQzDQOFA+cd0Mw@mail.gmail.com>
On 05/27/2015 04:32 PM, Linus Torvalds wrote:
> So gcc-5.1 seems to have a few new warnings, most of which seem of
> dubious value, but whatever.
>
> One of them
>
> drivers/block/hd.c: In function ‘hd_request’:
> drivers/block/hd.c:630:11: warning: switch condition has boolean value
> [-Wswitch-bool]
> switch (rq_data_dir(req)) {
> ^
>
> just made me go "what?" since doing a switch on a boolean is perfectly
> fine, and there can be various valid reasons to do so (using "break"
> and fall-through etc can make the structure of the true/false cases
> nicer).
>
> So the compiler warning is just silly and stupid.
>
> The warning would make more sense (and still trigger for this kernel
> case) if the case statements then didn't use boolean values.
>
> So despite the warning in general just being insane, in this case it
> happens to show an oddity of the kernel source code: rq_data_dir()
> returns a boolean, and that actually makes little sense, since it's
> normally compared to READ/WRITE. Which *happen* to be 0/1, and integer
> promotion does the right thing, but if you actually look at what
> READ/WRITE are, it really is 0/1, not false/true.
>
> This odd boolean came in through commit 5953316dbf90 ("block: make
> rq->cmd_flags be 64-bit") and I think that change really was
> questionable. What happened was that "cmd_flags" got turned into
> "u64", and that commit wants to avoid making rq_data_dir() return a
> u64, because that screws up printk() and friends.
>
> But I think it might be better off as (I didn't test this):
>
> #define rq_data_dir(rq) ((int)((rq)->cmd_flags & 1))
That'd work just fine.
> instead, to match the type of READ/WRITE. That would also get rid of
> the (bogus) warning introduced by gcc-5.1.1.
>
> And maybe somebody could then convince the gcc people that
>
> switch (boolean) {
> case true:
> ...
> case false:
> }
>
> is actually perfectly fine. It could still complain about the truly
> odd cases (which the kernel use really arguably is).
>
> Hmm? Jens?
The case you quoted is arguably crap, since the default case can never
be hit. I'm assuming this code dates back a long time, from when we
checked the actual command type instead of a bit being set or not. Now,
I don't have gcc-5.1 here, and the warning does make it seem like this
is not what it's complaining about. So I'd be fine with just making
rq_data_dir() return the right type and get rid of the != 0.
--
Jens Axboe
prev parent reply other threads:[~2015-05-27 23:16 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-05-27 22:32 block: new gcc-5.1 warnings Linus Torvalds
2015-05-27 22:56 ` Kirill A. Shutemov
2015-05-27 23:18 ` Linus Torvalds
2015-05-27 23:34 ` Linus Torvalds
2015-05-27 23:16 ` Jens Axboe [this message]
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=55665043.1040904@kernel.dk \
--to=axboe@kernel.dk \
--cc=linux-kernel@vger.kernel.org \
--cc=torvalds@linux-foundation.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).