summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--xlators/cluster/afr/src/afr-self-heal-entry.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/xlators/cluster/afr/src/afr-self-heal-entry.c b/xlators/cluster/afr/src/afr-self-heal-entry.c
index cb3648c07bd..ab210b37bef 100644
--- a/xlators/cluster/afr/src/afr-self-heal-entry.c
+++ b/xlators/cluster/afr/src/afr-self-heal-entry.c
@@ -181,6 +181,13 @@ __afr_selfheal_heal_dirent (call_frame_t *frame, xlator_t *this, fd_t *fd,
if (!replies[source].valid)
return -EIO;
+ /* Skip healing this entry if the last lookup on it failed for reasons
+ * other than ENOENT.
+ */
+ if ((replies[source].op_ret < 0) &&
+ (replies[source].op_errno != ENOENT))
+ return -replies[source].op_errno;
+
for (i = 0; i < priv->child_count; i++) {
if (!healed_sinks[i])
continue;
@@ -188,7 +195,7 @@ __afr_selfheal_heal_dirent (call_frame_t *frame, xlator_t *this, fd_t *fd,
replies[source].op_errno == ENOENT) {
ret = afr_selfheal_entry_delete (this, fd->inode, name,
inode, i, replies);
- } else {
+ } else {
if (!gf_uuid_compare (replies[i].poststat.ia_gfid,
replies[source].poststat.ia_gfid))
continue;
@@ -196,7 +203,7 @@ __afr_selfheal_heal_dirent (call_frame_t *frame, xlator_t *this, fd_t *fd,
ret = afr_selfheal_recreate_entry (this, i, source,
fd->inode, name, inode,
replies, newentry);
- }
+ }
if (ret < 0)
break;
}