diff options
author | Kinglong Mee <mijinlong@open-fs.com> | 2018-04-09 08:33:51 -0400 |
---|---|---|
committer | Kinglong Mee <mijinlong@open-fs.com> | 2018-04-10 21:14:44 -0400 |
commit | d206fab73f6815c927a84171ee9361c9b31557b1 (patch) | |
tree | 3198bfadd3a34f9d59c8015eba17a510f7cfff08 /xlators/storage | |
parent | 25b8139c74ae3127905a86dd5f834c39746ad8d7 (diff) |
storage/posix: add pgfid in readdirp if needed
Change-Id: I6745428fd9d4e402bf2cad52cee8ab46b7fd822f
fixes: bz#1560319
Signed-off-by: Kinglong Mee <mijinlong@open-fs.com>
Diffstat (limited to 'xlators/storage')
-rw-r--r-- | xlators/storage/posix/src/posix-inode-fd-ops.c | 46 |
1 files changed, 38 insertions, 8 deletions
diff --git a/xlators/storage/posix/src/posix-inode-fd-ops.c b/xlators/storage/posix/src/posix-inode-fd-ops.c index c6779356f66..62f2c2aa1ee 100644 --- a/xlators/storage/posix/src/posix-inode-fd-ops.c +++ b/xlators/storage/posix/src/posix-inode-fd-ops.c @@ -4901,14 +4901,22 @@ posix_d_type_from_ia_type (ia_type_t type) int posix_readdirp_fill (xlator_t *this, fd_t *fd, gf_dirent_t *entries, dict_t *dict) { - gf_dirent_t *entry = NULL; - inode_table_t *itable = NULL; - inode_t *inode = NULL; - char *hpath = NULL; - int len = 0; - struct iatt stbuf = {0, }; - uuid_t gfid; - int ret = -1; + struct posix_private *priv = NULL; + char *pgfid_xattr_key = NULL; + posix_inode_ctx_t *ctx = NULL; + gf_dirent_t *entry = NULL; + inode_table_t *itable = NULL; + inode_t *inode = NULL; + char *hpath = NULL; + int len = 0; + struct iatt stbuf = {0, }; + uuid_t gfid; + int ret = -1; + int32_t op_ret = -1; + int32_t op_errno = 0; + int32_t nlink_samepgfid = 0; + + priv = this->private; if (list_empty(&entries->list)) return 0; @@ -4970,6 +4978,28 @@ posix_readdirp_fill (xlator_t *this, fd_t *fd, gf_dirent_t *entries, dict_t *dic } #endif + if (priv->update_pgfid_nlinks && !IA_ISDIR (stbuf.ia_type)) { + MAKE_PGFID_XATTR_KEY (pgfid_xattr_key, + PGFID_XATTR_KEY_PREFIX, + fd->inode->gfid); + + op_ret = posix_inode_ctx_get_all (entry->inode, this, + &ctx); + if (op_ret < 0) + continue; + + pthread_mutex_lock (&ctx->pgfid_lock); + { + SET_PGFID_XATTR_IF_ABSENT (hpath, + pgfid_xattr_key, + nlink_samepgfid, + XATTR_CREATE, op_ret, + this, unlock); + } +unlock: + pthread_mutex_unlock (&ctx->pgfid_lock); + } + inode = NULL; } |