From 4a62b5af1c9add4a74ea38ab9008bf129e2b4110 Mon Sep 17 00:00:00 2001 From: Amar Tumballi Date: Fri, 10 Apr 2009 00:34:34 -0700 Subject: feature to disable volumefile's checksum in server volume define, "option verify-volfile-checksum no" to disable the checksum feature. Signed-off-by: Anand V. Avati --- xlators/protocol/server/src/server-protocol.c | 66 +++++++++++++++++++-------- xlators/protocol/server/src/server-protocol.h | 1 + 2 files changed, 47 insertions(+), 20 deletions(-) (limited to 'xlators/protocol/server/src') diff --git a/xlators/protocol/server/src/server-protocol.c b/xlators/protocol/server/src/server-protocol.c index 4de990d45..d4d75c1ab 100644 --- a/xlators/protocol/server/src/server-protocol.c +++ b/xlators/protocol/server/src/server-protocol.c @@ -7147,7 +7147,8 @@ mop_getspec (call_frame_t *frame, uint32_t flags = 0; uint32_t keylen = 0; char *key = NULL; - + server_conf_t *conf = NULL; + req = gf_param (hdr); flags = ntoh32 (req->flags); keylen = ntoh32 (req->keylen); @@ -7155,6 +7156,8 @@ mop_getspec (call_frame_t *frame, key = req->key; } + conf = frame->this->private; + filename = build_volfile_path (frame->this, key); if (filename) { /* to allocate the proper buffer to hold the file data */ @@ -7176,8 +7179,10 @@ mop_getspec (call_frame_t *frame, } ret = 0; file_len = stbuf.st_size; - get_checksum_for_file (spec_fd, &checksum); - _volfile_update_checksum (frame->this, key, checksum); + if (conf->verify_volfile_checksum) { + get_checksum_for_file (spec_fd, &checksum); + _volfile_update_checksum (frame->this, key, checksum); + } } else { errno = ENOENT; } @@ -7451,25 +7456,30 @@ mop_setvolume (call_frame_t *frame, xlator_t *bound_xl, goto fail; } - ret = dict_get_uint32 (params, "volfile-checksum", &checksum); - if (ret == 0) { - ret = dict_get_str (params, "volfile-key", &volfile_key); - - ret = _validate_volfile_checksum (trans->xl, volfile_key, - checksum); - if (-1 == ret) { - ret = dict_set_str (reply, "ERROR", - "volume-file checksum varies from " - "earlier access"); - if (ret < 0) - gf_log (trans->xl->name, GF_LOG_ERROR, - "failed to set error msg"); + if (conf->verify_volfile_checksum) { + ret = dict_get_uint32 (params, "volfile-checksum", &checksum); + if (ret == 0) { + ret = dict_get_str (params, "volfile-key", + &volfile_key); - op_ret = -1; - op_errno = ESTALE; - goto fail; + ret = _validate_volfile_checksum (trans->xl, + volfile_key, + checksum); + if (-1 == ret) { + ret = dict_set_str (reply, "ERROR", + "volume-file checksum " + "varies from earlier " + "access"); + if (ret < 0) + gf_log (trans->xl->name, GF_LOG_ERROR, + "failed to set error msg"); + + op_ret = -1; + op_errno = ESTALE; + goto fail; + } } - } + } peerinfo = &trans->peerinfo; @@ -8075,6 +8085,7 @@ init (xlator_t *this) int32_t ret = -1; transport_t *trans = NULL; server_conf_t *conf = NULL; + data_t *data = NULL; if (this->children == NULL) { gf_log (this->name, GF_LOG_ERROR, @@ -8137,6 +8148,18 @@ init (xlator_t *this) DEFAULT_BLOCK_SIZE); conf->max_block_size = DEFAULT_BLOCK_SIZE; } + + conf->verify_volfile_checksum = 1; + data = dict_get (this->options, "verify-volfile-checksum"); + if (data) { + ret = gf_string2boolean(data->data, + &conf->verify_volfile_checksum); + if (ret != 0) { + gf_log (this->name, GF_LOG_DEBUG, + "wrong value for verify-volfile-checksum"); + conf->verify_volfile_checksum = 1; + } + } #ifndef GF_DARWIN_HOST_OS { @@ -8291,5 +8314,8 @@ struct volume_options options[] = { { .key = {"client-volume-filename"}, .type = GF_OPTION_TYPE_PATH }, + { .key = {"verify-volfile-checksum"}, + .type = GF_OPTION_TYPE_BOOL + }, { .key = {NULL} }, }; diff --git a/xlators/protocol/server/src/server-protocol.h b/xlators/protocol/server/src/server-protocol.h index 2e6923fb4..1ea30cc6f 100644 --- a/xlators/protocol/server/src/server-protocol.h +++ b/xlators/protocol/server/src/server-protocol.h @@ -105,6 +105,7 @@ typedef struct { int32_t inode_lru_limit; pthread_mutex_t mutex; struct list_head conns; + gf_boolean_t verify_volfile_checksum; } server_conf_t; -- cgit