aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Somers <asomers@FreeBSD.org>2024-01-25 15:19:37 +0000
committerAlan Somers <asomers@FreeBSD.org>2024-02-12 17:43:11 +0000
commit739488cc21b1ad08994aa5c36d85b9c11866b29d (patch)
treeb3cbf9b89dee556978d662c79abd0d6f0e526a1d
parent314a881fce0cd48ee4f67fb924432f53d4de0ea0 (diff)
downloadsrc-739488cc21b1ad08994aa5c36d85b9c11866b29d.tar.gz
src-739488cc21b1ad08994aa5c36d85b9c11866b29d.zip
fusefs: fix invalid value for st_birthtime.tv_nsec
If a file system's on-disk format does not support st_birthtime, it isn't clear what value it should return in stat(2). Neither our man page nor the OpenGroup specifies. But our convention for UFS and msdosfs is to return { .tv_sec = -1, .tv_nsec = 0 }. fusefs is different. It returns { .tv_sec = -1, .tv_nsec = -1 }. It's done that ever since the initial import in SVN r241519. Most software apparently handles this just fine. It must, because we've had no complaints. But the Rust standard library will panic when reading such a timestamp during std::fs::metadata, even if the caller doesn't care about that particular value. That's a separate bug, and should be fixed. Change our invalid value to match msdosfs and ufs, pacifying the Rust standard library. PR: 276602 Sponsored by: Axcient Reviewed by: emaste Differential Revision: https://reviews.freebsd.org/D43590 (cherry picked from commit 55b80e2ca52c4b27c4920d372a6e71ac9ab7da9e)
-rw-r--r--sys/fs/fuse/fuse_internal.c1
-rw-r--r--sys/fs/fuse/fuse_node.c7
-rw-r--r--tests/sys/fs/fusefs/getattr.cc15
-rw-r--r--tests/sys/fs/fusefs/lookup.cc15
4 files changed, 25 insertions, 13 deletions
diff --git a/sys/fs/fuse/fuse_internal.c b/sys/fs/fuse/fuse_internal.c
index e2351e4ac24a..2d1c729a395a 100644
--- a/sys/fs/fuse/fuse_internal.c
+++ b/sys/fs/fuse/fuse_internal.c
@@ -326,7 +326,6 @@ fuse_internal_cache_attrs(struct vnode *vp, struct fuse_attr *attr,
else
return;
- vattr_null(vp_cache_at);
vp_cache_at->va_fsid = mp->mnt_stat.f_fsid.val[0];
vp_cache_at->va_fileid = attr->ino;
vp_cache_at->va_mode = attr->mode & ~S_IFMT;
diff --git a/sys/fs/fuse/fuse_node.c b/sys/fs/fuse/fuse_node.c
index 6a7f2e88831c..1ff67ecf74e4 100644
--- a/sys/fs/fuse/fuse_node.c
+++ b/sys/fs/fuse/fuse_node.c
@@ -156,7 +156,14 @@ fuse_vnode_init(struct vnode *vp, struct fuse_vnode_data *fvdat,
{
fvdat->nid = nodeid;
LIST_INIT(&fvdat->handles);
+
vattr_null(&fvdat->cached_attrs);
+ fvdat->cached_attrs.va_birthtime.tv_sec = -1;
+ fvdat->cached_attrs.va_birthtime.tv_nsec = 0;
+ fvdat->cached_attrs.va_fsid = VNOVAL;
+ fvdat->cached_attrs.va_gen = 0;
+ fvdat->cached_attrs.va_rdev = NODEV;
+
if (nodeid == FUSE_ROOT_ID) {
vp->v_vflag |= VV_ROOT;
}
diff --git a/tests/sys/fs/fusefs/getattr.cc b/tests/sys/fs/fusefs/getattr.cc
index 1795f29a5d76..98a757fdff94 100644
--- a/tests/sys/fs/fusefs/getattr.cc
+++ b/tests/sys/fs/fusefs/getattr.cc
@@ -246,12 +246,15 @@ TEST_F(Getattr, ok)
EXPECT_EQ(ino, sb.st_ino);
EXPECT_EQ(S_IFREG | 0644, sb.st_mode);
- //st_birthtim and st_flags are not supported by protocol 7.8. They're
- //only supported as OS-specific extensions to OSX.
- //EXPECT_EQ(, sb.st_birthtim);
- //EXPECT_EQ(, sb.st_flags);
-
- //FUSE can't set st_blksize until protocol 7.9
+ /*
+ * st_birthtim and st_flags are not supported by the fuse protocol.
+ * They're only supported as OS-specific extensions to OSX. For
+ * birthtime, the convention for "not supported" is "negative one
+ * second".
+ */
+ EXPECT_EQ(-1, sb.st_birthtim.tv_sec);
+ EXPECT_EQ(0, sb.st_birthtim.tv_nsec);
+ EXPECT_EQ(0u, sb.st_flags);
}
/*
diff --git a/tests/sys/fs/fusefs/lookup.cc b/tests/sys/fs/fusefs/lookup.cc
index 549df0369fa7..6d506c1ab700 100644
--- a/tests/sys/fs/fusefs/lookup.cc
+++ b/tests/sys/fs/fusefs/lookup.cc
@@ -112,12 +112,15 @@ TEST_F(Lookup, attr_cache)
// fuse(4) does not _yet_ support inode generations
//EXPECT_EQ(generation, sb.st_gen);
- //st_birthtim and st_flags are not supported by protocol 7.8. They're
- //only supported as OS-specific extensions to OSX.
- //EXPECT_EQ(, sb.st_birthtim);
- //EXPECT_EQ(, sb.st_flags);
-
- //FUSE can't set st_blksize until protocol 7.9
+ /*
+ * st_birthtim and st_flags are not supported by the fuse protocol.
+ * They're only supported as OS-specific extensions to OSX. For
+ * birthtime, the convention for "not supported" is "negative one
+ * second".
+ */
+ EXPECT_EQ(-1, sb.st_birthtim.tv_sec);
+ EXPECT_EQ(0, sb.st_birthtim.tv_nsec);
+ EXPECT_EQ(0u, sb.st_flags);
}
/*