]> git.lizzy.rs Git - rust.git/commit
Stop probing for statx unless necessary
authorMateusz Guzik <mjguzik@gmail.com>
Tue, 10 Jan 2023 02:08:07 +0000 (02:08 +0000)
committerMateusz Guzik <mjguzik@gmail.com>
Wed, 11 Jan 2023 17:10:08 +0000 (17:10 +0000)
commitb49aa8d53e2e1424f5d9997734cfd71b2ae647b4
tree1366592b15714196c761e575f19c810d0bd2eb1f
parent753e57672296e13c534f87b6e2672a73fff4965c
Stop probing for statx unless necessary

As is the current toy program:
fn main() -> std::io::Result<()> {
    use std::fs;

    let metadata = fs::metadata("foo.txt")?;

    assert!(!metadata.is_dir());
    Ok(())
}

... observed under strace will issue:
[snip]
statx(0, NULL, AT_STATX_SYNC_AS_STAT, STATX_ALL, NULL) = -1 EFAULT (Bad address)
statx(AT_FDCWD, "foo.txt", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_ALL|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=0, ...}) = 0

While statx is not necessarily always present, checking for it can be
delayed to the first error condition. Said condition may very well never
happen, in which case the check got avoided altogether.

Note this is still suboptimal as there still will be programs issuing
it, but bulk of the problem is removed.

Tested by forbidding the syscall for the binary and observing it
correctly falls back to newfstatat.

While here tidy up the commentary, in particular by denoting some
problems with the current approach.
library/std/src/sys/unix/fs.rs