From 8a6f52393ec874e3d401f9faf620ebf5075889dc Mon Sep 17 00:00:00 2001 From: hen Qi Date: Mon, 24 Apr 2023 22:05:17 -0700 Subject: unfs3: fix symlink time setting issue Add back the dropped 0001-attr-fix-utime-for-symlink.patch to fix symlink time setting issue on NFS. The problem could be reproduced by runing the following command on nfs booted qemu: ln -s dest src && touch -h src Apart from the rpm operations mentioned in the original patch, 'docker pull' also fails with a 'stale file' error. The common pattern here is extracting files from a bundle and setting times for them. (From OE-Core rev: fe35a2c11ba6f87735bccae244817016f9c1b5db) Signed-off-by: Chen Qi Signed-off-by: Luca Ceresoli Signed-off-by: Richard Purdie --- .../unfs3/0001-attr-fix-utime-for-symlink.patch | 88 ++++++++++++++++++++++ meta/recipes-devtools/unfs3/unfs3_git.bb | 1 + 2 files changed, 89 insertions(+) create mode 100644 meta/recipes-devtools/unfs3/unfs3/0001-attr-fix-utime-for-symlink.patch diff --git a/meta/recipes-devtools/unfs3/unfs3/0001-attr-fix-utime-for-symlink.patch b/meta/recipes-devtools/unfs3/unfs3/0001-attr-fix-utime-for-symlink.patch new file mode 100644 index 0000000000..a0f3740d6a --- /dev/null +++ b/meta/recipes-devtools/unfs3/unfs3/0001-attr-fix-utime-for-symlink.patch @@ -0,0 +1,88 @@ +From 7e789895919d57d573ebb8faa147d1286104cd01 Mon Sep 17 00:00:00 2001 +From: Rui Wang +Date: Mon, 24 Apr 2023 02:57:57 -0700 +Subject: [PATCH] attr: fix utime for symlink + +unfs3 has an old defect that it can not change the timestamps of a +symlink file because it only uses utime(), which will follow the +symlink. This will not cause an error if the symlink points to an +existent file. But under some special situation, such as installing +a rpm package, rpm tool will create the symlink first and try to +modify the timestamps of it, when the target file is non-existent. +This will cause an ESTALE error. Making rpm tool ignore this error +is a solution, but not the best one. An acceptable approach is +Making unfs3 support lutimes(), which can modify the symlink file +itself. Considering not every system support this function, so a +function checking is necessary. + +Upstream-Status: Submitted [https://github.com/unfs3/unfs3/pull/35] + +Signed-off-by: Chen Qi +--- + attr.c | 15 +++++++++++---- + backend_unix.h | 2 ++ + configure.ac | 1 + + 3 files changed, 14 insertions(+), 4 deletions(-) + +diff --git a/attr.c b/attr.c +index 0ce9375..930ce6e 100644 +--- a/attr.c ++++ b/attr.c +@@ -285,7 +285,7 @@ post_op_attr get_post_cached(struct svc_req * req) + static nfsstat3 set_time(const char *path, backend_statstruct buf, sattr3 new) + { + time_t new_atime, new_mtime; +- struct utimbuf utim; ++ struct timeval stamps[2]; + int res; + + /* set atime and mtime */ +@@ -307,10 +307,17 @@ static nfsstat3 set_time(const char *path, backend_statstruct buf, sattr3 new) + else /* DONT_CHANGE */ + new_mtime = buf.st_mtime; + +- utim.actime = new_atime; +- utim.modtime = new_mtime; ++ stamps[0].tv_sec = new_atime; ++ stamps[0].tv_usec = 0; ++ stamps[1].tv_sec = new_mtime; ++ stamps[1].tv_usec = 0; ++ ++#if HAVE_LUTIMES ++ res = backend_lutimes(path, stamps); ++#else ++ res = backend_utimes(path, stamps); ++#endif + +- res = backend_utime(path, &utim); + if (res == -1) + return setattr_err(); + } +diff --git a/backend_unix.h b/backend_unix.h +index 4db72ae..9cce9ab 100644 +--- a/backend_unix.h ++++ b/backend_unix.h +@@ -61,6 +61,8 @@ + #define backend_symlink symlink + #define backend_truncate truncate + #define backend_utime utime ++#define backend_utimes utimes ++#define backend_lutimes lutimes + #define backend_statstruct struct stat + #define backend_dirstream DIR + #define backend_statvfsstruct struct statvfs +diff --git a/configure.ac b/configure.ac +index d46c905..c21afe3 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -32,6 +32,7 @@ AC_CHECK_FUNCS(setresuid setresgid) + AC_CHECK_FUNCS(vsyslog) + AC_CHECK_FUNCS(lchown) + AC_CHECK_FUNCS(setgroups) ++AC_CHECK_FUNCS(lutimes) + UNFS3_COMPILE_WARNINGS + + PKG_CHECK_MODULES([TIRPC], [libtirpc]) +-- +2.40.0 + diff --git a/meta/recipes-devtools/unfs3/unfs3_git.bb b/meta/recipes-devtools/unfs3/unfs3_git.bb index 9913a503e8..c5b7898b3c 100644 --- a/meta/recipes-devtools/unfs3/unfs3_git.bb +++ b/meta/recipes-devtools/unfs3/unfs3_git.bb @@ -17,6 +17,7 @@ SRC_URI = "git://github.com/unfs3/unfs3.git;protocol=https;branch=master \ file://0001-Alias-off64_t-to-off_t-on-linux-if-not-defined.patch \ file://0001-locate.c-Include-attr.h.patch \ file://0001-fix-building-on-macOS.patch \ + file://0001-attr-fix-utime-for-symlink.patch \ " SRCREV = "c8f2d2cd4529955419bad0e163f88d47ff176b8d" UPSTREAM_CHECK_GITTAGREGEX = "unfs3\-(?P\d+(\.\d+)+)" -- cgit v1.2.3-54-g00ecf