--- posix.c.old 2009-01-26 16:59:40.862728109 +0100 +++ posix.c 2009-01-26 16:59:59.940027594 +0100 @@ -2851,6 +2851,7 @@ { int op_ret = 0; int ret = -1; + struct timeval tv[2] = {{0,0},{0,0}}; if (S_ISDIR (entry->buf.st_mode)) { /* @@ -2875,7 +2876,20 @@ goto out; } } - + + /* + * Preserve atime and mtime + */ + tv[0].tv_sec = entry->buf.st_atim.tv_sec; + tv[1].tv_sec = entry->buf.st_mtim.tv_sec; + ret = utimes(pathname, tv); + if (ret == -1) { + op_ret = -errno; + gf_log (this->name, GF_LOG_DEBUG, + "utimes %s failed: %s", + pathname, strerror (errno)); + goto out; + } } else if ((flags & GF_SET_IF_NOT_PRESENT) || !(flags & GF_SET_DIR_ONLY)) { @@ -2950,6 +2964,21 @@ op_ret = -EINVAL; goto out; } + /* + * Preserve atime and mtime + */ + if(!S_ISLNK(entry->buf.st_mode)){ + tv[0].tv_sec = entry->buf.st_atim.tv_sec; + tv[1].tv_sec = entry->buf.st_mtim.tv_sec; + ret = utimes(pathname, tv); + if (ret == -1) { + op_ret = -errno; + gf_log (this->name, GF_LOG_DEBUG, + "utimes %s failed: %s", + pathname, strerror (errno)); + goto out; + } + } } out: return op_ret;