diff --git a/crates/wasi/src/filesystem.rs b/crates/wasi/src/filesystem.rs index c5e3b54b1a0f..7abc7e0ae967 100644 --- a/crates/wasi/src/filesystem.rs +++ b/crates/wasi/src/filesystem.rs @@ -752,9 +752,27 @@ impl File { advice: system_interface::fs::Advice, ) -> Result<(), ErrorCode> { use system_interface::fs::FileIoExt as _; - self.run_blocking(move |f| f.advise(offset, len, advice)) - .await?; - Ok(()) + let is_emulated_willneed = cfg!(any(target_os = "macos", target_os = "ios")) + && advice == system_interface::fs::Advice::WillNeed; + match self + .run_blocking(move |f| f.advise(offset, len, advice)) + .await + { + Err(err) => { + let code: ErrorCode = err.into(); + + // Paper over a difference in behavior; we implement + // MADV_WILLNEED on macos via the F_RDADVISE fnctl, + // which errors on out-of-bounds ranges whereas POSIX + // silently succeeds. + if is_emulated_willneed && matches!(code, ErrorCode::FileTooLarge) { + return Ok(()); + } + + Err(code) + } + Ok(()) => Ok(()), + } } pub(crate) async fn set_size(&self, size: u64) -> Result<(), ErrorCode> { diff --git a/tests/wasi.rs b/tests/wasi.rs index 054e9c674983..dc1eec705710 100644 --- a/tests/wasi.rs +++ b/tests/wasi.rs @@ -20,8 +20,6 @@ const KNOWN_FAILURES: &[&str] = &[ "filesystem-read-directory", // FIXME(#11524) "remove_directory_trailing_slashes", - #[cfg(target_vendor = "apple")] - "filesystem-advise", // FIXME(WebAssembly/wasi-testsuite#128) #[cfg(windows)] "fd_fdstat_set_rights",