Mercurial > public > mercurial-scm > hg
diff rust/hg-core/src/vfs.rs @ 50180:be019ac8c1e4 stable
dirstate-v2: don't mmap the data file when on NFS
`mmap` on NFS will trigger a SIGBUS when the mmap'ed file is deleted, which
wouldn't work in our case. Also, the performance advantage of using mmap on
NFS is debatable at best.
author | Rapha?l Gom?s <rgomes@octobus.net> |
---|---|
date | Mon, 28 Nov 2022 12:33:20 +0100 |
parents | ffd4b1f1c9cb |
children | a6b8b1ab9116 |
line wrap: on
line diff
--- a/rust/hg-core/src/vfs.rs Thu Dec 08 16:38:39 2022 +0100 +++ b/rust/hg-core/src/vfs.rs Mon Nov 28 12:33:20 2022 +0100 @@ -172,3 +172,24 @@ pub(crate) fn is_file(path: impl AsRef<Path>) -> Result<bool, HgError> { Ok(fs_metadata(path)?.map_or(false, |meta| meta.is_file())) } + +/// Returns whether the given `path` is on a network file system. +/// Taken from `cargo`'s codebase. +#[cfg(target_os = "linux")] +pub(crate) fn is_on_nfs_mount(path: impl AsRef<Path>) -> bool { + use std::ffi::CString; + use std::mem; + use std::os::unix::prelude::*; + + let path = match CString::new(path.as_ref().as_os_str().as_bytes()) { + Ok(path) => path, + Err(_) => return false, + }; + + unsafe { + let mut buf: libc::statfs = mem::zeroed(); + let r = libc::statfs(path.as_ptr(), &mut buf); + + r == 0 && buf.f_type as u32 == libc::NFS_SUPER_MAGIC as u32 + } +}