public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Al Viro <viro@ZenIV.linux.org.uk>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: linux-kernel@vger.kernel.org, xen-devel@lists.xensource.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: Re: Regression introduced by bfcfaa77bdf0f775263e906015982a608df01c76 (vfs: use 'unsigned long' accesses for dcache name comparison and hashing)
Date: Thu, 22 Mar 2012 20:24:45 +0000	[thread overview]
Message-ID: <20120322202445.GB6589@ZenIV.linux.org.uk> (raw)
In-Reply-To: <20120322200918.GZ6589@ZenIV.linux.org.uk>

On Thu, Mar 22, 2012 at 08:09:19PM +0000, Al Viro wrote:

> Interesting... that's exactly 8 characters.  Oh, I see - hash_name() gets
> an extra multiplication by 9 in this case.  Look: full_name_hash() will
> handle the first word, decrement len by 8, set hash to <first word> and
> bugger off on !len.  hash_name(), OTOH, will go through the loops once,
> with hash and a both 0.  hash stays 0, a becomes <first word>.  No NUL or
> / in it, so in we go again; hash becomes a * 9, i.e. <first word> * 9.
> a becomes the second word, with mask != 0.  And we are out of the loop,
> and proceed to add nothing to hash (the name is over at that point).  As
> the result, we get hash mismatch for names that are 8 bytes long or
> multiple thereof.

OK, full_name_hash()/hash_name() definitely have a mismatch and it's on the
names of length 8*n: trivial experiment shows that we have
name hash_name full_name_hash
a 61 61
ab 6261 6261
abc 636261 636261
abcd 64636261 64636261
abcdabc 64c6c4c2 64c6c4c2
abcdabcd efcead5 c8c6c4c2
abcdabcd9 efceb0e efceb0e

Linus, which way do you prefer to shift it?  Should hash_name() change to
match full_name_hash() or should it be the other way round?

What happens is that you get multiplication by 9 and adding 0 in the former,
after having added the last full word.  In the latter we add the last full
word, see that there's nothing left and bugger off.

  reply	other threads:[~2012-03-22 20:24 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-03-22 18:38 Regression introduced by bfcfaa77bdf0f775263e906015982a608df01c76 (vfs: use 'unsigned long' accesses for dcache name comparison and hashing) Konrad Rzeszutek Wilk
2012-03-22 19:33 ` Eric Paris
2012-03-22 20:03   ` Eric Paris
2012-03-22 20:10     ` Al Viro
2012-03-22 20:09 ` Al Viro
2012-03-22 20:24   ` Al Viro [this message]
2012-03-22 20:36     ` Al Viro
2012-03-22 20:42       ` Linus Torvalds
2012-03-22 21:41       ` Konrad Rzeszutek Wilk
2012-03-22 21:54         ` Linus Torvalds
2012-03-22 21:59           ` Al Viro
2012-03-22 20:38     ` Linus Torvalds
2012-03-22 20:44       ` Al Viro
2012-03-22 20:52         ` Linus Torvalds

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=20120322202445.GB6589@ZenIV.linux.org.uk \
    --to=viro@zeniv.linux.org.uk \
    --cc=konrad.wilk@oracle.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=torvalds@linux-foundation.org \
    --cc=xen-devel@lists.xensource.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox