summaryrefslogtreecommitdiffstats
path: root/xlators/features/index/src/index.c
diff options
context:
space:
mode:
Diffstat (limited to 'xlators/features/index/src/index.c')
-rw-r--r--xlators/features/index/src/index.c65
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;