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 wrote: > On Tue, Nov 7, 2017 at 1:36 PM, Jim Meyering wrote: > > On Tue, Oct 31, 2017 at 12:03 PM, Curt McDowell > 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 csm@purestorage.com