diff options
Diffstat (limited to 'meta/recipes-devtools/unfs3/unfs3/0001-attr-fix-utime-for-symlink.patch')
-rw-r--r-- | meta/recipes-devtools/unfs3/unfs3/0001-attr-fix-utime-for-symlink.patch | 88 |
1 files changed, 88 insertions, 0 deletions
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 <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 + |