mirror of
https://git.yoctoproject.org/poky
synced 2026-04-17 18:32:12 +02:00
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 <Qi.Chen@windriver.com> Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
From 7e789895919d57d573ebb8faa147d1286104cd01 Mon Sep 17 00:00:00 2001
|
||||
From: Rui Wang <rui.wang@windriver.com>
|
||||
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 <Qi.Chen@windriver.com>
|
||||
---
|
||||
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
|
||||
|
||||
@@ -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<pver>\d+(\.\d+)+)"
|
||||
|
||||
Reference in New Issue
Block a user