summaryrefslogtreecommitdiffstats
path: root/xlators/features/index
diff options
context:
space:
mode:
authorRavishankar N <ravishankar@redhat.com>2015-12-07 18:03:03 +0530
committerPranith Kumar Karampuri <pkarampu@redhat.com>2015-12-28 23:25:23 -0800
commitf88369e75fc2482eec68da798d849acaa30c5de8 (patch)
tree5976f6aded643fa87febb1aa663c8b1db3d65def /xlators/features/index
parentc0cc93dfe6fc63caeae9448dc689adcf13ea3aae (diff)
afr: refresh inode using fstat
Backport of http://review.gluster.org/12894 For fd based operations (fgetxattr, readv etc.) if an inode refresh is required, do so using fstat instead of lookup. This is because the file might have been deleted by another client before refresh but posix mandates that FOPS using already open fds must still succeed. Change-Id: Id5f71c3af4892b648eb747f363dffe6208e7ac09 BUG: 1290363 Signed-off-by: Ravishankar N <ravishankar@redhat.com> Reviewed-on: http://review.gluster.org/13040 Tested-by: Gluster Build System <jenkins@build.gluster.com> Tested-by: NetBSD Build System <jenkins@build.gluster.org> Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
Diffstat (limited to 'xlators/features/index')
-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 482292a00f9..3a717def2f6 100644
--- a/xlators/features/index/src/index.c
+++ b/xlators/features/index/src/index.c
@@ -1359,16 +1359,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;
@@ -1382,14 +1380,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)
@@ -1424,7 +1434,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 {
@@ -1436,6 +1446,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)
{
@@ -1815,7 +1855,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;