diff options
-rw-r--r-- | xlators/cluster/afr/src/afr-self-heal-common.c | 54 |
1 files changed, 30 insertions, 24 deletions
diff --git a/xlators/cluster/afr/src/afr-self-heal-common.c b/xlators/cluster/afr/src/afr-self-heal-common.c index a2c2e34ce55..fbd13e47abf 100644 --- a/xlators/cluster/afr/src/afr-self-heal-common.c +++ b/xlators/cluster/afr/src/afr-self-heal-common.c @@ -122,7 +122,9 @@ afr_sh_build_pending_matrix (afr_private_t *priv, { int i, j, k; - int32_t *pending = NULL; + /* Indexable by result of afr_index_for_transaction_type(): 0 -- 2. */ + int32_t pending[3]; + void *pending_raw = NULL; int ret = -1; unsigned char *ignorant_subvols = NULL; @@ -137,11 +139,11 @@ afr_sh_build_pending_matrix (afr_private_t *priv, } for (i = 0; i < child_count; i++) { - pending = NULL; + pending_raw = NULL; for (j = 0; j < child_count; j++) { ret = dict_get_ptr (xattr[i], priv->pending_key[j], - VOID(&pending)); + &pending_raw); if (ret != 0) { /* @@ -154,6 +156,7 @@ afr_sh_build_pending_matrix (afr_private_t *priv, continue; } + memcpy (pending, pending_raw, sizeof(pending)); k = afr_index_for_transaction_type (type); pending_matrix[i][j] = ntoh32 (pending[k]); @@ -555,8 +558,10 @@ afr_sh_pending_to_delta (afr_private_t *priv, dict_t **xattr, int j = 0; int k = 0; - int32_t * pending = NULL; - int ret = 0; + /* Indexable by result of afr_index_for_transaction_type(): 0 -- 2. */ + int32_t pending[3]; + void * pending_raw = NULL; + int ret = 0; /* start clean */ for (i = 0; i < child_count; i++) { @@ -566,18 +571,19 @@ afr_sh_pending_to_delta (afr_private_t *priv, dict_t **xattr, } for (i = 0; i < child_count; i++) { - pending = NULL; + pending_raw = NULL; for (j = 0; j < child_count; j++) { ret = dict_get_ptr (xattr[i], priv->pending_key[j], - VOID(&pending)); - + &pending_raw); + if (!success[j]) continue; k = afr_index_for_transaction_type (type); - if (pending) { + if (pending_raw) { + memcpy (pending, pending_raw, sizeof(pending)); delta_matrix[i][j] = -(ntoh32 (pending[k])); } else { delta_matrix[i][j] = 0; @@ -627,8 +633,9 @@ int afr_sh_has_metadata_pending (dict_t *xattr, int child_count, xlator_t *this) { afr_private_t *priv = NULL; - int32_t *pending = NULL; - void *tmp_pending = NULL; /* This is required to remove 'type-punned' warnings from gcc */ + /* Indexable by result of afr_index_for_transaction_type(): 0 -- 2. */ + int32_t pending[3]; + void *pending_raw = NULL; int ret = -1; int i = 0; @@ -638,13 +645,12 @@ afr_sh_has_metadata_pending (dict_t *xattr, int child_count, xlator_t *this) for (i = 0; i < priv->child_count; i++) { ret = dict_get_ptr (xattr, priv->pending_key[i], - &tmp_pending); + &pending_raw); if (ret != 0) return 0; - - pending = tmp_pending; + memcpy (pending, pending_raw, sizeof(pending)); j = afr_index_for_transaction_type (AFR_METADATA_TRANSACTION); if (pending[j]) @@ -659,8 +665,9 @@ int afr_sh_has_data_pending (dict_t *xattr, int child_count, xlator_t *this) { afr_private_t *priv = NULL; - int32_t *pending = NULL; - void *tmp_pending = NULL; /* This is required to remove 'type-punned' warnings from gcc */ + /* Indexable by result of afr_index_for_transaction_type(): 0 -- 2. */ + int32_t pending[3]; + void *pending_raw = NULL; int ret = -1; int i = 0; @@ -670,13 +677,12 @@ afr_sh_has_data_pending (dict_t *xattr, int child_count, xlator_t *this) for (i = 0; i < priv->child_count; i++) { ret = dict_get_ptr (xattr, priv->pending_key[i], - &tmp_pending); + &pending_raw); if (ret != 0) return 0; - pending = tmp_pending; - + memcpy (pending, pending_raw, sizeof(pending)); j = afr_index_for_transaction_type (AFR_DATA_TRANSACTION); if (pending[j]) @@ -691,8 +697,9 @@ int afr_sh_has_entry_pending (dict_t *xattr, int child_count, xlator_t *this) { afr_private_t *priv = NULL; - int32_t *pending = NULL; - void *tmp_pending = NULL; /* This is required to remove 'type-punned' warnings from gcc */ + /* Indexable by result of afr_index_for_transaction_type(): 0 -- 2. */ + int32_t pending[3]; + void *pending_raw = NULL; int ret = -1; int i = 0; @@ -702,13 +709,12 @@ afr_sh_has_entry_pending (dict_t *xattr, int child_count, xlator_t *this) for (i = 0; i < priv->child_count; i++) { ret = dict_get_ptr (xattr, priv->pending_key[i], - &tmp_pending); + &pending_raw); if (ret != 0) return 0; - pending = tmp_pending; - + memcpy (pending, pending_raw, sizeof(pending)); j = afr_index_for_transaction_type (AFR_ENTRY_TRANSACTION); if (pending[j]) |