diff options
-rw-r--r-- | extras/test/ld-preload-test/ld-preload-lib.c | 8 | ||||
-rw-r--r-- | libglusterfs/src/syscall.c | 7 | ||||
-rw-r--r-- | libglusterfs/src/syscall.h | 3 | ||||
-rw-r--r-- | xlators/storage/posix/src/posix.c | 45 |
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, |