mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
[vfs] Disable nlink tests for overlayfs.
Overlayfs intentionally does not compute nlink for directories (because it can be really expensive). Linux returns 1, VFS2 returns 2 and VFS1 actually calculates the correct value. PiperOrigin-RevId: 330967139
This commit is contained in:
@@ -97,6 +97,11 @@ TEST_F(StatTest, FstatatSymlink) {
|
||||
}
|
||||
|
||||
TEST_F(StatTest, Nlinks) {
|
||||
// Skip this test if we are testing overlayfs because overlayfs does not
|
||||
// (intentionally) return the correct nlink value for directories.
|
||||
// See fs/overlayfs/inode.c:ovl_getattr().
|
||||
SKIP_IF(ASSERT_NO_ERRNO_AND_VALUE(IsOverlayfs(GetAbsoluteTestTmpdir())));
|
||||
|
||||
TempPath basedir = ASSERT_NO_ERRNO_AND_VALUE(TempPath::CreateDir());
|
||||
|
||||
// Directory is initially empty, it should contain 2 links (one from itself,
|
||||
@@ -432,6 +437,11 @@ TEST_F(StatTest, ZeroLinksOpenFdRegularFileChild_NoRandomSave) {
|
||||
|
||||
// Test link counts with a directory as the child.
|
||||
TEST_F(StatTest, LinkCountsWithDirChild) {
|
||||
// Skip this test if we are testing overlayfs because overlayfs does not
|
||||
// (intentionally) return the correct nlink value for directories.
|
||||
// See fs/overlayfs/inode.c:ovl_getattr().
|
||||
SKIP_IF(ASSERT_NO_ERRNO_AND_VALUE(IsOverlayfs(GetAbsoluteTestTmpdir())));
|
||||
|
||||
const TempPath dir = ASSERT_NO_ERRNO_AND_VALUE(TempPath::CreateDir());
|
||||
|
||||
// Before a child is added the two links are "." and the link from the parent.
|
||||
|
||||
@@ -27,10 +27,6 @@ namespace testing {
|
||||
|
||||
namespace {
|
||||
|
||||
// From linux/magic.h. For some reason, not defined in the headers for some
|
||||
// build environments.
|
||||
#define OVERLAYFS_SUPER_MAGIC 0x794c7630
|
||||
|
||||
TEST(StatfsTest, CannotStatBadPath) {
|
||||
auto temp_file = NewTempAbsPathInDir("/tmp");
|
||||
|
||||
|
||||
@@ -649,5 +649,19 @@ PosixErrorOr<bool> IsTmpfs(const std::string& path) {
|
||||
}
|
||||
#endif // __linux__
|
||||
|
||||
PosixErrorOr<bool> IsOverlayfs(const std::string& path) {
|
||||
struct statfs stat;
|
||||
if (statfs(path.c_str(), &stat)) {
|
||||
if (errno == ENOENT) {
|
||||
// Nothing at path, don't raise this as an error. Instead, just report no
|
||||
// overlayfs at path.
|
||||
return false;
|
||||
}
|
||||
return PosixError(errno,
|
||||
absl::StrFormat("statfs(\"%s\", %#p)", path, &stat));
|
||||
}
|
||||
return stat.f_type == OVERLAYFS_SUPER_MAGIC;
|
||||
}
|
||||
|
||||
} // namespace testing
|
||||
} // namespace gvisor
|
||||
|
||||
@@ -38,6 +38,10 @@ constexpr int kOLargeFile = 00400000;
|
||||
#error "Unknown architecture"
|
||||
#endif
|
||||
|
||||
// From linux/magic.h. For some reason, not defined in the headers for some
|
||||
// build environments.
|
||||
#define OVERLAYFS_SUPER_MAGIC 0x794c7630
|
||||
|
||||
// Returns a status or the current working directory.
|
||||
PosixErrorOr<std::string> GetCWD();
|
||||
|
||||
@@ -184,6 +188,9 @@ PosixErrorOr<std::string> ProcessExePath(int pid);
|
||||
PosixErrorOr<bool> IsTmpfs(const std::string& path);
|
||||
#endif // __linux__
|
||||
|
||||
// IsOverlayfs returns true if the file at path is backed by overlayfs.
|
||||
PosixErrorOr<bool> IsOverlayfs(const std::string& path);
|
||||
|
||||
namespace internal {
|
||||
// Not part of the public API.
|
||||
std::string JoinPathImpl(std::initializer_list<absl::string_view> paths);
|
||||
|
||||
Reference in New Issue
Block a user