summaryrefslogtreecommitdiffstats
path: root/xlators/cluster/afr/src/afr-self-heal.h
diff options
context:
space:
mode:
Diffstat (limited to 'xlators/cluster/afr/src/afr-self-heal.h')
-rw-r--r--xlators/cluster/afr/src/afr-self-heal.h24
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; \