diff options
author | Marius Bakke <mbakke@fastmail.com> | 2020-02-26 22:13:11 +0100 |
---|---|---|
committer | Marius Bakke <mbakke@fastmail.com> | 2020-02-26 22:13:11 +0100 |
commit | 7fe962788ac330fce18d7cc39f613bb1f961d6ea (patch) | |
tree | d8f61f1fb2263d9186157202725ca8fe7b7dd896 /nix/libstore | |
parent | 9844848b23860136da54193b725b6653b4e9d8ee (diff) | |
parent | 2e4011465b6c0757c45ddf118c9f406df045b376 (diff) | |
download | patches-7fe962788ac330fce18d7cc39f613bb1f961d6ea.tar patches-7fe962788ac330fce18d7cc39f613bb1f961d6ea.tar.gz |
Merge branch 'master' into staging
Diffstat (limited to 'nix/libstore')
-rw-r--r-- | nix/libstore/gc.cc | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/nix/libstore/gc.cc b/nix/libstore/gc.cc index 77d7fa2dc7..8bc4e01eb0 100644 --- a/nix/libstore/gc.cc +++ b/nix/libstore/gc.cc @@ -581,15 +581,27 @@ void LocalStore::removeUnusedLinks(const GCState & state) #ifdef HAVE_STATX # define st_size stx_size # define st_nlink stx_nlink + static int statx_flags = AT_SYMLINK_NOFOLLOW | AT_STATX_DONT_SYNC; struct statx st; - if (statx(AT_FDCWD, path.c_str(), - AT_SYMLINK_NOFOLLOW | AT_STATX_DONT_SYNC, - STATX_SIZE | STATX_NLINK, &st) == -1) + + if (statx(AT_FDCWD, path.c_str(), statx_flags, + STATX_SIZE | STATX_NLINK, &st) == -1) { + if (errno == EINVAL) { + /* Old 3.10 kernels (CentOS 7) don't support + AT_STATX_DONT_SYNC, so try again without it. */ + statx_flags &= ~AT_STATX_DONT_SYNC; + if (statx(AT_FDCWD, path.c_str(), statx_flags, + STATX_SIZE | STATX_NLINK, &st) == -1) + throw SysError(format("statting `%1%'") % path); + } else { + throw SysError(format("statting `%1%'") % path); + } + } #else struct stat st; if (lstat(path.c_str(), &st) == -1) -#endif throw SysError(format("statting `%1%'") % path); +#endif if (st.st_nlink != 1) { actualSize += st.st_size; |