diff options
Diffstat (limited to 'xlators/storage/posix/src/posix-handle.c')
-rw-r--r-- | xlators/storage/posix/src/posix-handle.c | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/xlators/storage/posix/src/posix-handle.c b/xlators/storage/posix/src/posix-handle.c index a3a8ea464d3..0bb4c055a3c 100644 --- a/xlators/storage/posix/src/posix-handle.c +++ b/xlators/storage/posix/src/posix-handle.c @@ -23,6 +23,7 @@ #include "xlator.h" #include "syscall.h" #include "posix-messages.h" +#include "posix-metadata.h" #include "compat-errno.h" @@ -36,7 +37,7 @@ posix_resolve (xlator_t *this, inode_table_t *itable, inode_t *parent, inode_t *inode = NULL; int ret = -1; - ret = posix_istat (this, parent->gfid, bname, iabuf); + ret = posix_istat (this, NULL, parent->gfid, bname, iabuf); if (ret < 0) { gf_log (this->name, GF_LOG_WARNING, "gfid: %s, bname: %s " "failed", uuid_utoa (parent->gfid), bname); @@ -53,6 +54,19 @@ posix_resolve (xlator_t *this, inode_table_t *itable, inode_t *parent, } } + /* posix_istat wouldn't have fetched posix_mdata_t i.e., + * time attributes as inode is passed as NULL, hence get + * here once you got the inode + */ + ret = posix_get_mdata_xattr (this, NULL, -1, inode, iabuf); + 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; + } + /* Linking an inode here, can cause a race in posix_acl. Parent inode gets linked here, but before it reaches posix_acl_readdirp_cbk, create/lookup can @@ -939,8 +953,10 @@ posix_handle_unset (xlator_t *this, uuid_t gfid, const char *basename) return -1; } - ret = posix_istat (this, gfid, basename, &stat); - + /* stat is being used only for gfid, so passing a NULL inode + * doesn't fetch time attributes which is fine + */ + ret = posix_istat (this, NULL, gfid, basename, &stat); if (ret == -1) { gf_msg (this->name, GF_LOG_WARNING, errno, P_MSG_HANDLE_DELETE, "%s", path); |