From cec4d4303f6475475d1a632cca506e8a82072d25 Mon Sep 17 00:00:00 2001 From: Dave Vasilevsky Date: Tue, 25 Nov 2025 03:55:45 +0000 Subject: [PATCH] os: allow direntries to have zero inodes on Linux Some Linux filesystems have been known to return valid enties with zero inodes. This new behavior also puts Go in agreement with recent glibc. Fixes #76428 Change-Id: Ieaf50739a294915a3ea2ef8c5a3bb2a91a186881 GitHub-Last-Rev: 8f83d009ef0320fd3fe7cf03e55d5d24df57f015 GitHub-Pull-Request: golang/go#76448 Reviewed-on: https://go-review.googlesource.com/c/go/+/724220 Reviewed-by: Cherry Mui Reviewed-by: Ian Lance Taylor Auto-Submit: Ian Lance Taylor Reviewed-by: Dmitri Shuralyov LUCI-TryBot-Result: Go LUCI --- src/os/dir_unix.go | 3 ++- src/syscall/dirent.go | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/os/dir_unix.go b/src/os/dir_unix.go index 6a0135b70b..87df3122d4 100644 --- a/src/os/dir_unix.go +++ b/src/os/dir_unix.go @@ -112,7 +112,8 @@ func (f *File) readdir(n int, mode readdirMode) (names []string, dirents []DirEn // or might expose a remote file system which does not have the concept // of inodes. Therefore, we cannot make the assumption that it is safe // to skip entries with zero inodes. - if ino == 0 && runtime.GOOS != "wasip1" { + // Some Linux filesystems (old XFS, FUSE) can return valid files with zero inodes. + if ino == 0 && runtime.GOOS != "linux" && runtime.GOOS != "wasip1" { continue } const namoff = uint64(unsafe.Offsetof(syscall.Dirent{}.Name)) diff --git a/src/syscall/dirent.go b/src/syscall/dirent.go index c12b119335..0094641270 100644 --- a/src/syscall/dirent.go +++ b/src/syscall/dirent.go @@ -73,8 +73,8 @@ func ParseDirent(buf []byte, max int, names []string) (consumed int, count int, break } // See src/os/dir_unix.go for the reason why this condition is - // excluded on wasip1. - if ino == 0 && runtime.GOOS != "wasip1" { // File absent in directory. + // excluded on wasip1 and linux. + if ino == 0 && runtime.GOOS != "linux" && runtime.GOOS != "wasip1" { // File absent in directory. continue } const namoff = uint64(unsafe.Offsetof(Dirent{}.Name)) -- 2.52.0