diff options
-rw-r--r-- | xlators/cluster/afr/src/afr-self-heal-entry.c | 11 |
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; } |