diff options
Diffstat (limited to 'xlators/cluster/afr/src/afr-self-heal-data.c')
-rw-r--r-- | xlators/cluster/afr/src/afr-self-heal-data.c | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/xlators/cluster/afr/src/afr-self-heal-data.c b/xlators/cluster/afr/src/afr-self-heal-data.c index 216017cbb17..97d578c9b8c 100644 --- a/xlators/cluster/afr/src/afr-self-heal-data.c +++ b/xlators/cluster/afr/src/afr-self-heal-data.c @@ -366,6 +366,10 @@ afr_sh_data_erase_pending_cbk (call_frame_t *frame, void *cookie, if (call_count == 0) { local = frame->local; sh = &local->self_heal; + if (!IA_ISREG (sh->type)) { + afr_sh_data_finish (frame, this); + goto out; + } if (NULL == sh->old_loop_frame) { GF_ASSERT (sh->data_lock_held); afr_sh_data_fxattrop (frame, this, @@ -850,6 +854,27 @@ out: } int +afr_sh_data_special_file_fix (call_frame_t *frame, xlator_t *this) +{ + afr_private_t *priv = NULL; + afr_self_heal_t *sh = NULL; + afr_local_t *local = NULL; + int i = 0; + + local = frame->local; + sh = &local->self_heal; + priv = this->private; + + for (i = 0; i < priv->child_count ; i++) + if (1 == local->child_up[i]) + sh->success[i] = 1; + + afr_sh_data_erase_pending (frame, this); + + return 0; +} + +int afr_sh_data_fstat_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret, int32_t op_errno, struct iatt *buf) @@ -882,7 +907,14 @@ afr_sh_data_fstat_cbk (call_frame_t *frame, void *cookie, call_count = afr_frame_return (frame); if (call_count == 0) { - afr_sh_data_fix (frame, this); + /* Previous versions of glusterfs might have set + * the pending data xattrs which need to be erased + */ + if (IA_ISREG (buf->ia_type)) + afr_sh_data_fix (frame, this); + else + afr_sh_data_special_file_fix (frame, this); + } return 0; |