diff options
Diffstat (limited to 'xlators/cluster')
-rw-r--r-- | xlators/cluster/afr/src/afr-self-heal-common.c | 8 | ||||
-rw-r--r-- | xlators/cluster/afr/src/afr-self-heal-data.c | 29 | ||||
-rw-r--r-- | xlators/cluster/afr/src/afr.h | 1 |
3 files changed, 29 insertions, 9 deletions
diff --git a/xlators/cluster/afr/src/afr-self-heal-common.c b/xlators/cluster/afr/src/afr-self-heal-common.c index 7e2a6027126..7195dfe058c 100644 --- a/xlators/cluster/afr/src/afr-self-heal-common.c +++ b/xlators/cluster/afr/src/afr-self-heal-common.c @@ -648,7 +648,13 @@ afr_reply_copy (struct afr_reply *dst, struct afr_reply *src) if (dst->xdata) dict_unref (dst->xdata); dst->xdata = xdata; - memcpy (dst->checksum, src->checksum, SHA256_DIGEST_LENGTH); + if (xdata && dict_get_str_boolean (xdata, "fips-mode-rchecksum", + _gf_false) == _gf_true) { + memcpy (dst->checksum, src->checksum, SHA256_DIGEST_LENGTH); + } else { + memcpy (dst->checksum, src->checksum, MD5_DIGEST_LENGTH); + } + dst->fips_mode_rchecksum = src->fips_mode_rchecksum; } void diff --git a/xlators/cluster/afr/src/afr-self-heal-data.c b/xlators/cluster/afr/src/afr-self-heal-data.c index bc710ea458f..3cf5b32b01d 100644 --- a/xlators/cluster/afr/src/afr-self-heal-data.c +++ b/xlators/cluster/afr/src/afr-self-heal-data.c @@ -38,11 +38,21 @@ __checksum_cbk (call_frame_t *frame, void *cookie, xlator_t *this, replies[i].valid = 1; replies[i].op_ret = op_ret; replies[i].op_errno = op_errno; - if (xdata) + if (xdata) { replies[i].buf_has_zeroes = dict_get_str_boolean (xdata, "buf-has-zeroes", _gf_false); - if (strong) - memcpy (local->replies[i].checksum, strong, SHA256_DIGEST_LENGTH); + replies[i].fips_mode_rchecksum = dict_get_str_boolean (xdata, + "fips-mode-rchecksum", _gf_false); + } + if (strong) { + if (replies[i].fips_mode_rchecksum) { + memcpy (local->replies[i].checksum, strong, + SHA256_DIGEST_LENGTH); + } else { + memcpy (local->replies[i].checksum, strong, + MD5_DIGEST_LENGTH); + } + } syncbarrier_wake (&local->barrier); return 0; @@ -58,11 +68,13 @@ __afr_can_skip_data_block_heal (call_frame_t *frame, xlator_t *this, fd_t *fd, afr_local_t *local = NULL; unsigned char *wind_subvols = NULL; gf_boolean_t checksum_match = _gf_true; + struct afr_reply *replies = NULL; dict_t *xdata = NULL; int i = 0; priv = this->private; local = frame->local; + replies = local->replies; xdata = dict_new(); if (!xdata) @@ -83,16 +95,17 @@ __afr_can_skip_data_block_heal (call_frame_t *frame, xlator_t *this, fd_t *fd, if (xdata) dict_unref (xdata); - if (!local->replies[source].valid || local->replies[source].op_ret != 0) + if (!replies[source].valid || replies[source].op_ret != 0) return _gf_false; for (i = 0; i < priv->child_count; i++) { if (i == source) continue; - if (local->replies[i].valid) { - if (memcmp (local->replies[source].checksum, - local->replies[i].checksum, - SHA256_DIGEST_LENGTH)) { + if (replies[i].valid) { + if (memcmp (replies[source].checksum, + replies[i].checksum, + replies[source].fips_mode_rchecksum ? + SHA256_DIGEST_LENGTH : MD5_DIGEST_LENGTH)) { checksum_match = _gf_false; break; } diff --git a/xlators/cluster/afr/src/afr.h b/xlators/cluster/afr/src/afr.h index 220cc0b5d41..9f4e34a2afa 100644 --- a/xlators/cluster/afr/src/afr.h +++ b/xlators/cluster/afr/src/afr.h @@ -322,6 +322,7 @@ struct afr_reply { /* For rchecksum */ uint8_t checksum[SHA256_DIGEST_LENGTH]; gf_boolean_t buf_has_zeroes; + gf_boolean_t fips_mode_rchecksum; /* For lookup */ int8_t need_heal; }; |