Subject: Re: [bug-idutils] bug#29092: bug#29092: Bug related to 64-bit inodes

From: Curt McDowell <[email-masked]>
Date: Mon, 18 Dec 2017 15:31:17 -0800

Jim,

Thanks for getting to this. I applied the patch and was surprised to see it
still has the same bug! There is another comparison function that needs
fixing. I verified that 64-bit inodes work properly with this additional
change:

static int
dev_ino_hash_compare (void const *x, void const *y)
{
  int result;
  result = memcmp(&((struct dev_ino const *) x)->di_ino,
                  &((struct dev_ino const *) y)->di_ino, sizeof (ino_t));
  if (result)
    return result;
  result = memcmp(&((struct dev_ino const *) x)->di_dev,
                  &((struct dev_ino const *) y)->di_dev, sizeof (ino_t));
  return result;
}

On Sat, Dec 16, 2017 at 4:58 PM, Jim Meyering <[email-masked]> wrote:

> On Tue, Nov 7, 2017 at 1:36 PM, Jim Meyering <[email-masked]> wrote:
> > On Tue, Oct 31, 2017 at 12:03 PM, Curt McDowell <[email-masked]>
> wrote:
> >> Hi,
> >>
> >> I'm running idutils 4.6 on Ubuntu 14.04 to index a large source base
> that is
> >> on an NFS-mounted filesystem that uses 64-bit inodes. mkid incorrectly
> >> issues many warnings such as the following:
> >>
> >> /home/csm/src/idutils-4.6/src/mkid: warning:
> >> `/df-csm/ir-csm7/platform/dot/ir/component/si5338/si5338.py' and
> >> `/df-csm/ir-csm7/hardware/perf/CTRL_systemC/src/demux.hpp' are the same
> >> file, but yield different scans!
> >>
> >> It turns out these inodes are equal in the lower 32 bits, but are not
> equal.
> >>
> >> % ls -li /df-csm/ir-csm7/platform/dot/ir/component/si5338/si5338.py
> >> /df-csm/ir-csm7/hardware/perf/CTRL_systemC/src/demux.hpp
> >> 33776997256654722 -rwxr-xr-x 1 csm staff  3290 May 22 22:03
> >> /df-csm/ir-csm7/hardware/perf/CTRL_systemC/src/demux.hpp
> >> 63050394834562946 -rw-r--r-- 1 csm staff 28973 May 22 22:03
> >> /df-csm/ir-csm7/platform/dot/ir/component/si5338/si5338.py
> >>
> >> The inode numbers in hex are 780000030FEF82 and E00000030FEF82,
> >> respectively.
> >>
> >> I believe the bug is that the inode hash functions should account for
> the
> >> size of the di_ino field in case it is 8 bytes wide, rather than
> assuming
> >> they are always 4 bytes:
> >>
> >> /***********************************************************
> *****************/
> >> /* Hash stuff for `struct dev_ino'.  */
> >>
> >> static unsigned long
> >> dev_ino_hash_1 (void const *key)
> >> {
> >>   unsigned long result = 0;
> >>   INTEGER_HASH_1 (((struct dev_ino const *) key)->di_dev, result);
> >>   INTEGER_HASH_1 (((struct dev_ino const *) key)->di_ino, result);
> >>   return result;
> >> }
> >>
> >> static unsigned long
> >> dev_ino_hash_2 (void const *key)
> >> {
> >>   unsigned long result = 0;
> >>   INTEGER_HASH_2 (((struct dev_ino const *) key)->di_dev, result);
> >>   INTEGER_HASH_2 (((struct dev_ino const *) key)->di_ino, result);
> >>   return result;
> >> }
> >>
> >> As an unrelated issue, in order to get idutils 4.6 to compile on Ubuntu
> >> 14.0.4 I had to edit lib/stdio.h and change "#if 1" to "#if 0" for the
> >> section that deals with the "gets" function (libc 2.19-0ubuntu6.13).
> >
> > Thank you for the report.
> > That is definitely a bug -- and it is over two decades old!
> > I will fix this shortly, and will soon make a test release.
>
> It wasn't as prompt as I would have liked, but here's a patch.
> I'll make a snapshot today and post separately to the bug-idutils list.
>

-- 
Curt McDowell / Pure Storage / FlashBlade
[email-masked]