From: Sheng Yong <shengyong1@huawei.com>
To: Brian Norris <computersforpeace@gmail.com>,
Wei Fang <fangwei1@huawei.com>
Cc: <linux-mtd@lists.infradead.org>, <dwmw2@infradead.org>,
"dedekind1@gmail.com >> Artem Bityutskiy" <dedekind1@gmail.com>
Subject: Re: [PATCH] jffs2: remove unneeded conditions
Date: Wed, 8 Jul 2015 09:45:29 +0800 [thread overview]
Message-ID: <559C80B9.8060200@huawei.com> (raw)
In-Reply-To: <20150707201843.GH18370@brian-ubuntu>
Hi, Brain and Wei Fang,
#CCed Artem Bityutskiy.
On 7/8/2015 4:18 AM, Brian Norris wrote:
> Hi Wei,
>
> On Sat, Jun 27, 2015 at 04:07:37PM +0800, Wei Fang wrote:
>> Since len must not be smaller than JFFS2_MIN_NODE_HEADER, if
>> "len < X" is true, than "JFFS2_MIN_NODE_HEADER < X" must be true,
>> so it can be removed.
>
> Huh? This comment doesn't exactly make sense to me. It seems like when
> reasoning about a safety check, you're assuming the safety check will
> already pass. Can you elaborate your reasoning here?
>
> Also, did you test these changes? Are you solving any real problem?
>
>> Signed-off-by: Wei Fang <fangwei1@huawei.com>
>> ---
>> fs/jffs2/readinode.c | 9 +++------
>> 1 file changed, 3 insertions(+), 6 deletions(-)
>>
>> diff --git a/fs/jffs2/readinode.c b/fs/jffs2/readinode.c
>> index dddbde4..b9bd3ad 100644
>> --- a/fs/jffs2/readinode.c
>> +++ b/fs/jffs2/readinode.c
>> @@ -1059,8 +1059,7 @@ static int jffs2_get_inode_nodes(struct jffs2_sb_info *c, struct jffs2_inode_inf
>>
>> case JFFS2_NODETYPE_DIRENT:
>>
>> - if (JFFS2_MIN_NODE_HEADER < sizeof(struct jffs2_raw_dirent) &&
>
> ^^ The original comparison here is kind of strange. I see:
>
> #define JFFS2_MIN_NODE_HEADER sizeof(struct jffs2_raw_dirent)
>
> which means that we're comparing:
>
> if (sizeof(struct jffs2_raw_dirent) < sizeof(struct jffs2_raw_dirent) && ...)
>
> AFAIK, that comparison will *always* be false, and so the entire
> condition will always be false. Not sure if that's intentional.
According to the comment,
"At this point we don't know the type of the node we're going
to read, so we do not know the size of its header. In order
to minimize the amount of flash IO we assume the node has
size = JFFS2_MIN_NODE_HEADER."
in order to save overhead of flash IO, jffs2 reads JFFS2_MIN_NODE_HEADER
bytes first. This is enough to detect the node type. IMO, for node whose
type is JFFS2_NODETYPE_DIRENT, there is no need to read more, so the whole
block of if statement can be removed.
And as Brain said, the modification needs some test.
thanks,
Sheng
>
>> - len < sizeof(struct jffs2_raw_dirent)) {
>> + if (len < sizeof(struct jffs2_raw_dirent)) {
>
> Therefore, the "refactoring" you are doing seems to actually make a
> logical change. If nothing else, it makes it harder (likely impossible)
> for the compiler to reason that the conditional code is all dead code.
> I'm not sure if that's a good or a bad thing, as I haven't figured out
> the full intent of this code in the first place.
>
>> err = read_more(c, ref, sizeof(struct jffs2_raw_dirent), &len, buf);
>> if (unlikely(err))
>> goto free_out;
>> @@ -1074,8 +1073,7 @@ static int jffs2_get_inode_nodes(struct jffs2_sb_info *c, struct jffs2_inode_inf
>>
>> case JFFS2_NODETYPE_INODE:
>>
>> - if (JFFS2_MIN_NODE_HEADER < sizeof(struct jffs2_raw_inode) &&
>> - len < sizeof(struct jffs2_raw_inode)) {
>> + if (len < sizeof(struct jffs2_raw_inode)) {
>> err = read_more(c, ref, sizeof(struct jffs2_raw_inode), &len, buf);
>> if (unlikely(err))
>> goto free_out;
>> @@ -1088,8 +1086,7 @@ static int jffs2_get_inode_nodes(struct jffs2_sb_info *c, struct jffs2_inode_inf
>> break;
>>
>> default:
>> - if (JFFS2_MIN_NODE_HEADER < sizeof(struct jffs2_unknown_node) &&
>> - len < sizeof(struct jffs2_unknown_node)) {
>> + if (len < sizeof(struct jffs2_unknown_node)) {
>> err = read_more(c, ref, sizeof(struct jffs2_unknown_node), &len, buf);
>> if (unlikely(err))
>> goto free_out;
>
> At any rate, I'm not confident in this patch without a lot more
> explanation, so I will not be taking it as-is.
>
> Thanks,
> Brian
>
> ______________________________________________________
> Linux MTD discussion mailing list
> http://lists.infradead.org/mailman/listinfo/linux-mtd/
>
>
next prev parent reply other threads:[~2015-07-08 1:45 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-06-27 8:07 [PATCH] jffs2: remove unneeded conditions Wei Fang
2015-07-07 20:18 ` Brian Norris
2015-07-08 1:45 ` Sheng Yong [this message]
2015-07-09 2:02 ` Wei Fang
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=559C80B9.8060200@huawei.com \
--to=shengyong1@huawei.com \
--cc=computersforpeace@gmail.com \
--cc=dedekind1@gmail.com \
--cc=dwmw2@infradead.org \
--cc=fangwei1@huawei.com \
--cc=linux-mtd@lists.infradead.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).