diff options
Diffstat (limited to 'xlators/cluster/afr/src/afr-self-heal.h')
-rw-r--r-- | xlators/cluster/afr/src/afr-self-heal.h | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/xlators/cluster/afr/src/afr-self-heal.h b/xlators/cluster/afr/src/afr-self-heal.h index 0a3d6482ca3..735e520070e 100644 --- a/xlators/cluster/afr/src/afr-self-heal.h +++ b/xlators/cluster/afr/src/afr-self-heal.h @@ -19,16 +19,23 @@ #define AFR_ONALL(frame, rfn, fop, args ...) do { \ afr_local_t *__local = frame->local; \ afr_private_t *__priv = frame->this->private; \ - int __i = 0, __count = 0; \ + int __i = 0, __count = 0; \ + unsigned char *__child_up = NULL; \ + \ + __child_up = alloca0 (__priv->child_count); \ + memcpy (__child_up, __priv->child_up, \ + sizeof (*__child_up) * __priv->child_count); \ + __count = AFR_COUNT (__child_up, __priv->child_count); \ \ - afr_local_replies_wipe (__local, __priv); \ + __local->barrier.waitfor = __count; \ + afr_local_replies_wipe (__local, __priv); \ \ for (__i = 0; __i < __priv->child_count; __i++) { \ - if (!__priv->child_up[__i]) continue; \ + if (!__child_up[__i]) \ + continue; \ STACK_WIND_COOKIE (frame, rfn, (void *)(long) __i, \ __priv->children[__i], \ __priv->children[__i]->fops->fop, args); \ - __count++; \ } \ syncbarrier_wait (&__local->barrier, __count); \ } while (0) @@ -40,16 +47,17 @@ #define AFR_ONLIST(list, frame, rfn, fop, args ...) do { \ afr_local_t *__local = frame->local; \ afr_private_t *__priv = frame->this->private; \ - int __i = 0, __count = 0; \ + int __i = 0; \ + int __count = AFR_COUNT (list, __priv->child_count); \ \ - afr_local_replies_wipe (__local, __priv); \ + __local->barrier.waitfor = __count; \ + afr_local_replies_wipe (__local, __priv); \ \ for (__i = 0; __i < __priv->child_count; __i++) { \ if (!list[__i]) continue; \ STACK_WIND_COOKIE (frame, rfn, (void *)(long) __i, \ __priv->children[__i], \ __priv->children[__i]->fops->fop, args); \ - __count++; \ } \ syncbarrier_wait (&__local->barrier, __count); \ } while (0) @@ -60,7 +68,7 @@ afr_private_t *__priv = frame->this->private; \ int __i = 0; \ \ - afr_local_replies_wipe (__local, __priv); \ + afr_local_replies_wipe (__local, __priv); \ \ for (__i = 0; __i < __priv->child_count; __i++) { \ if (!__priv->child_up[__i]) continue; \ |