From: Florian Weimer <fw@deneb.enyo.de>
To: Andy Lutomirski <luto@amacapital.net>
Cc: linux-fsdevel@vger.kernel.org, linux-api@vger.kernel.org,
linux-ext4@vger.kernel.org, linux-kernel@vger.kernel.org,
v9fs-developer@lists.sourceforge.net, libc-alpha@sourceware.org,
qemu-devel@nongnu.org, ericvh@gmail.com, lucho@ionkov.net,
hpa@zytor.com, arnd@arndb.de
Subject: Re: d_off field in struct dirent and 32-on-64 emulation
Date: Thu, 27 Dec 2018 18:56:02 +0100 [thread overview]
Message-ID: <87wonuua4t.fsf@mid.deneb.enyo.de> (raw)
In-Reply-To: <C65D3222-723F-4C0B-AF02-38488C302E84@amacapital.net> (Andy Lutomirski's message of "Thu, 27 Dec 2018 10:38:10 -0700")
* Andy Lutomirski:
>> On Dec 27, 2018, at 10:18 AM, Florian Weimer <fw@deneb.enyo.de> wrote:
>>
>> We have a bit of an interesting problem with respect to the d_off
>> field in struct dirent.
>>
>> When running a 64-bit kernel on certain file systems, notably ext4,
>> this field uses the full 63 bits even for small directories (strace -v
>> output, wrapped here for readability):
>>
>> getdents(3, [
>> {d_ino=1494304, d_off=3901177228673045825, d_reclen=40,
>> d_name="authorized_keys", d_type=DT_REG},
>> {d_ino=1494277, d_off=7491915799041650922, d_reclen=24, d_name=".",
>> d_type=DT_DIR},
>> {d_ino=1314655, d_off=9223372036854775807, d_reclen=24,
>> d_name="..", d_type=DT_DIR}
>> ], 32768) = 88
>>
>> When running in 32-bit compat mode, this value is somehow truncated to
>> 31 bits, for both the getdents and the getdents64 (!) system call (at
>> least on i386).
>
> I imagine you’re encountering this bug:
>
> https://lkml.org/lkml/2018/10/18/859
It's definitely in this area. However, the original collision problem
with 32-bit hashes is also real, so I can see the desire to use more
bits.
> Presumably the right fix involves modifying the relevant VFS file
> operations to indicate the relevant ABI to the implementations.
Not sure. How does NFS solve this problem when access happens from a
32-bit process and the rest (client kernel, transport, server kernel)
is 64-bit all the way?
> I would guess that 9p is triggering the “not really in the syscall you
> think you’re in” issue.
I think the issue is more like the networking case for 9p. In this
scenario, the server shouldn't have to care whether the client process
is in 32-bit mode or 64-bit mode. But maybe the only solution is to
pass through some sort of flag, as Peter Maydell has just suggested.
WARNING: multiple messages have this Message-ID (diff)
From: Florian Weimer <fw@deneb.enyo.de>
To: Andy Lutomirski <luto@amacapital.net>
Cc: linux-fsdevel@vger.kernel.org, linux-api@vger.kernel.org,
linux-ext4@vger.kernel.org, linux-kernel@vger.kernel.org,
v9fs-developer@lists.sourceforge.net, libc-alpha@sourceware.org,
qemu-devel@nongnu.org, ericvh@gmail.com, lucho@ionkov.net,
hpa@zytor.com, arnd@arndb.de
Subject: Re: [Qemu-devel] d_off field in struct dirent and 32-on-64 emulation
Date: Thu, 27 Dec 2018 18:56:02 +0100 [thread overview]
Message-ID: <87wonuua4t.fsf@mid.deneb.enyo.de> (raw)
In-Reply-To: <C65D3222-723F-4C0B-AF02-38488C302E84@amacapital.net> (Andy Lutomirski's message of "Thu, 27 Dec 2018 10:38:10 -0700")
* Andy Lutomirski:
>> On Dec 27, 2018, at 10:18 AM, Florian Weimer <fw@deneb.enyo.de> wrote:
>>
>> We have a bit of an interesting problem with respect to the d_off
>> field in struct dirent.
>>
>> When running a 64-bit kernel on certain file systems, notably ext4,
>> this field uses the full 63 bits even for small directories (strace -v
>> output, wrapped here for readability):
>>
>> getdents(3, [
>> {d_ino=1494304, d_off=3901177228673045825, d_reclen=40,
>> d_name="authorized_keys", d_type=DT_REG},
>> {d_ino=1494277, d_off=7491915799041650922, d_reclen=24, d_name=".",
>> d_type=DT_DIR},
>> {d_ino=1314655, d_off=9223372036854775807, d_reclen=24,
>> d_name="..", d_type=DT_DIR}
>> ], 32768) = 88
>>
>> When running in 32-bit compat mode, this value is somehow truncated to
>> 31 bits, for both the getdents and the getdents64 (!) system call (at
>> least on i386).
>
> I imagine you’re encountering this bug:
>
> https://lkml.org/lkml/2018/10/18/859
It's definitely in this area. However, the original collision problem
with 32-bit hashes is also real, so I can see the desire to use more
bits.
> Presumably the right fix involves modifying the relevant VFS file
> operations to indicate the relevant ABI to the implementations.
Not sure. How does NFS solve this problem when access happens from a
32-bit process and the rest (client kernel, transport, server kernel)
is 64-bit all the way?
> I would guess that 9p is triggering the “not really in the syscall you
> think you’re in” issue.
I think the issue is more like the networking case for 9p. In this
scenario, the server shouldn't have to care whether the client process
is in 32-bit mode or 64-bit mode. But maybe the only solution is to
pass through some sort of flag, as Peter Maydell has just suggested.
next prev parent reply other threads:[~2018-12-27 17:56 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-12-27 17:18 d_off field in struct dirent and 32-on-64 emulation Florian Weimer
2018-12-27 17:18 ` [Qemu-devel] " Florian Weimer
2018-12-27 17:38 ` Andy Lutomirski
2018-12-27 17:38 ` [Qemu-devel] " Andy Lutomirski
2018-12-27 17:56 ` Florian Weimer [this message]
2018-12-27 17:56 ` Florian Weimer
2018-12-27 17:41 ` Peter Maydell
2018-12-28 0:23 ` Andreas Dilger
2018-12-28 11:18 ` Peter Maydell
2018-12-28 23:16 ` Andreas Dilger
2018-12-29 0:12 ` Peter Maydell
2018-12-29 1:54 ` Matthew Wilcox
2018-12-29 16:49 ` Andy Lutomirski
2018-12-30 13:59 ` Peter Maydell
2018-12-29 2:11 ` Theodore Y. Ts'o
2018-12-29 2:11 ` Theodore Y. Ts'o
2018-12-29 2:37 ` Dominique Martinet
2018-12-29 3:14 ` Theodore Y. Ts'o
2018-12-29 3:14 ` Theodore Y. Ts'o
2018-12-29 4:04 ` [V9fs-developer] " Dominique Martinet
2018-12-29 4:04 ` [Qemu-devel] [V9fs-developer] " Dominique Martinet
2018-12-27 17:58 ` Adhemerval Zanella
2018-12-27 17:58 ` [Qemu-devel] " Adhemerval Zanella
2018-12-27 18:09 ` Florian Weimer
2018-12-27 18:09 ` [Qemu-devel] " Florian Weimer
2018-12-28 11:53 ` Adhemerval Zanella
2018-12-28 11:53 ` [Qemu-devel] " Adhemerval Zanella
2018-12-28 11:56 ` Florian Weimer
2018-12-28 11:56 ` [Qemu-devel] " Florian Weimer
2018-12-28 12:01 ` Florian Weimer
2018-12-28 12:01 ` [Qemu-devel] " Florian Weimer
2018-12-28 12:21 ` Adhemerval Zanella
2018-12-28 12:21 ` [Qemu-devel] " Adhemerval Zanella
2018-12-31 17:03 ` Joseph Myers
2018-12-31 17:03 ` [Qemu-devel] " Joseph Myers
2018-12-31 17:03 ` Joseph Myers
2019-01-02 13:16 ` Adhemerval Zanella
2019-01-02 13:16 ` [Qemu-devel] " Adhemerval Zanella
2018-12-28 2:23 ` Dmitry V. Levin
2018-12-28 2:23 ` [Qemu-devel] " Dmitry V. Levin
2018-12-28 7:38 ` Florian Weimer
2018-12-28 7:38 ` [Qemu-devel] " Florian Weimer
2018-12-28 15:26 ` Andy Lutomirski
2018-12-28 15:26 ` [Qemu-devel] " Andy Lutomirski
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=87wonuua4t.fsf@mid.deneb.enyo.de \
--to=fw@deneb.enyo.de \
--cc=arnd@arndb.de \
--cc=ericvh@gmail.com \
--cc=hpa@zytor.com \
--cc=libc-alpha@sourceware.org \
--cc=linux-api@vger.kernel.org \
--cc=linux-ext4@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=lucho@ionkov.net \
--cc=luto@amacapital.net \
--cc=qemu-devel@nongnu.org \
--cc=v9fs-developer@lists.sourceforge.net \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.