12a457
From a3915b06e7ca6760e4265819f3153e1f05bb7ae4 Mon Sep 17 00:00:00 2001
12a457
From: Pranith Kumar K <pkarampu@redhat.com>
12a457
Date: Fri, 25 Mar 2016 06:04:23 +0530
12a457
Subject: [PATCH 116/139] cluster/afr: Fix read-child selection in entry create fop
12a457
12a457
When an entry is being created the inode is yet to be linked
12a457
so args must be filled with gfid and ia_type for it to give
12a457
consistent iatt.
12a457
12a457
Also handle Dht sending fops on inode not yet linked.
12a457
12a457
 >BUG: 1302948
12a457
 >Change-Id: I6969cacb437cad02f66716f3bf8ec004ffe7c691
12a457
 >Signed-off-by: Pranith Kumar K <pkarampu@redhat.com>
12a457
 >Reviewed-on: http://review.gluster.org/13827
12a457
 >Reviewed-by: Krutika Dhananjay <kdhananj@redhat.com>
12a457
 >Smoke: Gluster Build System <jenkins@build.gluster.com>
12a457
 >Reviewed-by: Anuradha Talur <atalur@redhat.com>
12a457
 >NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
12a457
 >CentOS-regression: Gluster Build System <jenkins@build.gluster.com>
12a457
12a457
BUG: 1298724
12a457
Change-Id: Ia61a8e1e4d8cb1cdea33d5a5251eaa1793de7724
12a457
Signed-off-by: Pranith Kumar K <pkarampu@redhat.com>
12a457
Reviewed-on: https://code.engineering.redhat.com/gerrit/73664
12a457
---
12a457
 xlators/cluster/afr/src/afr-dir-write.c   |   14 ++++++++++-
12a457
 xlators/cluster/afr/src/afr-inode-write.c |   35 +++++++++++++++++++++++++++-
12a457
 2 files changed, 46 insertions(+), 3 deletions(-)
12a457
12a457
diff --git a/xlators/cluster/afr/src/afr-dir-write.c b/xlators/cluster/afr/src/afr-dir-write.c
12a457
index 887298b..3d2b114 100644
12a457
--- a/xlators/cluster/afr/src/afr-dir-write.c
12a457
+++ b/xlators/cluster/afr/src/afr-dir-write.c
12a457
@@ -88,15 +88,27 @@ __afr_dir_write_finalize (call_frame_t *frame, xlator_t *this)
12a457
 	int parent_read_subvol = -1;
12a457
 	int parent2_read_subvol = -1;
12a457
 	int i = 0;
12a457
+        afr_read_subvol_args_t args = {0,};
12a457
 
12a457
 	local = frame->local;
12a457
 	priv = this->private;
12a457
 
12a457
+	for (i = 0; i < priv->child_count; i++) {
12a457
+	        if (!local->replies[i].valid)
12a457
+	                continue;
12a457
+	        if (local->replies[i].op_ret == -1)
12a457
+	                continue;
12a457
+                gf_uuid_copy (args.gfid, local->replies[i].poststat.ia_gfid);
12a457
+                args.ia_type = local->replies[i].poststat.ia_type;
12a457
+                break;
12a457
+        }
12a457
+
12a457
 	if (local->inode) {
12a457
 		afr_replies_interpret (frame, this, local->inode, NULL);
12a457
 		inode_read_subvol = afr_data_subvol_get (local->inode, this,
12a457
-							 NULL, NULL, NULL);
12a457
+							 NULL, NULL, &args);
12a457
 	}
12a457
+
12a457
 	if (local->parent)
12a457
 		parent_read_subvol = afr_data_subvol_get (local->parent, this,
12a457
 							  NULL, NULL, NULL);
12a457
diff --git a/xlators/cluster/afr/src/afr-inode-write.c b/xlators/cluster/afr/src/afr-inode-write.c
12a457
index c86fb49..4206ef2 100644
12a457
--- a/xlators/cluster/afr/src/afr-inode-write.c
12a457
+++ b/xlators/cluster/afr/src/afr-inode-write.c
12a457
@@ -47,18 +47,49 @@ __afr_inode_write_finalize (call_frame_t *frame, xlator_t *this)
12a457
 	afr_private_t *priv = NULL;
12a457
 	int read_subvol = 0;
12a457
 	int i = 0;
12a457
+        afr_read_subvol_args_t args = {0,};
12a457
+        struct iatt  *stbuf = NULL;
12a457
+        int    ret = 0;
12a457
 
12a457
 	local = frame->local;
12a457
 	priv = this->private;
12a457
 
12a457
+        /*This code needs to stay till DHT sends fops on linked
12a457
+         * inodes*/
12a457
+        if (local->inode && !inode_is_linked (local->inode)) {
12a457
+                for (i = 0; i < priv->child_count; i++) {
12a457
+                        if (!local->replies[i].valid)
12a457
+                                continue;
12a457
+                        if (local->replies[i].op_ret == -1)
12a457
+                                continue;
12a457
+                        if (!gf_uuid_is_null
12a457
+                                        (local->replies[i].poststat.ia_gfid)) {
12a457
+                                gf_uuid_copy (args.gfid,
12a457
+                                            local->replies[i].poststat.ia_gfid);
12a457
+                                args.ia_type =
12a457
+                                        local->replies[i].poststat.ia_type;
12a457
+                                break;
12a457
+                        } else {
12a457
+                                ret = dict_get_bin (local->replies[i].xdata,
12a457
+                                                    DHT_IATT_IN_XDATA_KEY,
12a457
+                                                    (void **) &stbuf);
12a457
+                                if (ret)
12a457
+                                        continue;
12a457
+                                gf_uuid_copy (args.gfid, stbuf->ia_gfid);
12a457
+                                args.ia_type = stbuf->ia_type;
12a457
+                                break;
12a457
+                        }
12a457
+                }
12a457
+        }
12a457
+
12a457
 	if (local->inode) {
12a457
 		if (local->transaction.type == AFR_METADATA_TRANSACTION)
12a457
 			read_subvol = afr_metadata_subvol_get (local->inode, this,
12a457
 							       NULL, NULL,
12a457
-                                                               NULL);
12a457
+                                                               &args);
12a457
 		else
12a457
 			read_subvol = afr_data_subvol_get (local->inode, this,
12a457
-							   NULL, NULL, NULL);
12a457
+							   NULL, NULL, &args);
12a457
 	}
12a457
 
12a457
 	local->op_ret = -1;
12a457
-- 
12a457
1.7.1
12a457