From 3f4fcb62661059bad77a2e957b4621137797bc2f Mon Sep 17 00:00:00 2001
|
From: Rui Wang <rui.wang@windriver.com>
|
Date: Fri, 15 Jun 2018 14:19:10 +0800
|
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://sourceforge.net/p/unfs3/bugs/12/]
|
|
Signed-off-by: Rui Wang <rui.wang@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 73e5c75..427d0e2 100644
|
--- a/attr.c
|
+++ b/attr.c
|
@@ -280,7 +280,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 */
|
@@ -302,10 +302,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 fbc2af3..813ffd3 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 aeec598..ea7f167 100644
|
--- a/configure.ac
|
+++ b/configure.ac
|
@@ -37,6 +37,7 @@ AC_CHECK_FUNCS(setresuid setresgid)
|
AC_CHECK_FUNCS(vsyslog)
|
AC_CHECK_FUNCS(lchown)
|
AC_CHECK_FUNCS(setgroups)
|
+AC_CHECK_FUNCS(lutimes)
|
UNFS3_SOLARIS_RPC
|
UNFS3_PORTMAP_DEFINE
|
UNFS3_COMPILE_WARNINGS
|