diff options
Diffstat (limited to 'xlators/cluster')
-rw-r--r-- | xlators/cluster/afr/src/afr-self-heal-algorithm.c | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/xlators/cluster/afr/src/afr-self-heal-algorithm.c b/xlators/cluster/afr/src/afr-self-heal-algorithm.c index f9ed1afe0b5..b6fba9d1faa 100644 --- a/xlators/cluster/afr/src/afr-self-heal-algorithm.c +++ b/xlators/cluster/afr/src/afr-self-heal-algorithm.c @@ -299,6 +299,8 @@ sh_full_loop_driver (call_frame_t *frame, xlator_t *this) afr_sh_algo_full_private_t *sh_priv = NULL; int loop = 0; + int recurse = 0; + off_t offset = 0; priv = this->private; @@ -334,7 +336,8 @@ sh_full_loop_driver (call_frame_t *frame, xlator_t *this) } spawn: - loop = 0; + loop = 0; + recurse = 0; LOCK (&sh_priv->lock); { @@ -350,15 +353,18 @@ spawn: sh_priv->loops_running++; + loop = 1; + if (sh_priv->offset < sh->file_size) - loop = 1; + recurse = 1; } } UNLOCK (&sh_priv->lock); if (loop) { sh_full_read_write (frame, this, offset); - goto spawn; + if (recurse) + goto spawn; } out: @@ -828,7 +834,9 @@ sh_diff_loop_driver (call_frame_t *frame, xlator_t *this) afr_self_heal_t * sh = NULL; afr_sh_algo_diff_private_t *sh_priv = NULL; - int loop = 0; + int loop = 0; + int recurse = 0; + off_t offset = 0; priv = this->private; @@ -864,7 +872,8 @@ sh_diff_loop_driver (call_frame_t *frame, xlator_t *this) } spawn: - loop = 0; + loop = 0; + recurse = 0; LOCK (&sh_priv->lock); { @@ -880,15 +889,18 @@ spawn: sh_priv->loops_running++; + loop = 1; + if (sh_priv->offset < sh->file_size) - loop = 1; + recurse = 1; } } UNLOCK (&sh_priv->lock); if (loop) { sh_diff_checksum (frame, this, offset); - goto spawn; + if (recurse) + goto spawn; } out: |