diff options
Diffstat (limited to 'xlators/storage/posix/src/posix-helpers.c')
-rw-r--r-- | xlators/storage/posix/src/posix-helpers.c | 52 |
1 files changed, 42 insertions, 10 deletions
diff --git a/xlators/storage/posix/src/posix-helpers.c b/xlators/storage/posix/src/posix-helpers.c index 0ca9169e2f4..00118b2d123 100644 --- a/xlators/storage/posix/src/posix-helpers.c +++ b/xlators/storage/posix/src/posix-helpers.c @@ -1620,14 +1620,14 @@ unlock: } static int -is_fresh_file (struct stat *stat) +is_fresh_file (int64_t ctime_sec) { struct timeval tv; gettimeofday (&tv, NULL); - if ((stat->st_ctime >= (tv.tv_sec - 1)) - && (stat->st_ctime <= tv.tv_sec)) + if ((ctime_sec >= (tv.tv_sec - 1)) + && (ctime_sec <= tv.tv_sec)) return 1; return 0; @@ -1665,19 +1665,51 @@ posix_gfid_heal (xlator_t *this, const char *path, loc_t *loc, dict_t *xattr_req uuid_t uuid_curr; int ret = 0; struct stat stat = {0, }; + struct iatt stbuf = {0, }; + struct posix_private *priv = NULL; + + priv = this->private; if (!xattr_req) return 0; - if (sys_lstat (path, &stat) != 0) { - return -errno; - } - - ret = sys_lgetxattr (path, GFID_XATTR_KEY, uuid_curr, 16); - if (ret != 16) { - if (is_fresh_file (&stat)) { + if (loc->inode && priv->ctime) { + if (sys_lstat (path, &stat) != 0) { + return -errno; + } + /* stbuf is only to compare ctime, don't use it to access + * other fields as they are zero. */ + ret = posix_get_mdata_xattr (this, path, -1, loc->inode, + &stbuf); + if (ret) { + gf_msg (this->name, GF_LOG_WARNING, errno, + P_MSG_GETMDATA_FAILED, + "posix get mdata failed on gfid: %s", + uuid_utoa(loc->inode->gfid)); return -ENOENT; } + ret = sys_lgetxattr (path, GFID_XATTR_KEY, uuid_curr, 16); + if (ret != 16) { + if (is_fresh_file (stbuf.ia_ctime)) { + gf_msg (this->name, GF_LOG_ERROR, ENOENT, + P_MSG_FRESHFILE, + "Fresh file: %s", path); + return -ENOENT; + } + } + } else { + if (sys_lstat (path, &stat) != 0) { + return -errno; + } + ret = sys_lgetxattr (path, GFID_XATTR_KEY, uuid_curr, 16); + if (ret != 16) { + if (is_fresh_file (stat.st_ctime)) { + gf_msg (this->name, GF_LOG_ERROR, ENOENT, + P_MSG_FRESHFILE, + "Fresh file: %s", path); + return -ENOENT; + } + } } posix_gfid_set (this, path, loc, xattr_req); |