Re: getdents spinning on 0x7fffffff

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, Dec 17, 2012 at 04:09:07PM -0700, Zach Brown wrote:
> I was flipping through the code recently and noticed that we still have
> the double whammy of allocating dir entry positions with
> parent_dir->counter++ and that weird setting of f_pos to 2^31-1.
> 
> So after enough creates (and deletes :)) in a directory we end up with
> an entry item whose key is past that value.  f_pos gets rewound instead
> of being set to that magical EOF.  readdir() gets stuck returning the
> entries after INT_MAX over and over (just one in this strace):
> 
> getdents(3, {{d_ino=257, d_off=2147483647, d_reclen=32, d_name="file-54"}}, 32768) = 32
> getdents(3, {{d_ino=257, d_off=2147483647, d_reclen=32, d_name="file-54"}}, 32768) = 32
> 
> It took around 10 hours on a workstationy box over here to reproduce
> this with createmany.c from the lustre tests ("./createmany -m f- -u f-
> 0x8000000" mknod()s and unlink()s 2^31 files), but that's tedious.  It's
> easier to force initialization of index_cnt in the kernel to test
> things.
> 
> 1) The fundamental fix is to re-use deleted entry positions.  Do we add
> another cache to index unlinked positions?  Do we add an unreliable
> best-effort walk of the tree looking for holes in the key space?  At the
> very least test index_cnt in unlink to get the basically useless
> index_cnt--? :)

The index is dense enough that we can search for free spots without too
much pain.  But, more below.

> 
> 2) Regardless of that, we have to deal with existing entry items with
> giant keys.  If for no other reason than big jerks making corrupt images
> and leaving them on usb keys in Josef's driveway.  Should we drop the
> silly INT_MAX setting for 64bit callers and return -EOVERFLOW for 32bit
> callers?  (That'd be gross, but not unheard of.  ext4 has grown htree
> behaviour that depends on compat detection: see its is_32bit_api()
> callers.)
> 
> I can make up some fixes but I'd love to hear strong opinions first, if
> anyone's got 'em :).

If we go past the 32 bit number we can use the hash offsets in readdir,
and just flag the directory as hashme-in-readdir

-chris
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Filesystem Development]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux