diff options
author | Kotresh HR <khiremat@redhat.com> | 2019-04-09 18:23:05 +0530 |
---|---|---|
committer | Amar Tumballi <amarts@redhat.com> | 2019-04-15 02:23:44 +0000 |
commit | c56f102da21c5b69e656a055aaf736281596284d (patch) | |
tree | 5c8c208dcaa9bf5abc886f7f469ba9c046bf148a /xlators/storage/posix/src/posix-helpers.c | |
parent | bcd1207fcd8e7cc278971e16a781bca3c1606969 (diff) |
posix/ctime: Fix stat(time attributes) inconsistency during readdirp
Problem:
Creation of tar file on gluster volume throws warning
'file changed as we read it'
Cause:
During readdirp, for few of the files whose inode is not
present, time attributes were served from backend. This caused
the ctime of few files to be different between before readdir
and after readdir by tar.
Solution:
If ctime feature is enabled and inode is not present, don't
serve the time attributes from backend file, serve it from xattr.
fixes: bz#1698078
Change-Id: I427ef865f97399475faf5aa6ca495f7e317603ae
Signed-off-by: Kotresh HR <khiremat@redhat.com>
Diffstat (limited to 'xlators/storage/posix/src/posix-helpers.c')
-rw-r--r-- | xlators/storage/posix/src/posix-helpers.c | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/xlators/storage/posix/src/posix-helpers.c b/xlators/storage/posix/src/posix-helpers.c index c7ab13d1163..d0fd45a805a 100644 --- a/xlators/storage/posix/src/posix-helpers.c +++ b/xlators/storage/posix/src/posix-helpers.c @@ -832,17 +832,26 @@ posix_pstat(xlator_t *this, inode_t *inode, uuid_t gfid, const char *path, iatt_from_stat(&stbuf, &lstatbuf); - if (inode && priv->ctime) { - if (!inode_locked) { - ret = posix_get_mdata_xattr(this, path, -1, inode, &stbuf); + if (priv->ctime) { + if (inode) { + if (!inode_locked) { + ret = posix_get_mdata_xattr(this, path, -1, inode, &stbuf); + } else { + ret = __posix_get_mdata_xattr(this, path, -1, 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(inode->gfid)); + goto out; + } } else { - ret = __posix_get_mdata_xattr(this, path, -1, 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(inode->gfid)); - goto out; + ret = __posix_get_mdata_xattr(this, path, -1, NULL, &stbuf); + if (ret) { + gf_msg(this->name, GF_LOG_WARNING, errno, P_MSG_GETMDATA_FAILED, + "posix get mdata failed on path: %s", path); + goto out; + } } } |