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 | |
| 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>
| -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,  | 
