[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:
Ayush Ranjan
2020-09-10 10:40:35 -07:00
committed by gVisor bot
parent 9a003835f9
commit 50c99a86d1
4 changed files with 31 additions and 4 deletions
+10
View File
@@ -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.
-4
View File
@@ -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");
+14
View File
@@ -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
+7
View File
@@ -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);