summaryrefslogtreecommitdiffstats
path: root/xlators/cluster/afr/src/afr-dir-write.c
diff options
context:
space:
mode:
authorKrutika Dhananjay <kdhananj@redhat.com>2015-01-22 17:02:20 +0530
committerNiels de Vos <ndevos@redhat.com>2015-02-05 06:52:45 -0800
commitbb2df4e63fa8a5d65f18b4a5efc757e8d475fbff (patch)
tree06dcfb75c7c12fec9c4458b1f14c5dbd29d48adb /xlators/cluster/afr/src/afr-dir-write.c
parentc0419befa9d0d470a921863cd700d778ce5da194 (diff)
cluster/afr: When parent and entry read subvols are different, set entry->inode to NULL
Backport of: http://review.gluster.org/#/c/9477 That way a lookup would be forced on the entry, and its attributes will always be selected from its read subvol. Additionally, directory write fops as well as LOOKUP have been made to unwind parent attributes from parent's read child in AFR. Change-Id: I9fca49fa91cc3a65f53db855fedb90b08f1ca7f4 BUG: 1186121 Signed-off-by: Krutika Dhananjay <kdhananj@redhat.com> Reviewed-on: http://review.gluster.org/9504 Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com> Tested-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
Diffstat (limited to 'xlators/cluster/afr/src/afr-dir-write.c')
-rw-r--r--xlators/cluster/afr/src/afr-dir-write.c29
1 files changed, 19 insertions, 10 deletions
diff --git a/xlators/cluster/afr/src/afr-dir-write.c b/xlators/cluster/afr/src/afr-dir-write.c
index 3cdec64536d..f996181cd2e 100644
--- a/xlators/cluster/afr/src/afr-dir-write.c
+++ b/xlators/cluster/afr/src/afr-dir-write.c
@@ -80,26 +80,35 @@ __dir_entry_fop_common_cbk (call_frame_t *frame, int child_index,
struct iatt *postparent, struct iatt *prenewparent,
struct iatt *postnewparent)
{
- afr_local_t *local = NULL;
+ afr_local_t *local = NULL;
+ inode_t *parent = NULL;
+ inode_t *parent2 = NULL;
local = frame->local;
+ parent = local->loc.parent;
+ parent2 = local->newloc.parent;
+
if (afr_fop_failed (op_ret, op_errno))
afr_transaction_fop_failed (frame, this, child_index);
if (op_ret > -1) {
local->op_ret = op_ret;
+ AFR_UPDATE_PARENT_BUF (parent, this, child_index, local,
+ local->cont.dir_fop.preparent,
+ local->cont.dir_fop.postparent,
+ preparent, postparent);
+
+ AFR_UPDATE_PARENT_BUF (parent2, this, child_index, local,
+ local->cont.dir_fop.prenewparent,
+ local->cont.dir_fop.postnewparent,
+ prenewparent, postnewparent);
+
if ((local->success_count == 0) ||
(child_index == local->read_child_index)) {
- local->cont.dir_fop.preparent = *preparent;
- local->cont.dir_fop.postparent = *postparent;
if (buf)
local->cont.dir_fop.buf = *buf;
- if (prenewparent)
- local->cont.dir_fop.prenewparent = *prenewparent;
- if (postnewparent)
- local->cont.dir_fop.postnewparent = *postnewparent;
}
local->cont.dir_fop.inode = inode;
@@ -934,8 +943,8 @@ afr_link_unwind (call_frame_t *frame, xlator_t *this)
local->op_ret, local->op_errno,
local->cont.dir_fop.inode,
&local->cont.dir_fop.buf,
- &local->cont.dir_fop.preparent,
- &local->cont.dir_fop.postparent,
+ &local->cont.dir_fop.prenewparent,
+ &local->cont.dir_fop.postnewparent,
NULL);
}
@@ -958,7 +967,7 @@ afr_link_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
{
__dir_entry_fop_common_cbk (frame, child_index, this,
op_ret, op_errno, inode, buf,
- preparent, postparent, NULL, NULL);
+ NULL, NULL, preparent, postparent);
}
UNLOCK (&frame->lock);