diff options
Diffstat (limited to 'xlators/features/index/src/index.c')
-rw-r--r-- | xlators/features/index/src/index.c | 65 |
1 files changed, 53 insertions, 12 deletions
diff --git a/xlators/features/index/src/index.c b/xlators/features/index/src/index.c index 8350e79c412..6e4071ab539 100644 --- a/xlators/features/index/src/index.c +++ b/xlators/features/index/src/index.c @@ -1353,16 +1353,14 @@ out: return count; } -int32_t -index_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this, - int32_t op_ret, int32_t op_errno, inode_t *inode, - struct iatt *buf, dict_t *xdata, struct iatt *postparent) +dict_t* +index_fill_link_count (xlator_t *this, dict_t *xdata) { - int ret = -1; - char *dir = NULL; - index_priv_t *priv = this->private; - int64_t count = -1; + int ret = -1; + index_priv_t *priv = NULL; + int64_t count = -1; + priv = this->private; xdata = (xdata) ? dict_ref (xdata) : dict_new (); if (!xdata) goto out; @@ -1376,14 +1374,26 @@ index_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this, if (count == 0) { ret = dict_set_int8 (xdata, "link-count", 0); if (ret < 0) - goto out; + gf_log (this->name, GF_LOG_ERROR, + "Unable to set link-count"); } else { ret = dict_set_int8 (xdata, "link-count", 1); if (ret < 0) - goto out; + gf_log (this->name, GF_LOG_ERROR, + "Unable to set link-count"); } out: + return xdata; +} + +int32_t +index_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this, + int32_t op_ret, int32_t op_errno, inode_t *inode, + struct iatt *buf, dict_t *xdata, struct iatt *postparent) +{ + + xdata = index_fill_link_count (this, xdata); STACK_UNWIND_STRICT (lookup, frame, op_ret, op_errno, inode, buf, xdata, postparent); if (xdata) @@ -1418,7 +1428,7 @@ index_lookup (call_frame_t *frame, xlator_t *this, return 0; normal: ret = dict_get_str (xattr_req, "link-count", &flag); - if (!(ret || strcmp (flag, GF_XATTROP_INDEX_COUNT))) { + if ((ret == 0) && (strcmp (flag, GF_XATTROP_INDEX_COUNT) == 0)) { STACK_WIND (frame, index_lookup_cbk, FIRST_CHILD(this), FIRST_CHILD(this)->fops->lookup, loc, xattr_req); } else { @@ -1430,6 +1440,36 @@ normal: } int32_t +index_fstat_cbk (call_frame_t *frame, void *cookie, xlator_t *this, + int32_t op_ret, int32_t op_errno, struct iatt *buf, + dict_t *xdata) +{ + xdata = index_fill_link_count (this, xdata); + STACK_UNWIND_STRICT (fstat, frame, op_ret, op_errno, buf, xdata); + if (xdata) + dict_unref (xdata); + return 0; +} + +int32_t +index_fstat (call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *xdata) +{ + int ret = -1; + char *flag = NULL; + + ret = dict_get_str (xdata, "link-count", &flag); + if ((ret == 0) && (strcmp (flag, GF_XATTROP_INDEX_COUNT) == 0)) { + STACK_WIND (frame, index_fstat_cbk, FIRST_CHILD(this), + FIRST_CHILD(this)->fops->fstat, fd, xdata); + } else { + STACK_WIND (frame, default_fstat_cbk, FIRST_CHILD(this), + FIRST_CHILD(this)->fops->fstat, fd, xdata); + } + + return 0; +} + +int32_t index_opendir (call_frame_t *frame, xlator_t *this, loc_t *loc, fd_t *fd, dict_t *xdata) { @@ -1809,7 +1849,8 @@ struct xlator_fops fops = { .lookup = index_lookup, .opendir = index_opendir, .readdir = index_readdir, - .unlink = index_unlink + .unlink = index_unlink, + .fstat = index_fstat, }; struct xlator_dumpops dumpops; |