about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJacob Pratt <jacob@jhpratt.dev>2024-12-26 21:56:49 -0500
committerGitHub <noreply@github.com>2024-12-26 21:56:49 -0500
commit0521d6cf2cdbde8abc90192f99f0e4b401561716 (patch)
treef458164c8c46c1a35385e36a1e72f26ca91f3e0a
parent9551808f424c6c852e3c836699498afe644fe0bf (diff)
parentf19ba15a2cdc396a353fff70431df23016dc5276 (diff)
downloadrust-0521d6cf2cdbde8abc90192f99f0e4b401561716.tar.gz
rust-0521d6cf2cdbde8abc90192f99f0e4b401561716.zip
Rollup merge of #134649 - SUPERCILEX:statx-remember, r=thomcc
Fix forgetting to save statx availability on success

Looks like we forgot to save the statx state on success which means the first failure (common when checking if a file exists) will always require spending an invalid statx to confirm the failure is real.

r? `@thomcc`
-rw-r--r--library/std/src/sys/pal/unix/fs.rs6
1 files changed, 5 insertions, 1 deletions
diff --git a/library/std/src/sys/pal/unix/fs.rs b/library/std/src/sys/pal/unix/fs.rs
index 37029bcd36e..408f8020c56 100644
--- a/library/std/src/sys/pal/unix/fs.rs
+++ b/library/std/src/sys/pal/unix/fs.rs
@@ -168,7 +168,8 @@ cfg_has_statx! {{
             ) -> c_int
         }
 
-        if STATX_SAVED_STATE.load(Ordering::Relaxed) == STATX_STATE::Unavailable as u8 {
+        let statx_availability = STATX_SAVED_STATE.load(Ordering::Relaxed);
+        if statx_availability == STATX_STATE::Unavailable as u8 {
             return None;
         }
 
@@ -200,6 +201,9 @@ cfg_has_statx! {{
                 return None;
             }
         }
+        if statx_availability == STATX_STATE::Unknown as u8 {
+            STATX_SAVED_STATE.store(STATX_STATE::Present as u8, Ordering::Relaxed);
+        }
 
         // We cannot fill `stat64` exhaustively because of private padding fields.
         let mut stat: stat64 = mem::zeroed();