summaryrefslogtreecommitdiffstats
path: root/xlators/cluster/afr/src/afr-self-heal-common.c
diff options
context:
space:
mode:
Diffstat (limited to 'xlators/cluster/afr/src/afr-self-heal-common.c')
-rw-r--r--xlators/cluster/afr/src/afr-self-heal-common.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/xlators/cluster/afr/src/afr-self-heal-common.c b/xlators/cluster/afr/src/afr-self-heal-common.c
index a70833174c0..6d1ae1312ea 100644
--- a/xlators/cluster/afr/src/afr-self-heal-common.c
+++ b/xlators/cluster/afr/src/afr-self-heal-common.c
@@ -26,6 +26,8 @@ afr_selfheal_post_op_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
local = frame->local;
+ local->op_ret = op_ret;
+ local->op_errno = op_errno;
syncbarrier_wake (&local->barrier);
return 0;
@@ -39,6 +41,7 @@ afr_selfheal_post_op (call_frame_t *frame, xlator_t *this, inode_t *inode,
afr_private_t *priv = NULL;
afr_local_t *local = NULL;
loc_t loc = {0, };
+ int ret = 0;
priv = this->private;
local = frame->local;
@@ -46,15 +49,20 @@ afr_selfheal_post_op (call_frame_t *frame, xlator_t *this, inode_t *inode,
loc.inode = inode_ref (inode);
gf_uuid_copy (loc.gfid, inode->gfid);
+ local->op_ret = 0;
+
STACK_WIND (frame, afr_selfheal_post_op_cbk, priv->children[subvol],
priv->children[subvol]->fops->xattrop, &loc,
GF_XATTROP_ADD_ARRAY, xattr, xdata);
syncbarrier_wait (&local->barrier, 1);
+ if (local->op_ret < 0)
+ ret = -local->op_errno;
loc_wipe (&loc);
+ local->op_ret = 0;
- return 0;
+ return ret;
}
int
@@ -1977,13 +1985,16 @@ afr_selfheal_newentry_mark (call_frame_t *frame, xlator_t *this, inode_t *inode,
changelog = afr_mark_pending_changelog (priv, newentry, xattr,
replies[source].poststat.ia_type);
- if (!changelog)
+ if (!changelog) {
+ ret = -ENOMEM;
goto out;
+ }
for (i = 0; i < priv->child_count; i++) {
if (!sources[i])
continue;
- afr_selfheal_post_op (frame, this, inode, i, xattr, NULL);
+ ret |= afr_selfheal_post_op (frame, this, inode, i, xattr,
+ NULL);
}
out:
if (changelog)