On Wed, Nov 27, 2019 at 9:52 PM Nikolaus Rath <Nikolaus@xxxxxxxx> wrote: > > On Nov 27 2019, Miklos Szeredi <miklos@xxxxxxxxxx> wrote: > >> Is there a way for a 64 bit process (in this case the FUSE daemon) to > >> ask for 32 bit d_off values from getdents64()? > > > > Looking at ext4 d_off encoding, it looks like the simple workaround is > > to use the *high* 32 bits of the offset. > > > > Just tried, and this works. The lower bits are the "minor" number of > > the offset, and no issue with zeroing those bits out, other than > > increasing the chance of hash collision from practically zero to very > > close to zero. > > > >> Would it be feasible to extend the FUSE protocol to include information > >> about the available bits in d_off? > > > > Yes. > > > > The relevant bits from ext4 are: > > > > static inline int is_32bit_api(void) > > { > > #ifdef CONFIG_COMPAT > > return in_compat_syscall(); > > #else > > return (BITS_PER_LONG == 32); > > #endif > > } > > Thanks for the quick response! > > Is there a way to do the same without relying on ext4 internals, i.e. by > manually calling getdents64() in such a way that in_compat_syscall() > gives true even if the caller is 64 bit? Generally that's not doable. Might be able to do a 32bit syscall specifically on x86_64, but I don't know the details. Thanks, Miklos