diff options
author | karthik-us <ksubrahm@redhat.com> | 2016-06-27 17:17:56 +0530 |
---|---|---|
committer | Jeff Darcy <jeff@pl.atyp.us> | 2017-10-05 12:57:35 +0000 |
commit | 601b6547f2c53651b88a0560a41d702db06c0d1c (patch) | |
tree | 0dff616cdea5e426cc1b71135cb42d6859ca7dcb /xlators/storage/posix/src | |
parent | b887915bd30ac98bbc64c6dcac73605cd96855ca (diff) |
storage/posix: Adding implementation for posix_do_futimes
Adding the implementation for the posix_do_futimes function which is
not complete in the current implementation and giving the ENOSYS error.
Change-Id: I9cfc95a7ea293b0a2df8efd4ac80d0120b3120e4
BUG: 1350406
Signed-off-by: karthik-us <ksubrahm@redhat.com>
Diffstat (limited to 'xlators/storage/posix/src')
-rw-r--r-- | xlators/storage/posix/src/posix.c | 45 |
1 files changed, 37 insertions, 8 deletions
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, |