summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--extras/test/ld-preload-test/ld-preload-lib.c8
-rw-r--r--libglusterfs/src/syscall.c7
-rw-r--r--libglusterfs/src/syscall.h3
-rw-r--r--xlators/storage/posix/src/posix.c45
4 files changed, 55 insertions, 8 deletions
diff --git a/extras/test/ld-preload-test/ld-preload-lib.c b/extras/test/ld-preload-test/ld-preload-lib.c
index 8f74a25cf68..179bf8b05d0 100644
--- a/extras/test/ld-preload-test/ld-preload-lib.c
+++ b/extras/test/ld-preload-test/ld-preload-lib.c
@@ -293,6 +293,14 @@ utimes (const char *path, const struct timeval times[2])
}
int
+futimes (int fd, const struct timeval times[2])
+{
+ intercept ("futimes", 2);
+ set_errno ();
+ return -1;
+}
+
+int
utime (const char *path, const struct utimbuf *buf)
{
intercept ("utime", 2);
diff --git a/libglusterfs/src/syscall.c b/libglusterfs/src/syscall.c
index 3a3d5318baa..bdbbbf2fc0e 100644
--- a/libglusterfs/src/syscall.c
+++ b/libglusterfs/src/syscall.c
@@ -283,6 +283,13 @@ sys_utimensat (int dirfd, const char *filename, const struct timespec times[2],
int
+sys_futimes (int fd, const struct timeval times[2])
+{
+ return futimes (fd, times);
+}
+
+
+int
sys_creat (const char *pathname, mode_t mode)
{
return sys_open(pathname, O_CREAT | O_TRUNC | O_WRONLY, mode);
diff --git a/libglusterfs/src/syscall.h b/libglusterfs/src/syscall.h
index 0cb61b66d36..032ff70ffb6 100644
--- a/libglusterfs/src/syscall.h
+++ b/libglusterfs/src/syscall.h
@@ -137,6 +137,9 @@ sys_utimensat (int dirfd, const char *filename, const struct timespec times[2],
#endif
int
+sys_futimes (int fd, const struct timeval times[2]);
+
+int
sys_creat (const char *pathname, mode_t mode);
ssize_t
diff --git a/xlators/storage/posix/src/posix.c b/xlators/storage/posix/src/posix.c
index d487016d500..117a58ce96c 100644
--- a/xlators/storage/posix/src/posix.c
+++ b/xlators/storage/posix/src/posix.c
@@ -640,15 +640,44 @@ posix_do_fchmod (xlator_t *this,
}
static int
-posix_do_futimes (xlator_t *this,
- int fd,
- struct iatt *stbuf)
+posix_do_futimes (xlator_t *this, int fd, struct iatt *stbuf, int valid)
{
- gf_msg (this->name, GF_LOG_WARNING, ENOSYS, P_MSG_UNKNOWN_OP,
- "function not implemented fd(%d)", fd);
+ int32_t ret = -1;
+ struct timeval tv[2] = { {0,}, {0,} };
+ struct stat stat = {0,};
- errno = ENOSYS;
- return -1;
+ ret = sys_fstat (fd, &stat);
+ if (ret != 0) {
+ gf_msg (this->name, GF_LOG_WARNING, errno,
+ P_MSG_FILE_OP_FAILED, "%d", fd);
+ goto out;
+ }
+
+ if ((valid & GF_SET_ATTR_ATIME) == GF_SET_ATTR_ATIME) {
+ tv[0].tv_sec = stbuf->ia_atime;
+ tv[0].tv_usec = stbuf->ia_atime_nsec / 1000;
+ } else {
+ /* atime is not given, use current values */
+ tv[0].tv_sec = ST_ATIM_SEC (&stat);
+ tv[0].tv_usec = ST_ATIM_NSEC (&stat) / 1000;
+ }
+
+ if ((valid & GF_SET_ATTR_MTIME) == GF_SET_ATTR_MTIME) {
+ tv[1].tv_sec = stbuf->ia_mtime;
+ tv[1].tv_usec = stbuf->ia_mtime_nsec / 1000;
+ } else {
+ /* mtime is not given, use current values */
+ tv[1].tv_sec = ST_MTIM_SEC (&stat);
+ tv[1].tv_usec = ST_MTIM_NSEC (&stat) / 1000;
+ }
+
+ ret = sys_futimes (fd, tv);
+ if (ret == -1)
+ gf_msg (this->name, GF_LOG_ERROR, errno, P_MSG_FUTIMES_FAILED,
+ "%d", fd);
+
+out:
+ return ret;
}
int
@@ -709,7 +738,7 @@ posix_fsetattr (call_frame_t *frame, xlator_t *this,
}
if (valid & (GF_SET_ATTR_ATIME | GF_SET_ATTR_MTIME)) {
- op_ret = posix_do_futimes (this, pfd->fd, stbuf);
+ op_ret = posix_do_futimes (this, pfd->fd, stbuf, valid);
if (op_ret == -1) {
op_errno = errno;
gf_msg (this->name, GF_LOG_ERROR, errno,