public inbox for cluster-cvs@sourceware.org
help / color / mirror / Atom feed
* cluster: STABLE3 - qdisk: Make mixed-endian work
@ 2009-03-20 19:39 Lon Hohberger
0 siblings, 0 replies; only message in thread
From: Lon Hohberger @ 2009-03-20 19:39 UTC (permalink / raw)
To: cluster-cvs-relay
Gitweb: http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=c1298785e20800e47a82643aa4b608bdffddb876
Commit: c1298785e20800e47a82643aa4b608bdffddb876
Parent: 4be7021e8f0bc043f44ef4e6b7bddd0771c527c7
Author: Lon Hohberger <lhh@redhat.com>
AuthorDate: Thu Mar 19 15:51:47 2009 -0400
Committer: Lon Hohberger <lhh@redhat.com>
CommitterDate: Fri Mar 20 15:38:07 2009 -0400
qdisk: Make mixed-endian work
This patch makes mixed-endian clusters to use
qdiskd. Unfortunately, the headers + CRCs in
the headers of each data block are stored in
little-endian format while the data itself is
stored in big-endian format. Ew. This patch
does not fix that, but ensures the data vs.
header blocks are stored in the right byte order
to preserve upgrade compatibility.
Signed-off-by: Lon Hohberger <lhh@redhat.com>
Signed-off-by: Fabio M. Di Nitto <fdinitto@redhat.com>
---
cman/qdisk/disk.c | 45 ++++++++++++++++++++++-----------------------
cman/qdisk/main.c | 14 ++++++++++----
cman/qdisk/mkqdisk.c | 7 +++++--
cman/qdisk/proc.c | 7 ++++---
4 files changed, 41 insertions(+), 32 deletions(-)
diff --git a/cman/qdisk/disk.c b/cman/qdisk/disk.c
index 9a8d8ee..12202d5 100644
--- a/cman/qdisk/disk.c
+++ b/cman/qdisk/disk.c
@@ -53,15 +53,15 @@ static void
header_encode(shared_header_t *hdr)
{
/* sanity check - LE machine -> already encoded. */
- if (hdr->h_magic == be_swap32(SHARED_HEADER_MAGIC))
+ if (hdr->h_magic == le_swap32(SHARED_HEADER_MAGIC))
return;
- swab32(hdr->h_magic);
- swab32(hdr->h_hcrc);
- swab32(hdr->h_dcrc);
- swab32(hdr->h_length);
- swab64(hdr->h_view);
- swab64(hdr->h_timestamp);
+ hdr->h_magic = le_swap32(hdr->h_magic);
+ hdr->h_hcrc = le_swap32(hdr->h_hcrc);
+ hdr->h_dcrc = le_swap32(hdr->h_dcrc);
+ hdr->h_length = le_swap32(hdr->h_length);
+ hdr->h_view = le_swap64(hdr->h_view);
+ hdr->h_timestamp = le_swap64(hdr->h_timestamp);
}
@@ -78,12 +78,12 @@ header_decode(shared_header_t *hdr)
if (hdr->h_magic == SHARED_HEADER_MAGIC)
return;
- swab32(hdr->h_magic);
- swab32(hdr->h_hcrc);
- swab32(hdr->h_dcrc);
- swab32(hdr->h_length);
- swab64(hdr->h_view);
- swab64(hdr->h_timestamp);
+ hdr->h_magic = le_swap32(hdr->h_magic);
+ hdr->h_hcrc = le_swap32(hdr->h_hcrc);
+ hdr->h_dcrc = le_swap32(hdr->h_dcrc);
+ hdr->h_length = le_swap32(hdr->h_length);
+ hdr->h_view = le_swap64(hdr->h_view);
+ hdr->h_timestamp = le_swap64(hdr->h_timestamp);
}
@@ -119,15 +119,15 @@ header_generate(shared_header_t *hdr, const char *data, size_t count)
}
hdr->h_timestamp = (uint64_t)time(NULL);
+ header_encode(hdr);
+ hdr->h_hcrc = 0;
+ hdr->h_hcrc = le_swap32(clu_crc32((char *)hdr, sizeof(*hdr)));
- hdr->h_hcrc = clu_crc32((char *)hdr, sizeof(*hdr));
if (hdr->h_hcrc == 0) {
logt_print(LOG_ERR, "Invalid CRC32 generated on header!\n");
return -1;
}
- header_encode(hdr);
-
return 0;
}
@@ -148,24 +148,27 @@ header_verify(shared_header_t *hdr, const char *data, size_t count)
uint32_t crc;
uint32_t bkupcrc;
- header_decode(hdr);
/*
* verify the header's CRC32. Ok, we know it's overkill taking
* the CRC32 of a friggin' 16-byte (12 bytes, really) structure,
* but why not?
*/
bkupcrc = hdr->h_hcrc;
+
+ /* BUG: Headers are stored in little-endian form */
+ bkupcrc = le_swap32(hdr->h_hcrc);
+
hdr->h_hcrc = 0;
crc = clu_crc32((char *)hdr, sizeof(*hdr));
hdr->h_hcrc = bkupcrc;
if (bkupcrc != crc) {
-#ifdef DEBUG
logt_print(LOG_DEBUG, "Header CRC32 mismatch; Exp: 0x%08x "
"Got: 0x%08x\n", bkupcrc, crc);
-#endif
return -1;
}
+ header_decode(hdr);
+
/*
* Verify the magic number.
*/
@@ -328,7 +331,6 @@ diskRawReadShadow(target_info_t *disk, off_t readOffset, char *buf, int len)
int ret;
shared_header_t *hdrp;
char *data;
- int datalen;
ret = lseek(disk->d_fd, readOffset, SEEK_SET);
if (ret != readOffset) {
@@ -350,8 +352,6 @@ diskRawReadShadow(target_info_t *disk, off_t readOffset, char *buf, int len)
/* Decode the header portion so we can run a checksum on it. */
hdrp = (shared_header_t *)buf;
data = (char *)buf + sizeof(*hdrp);
- swab_shared_header_t(hdrp);
- datalen = hdrp->h_length;
if (header_verify(hdrp, data, len)) {
#ifdef DEBUG
@@ -650,7 +650,6 @@ qdisk_write(target_info_t *disk, __off64_t offset, const void *buf, int count)
free((char *)hdrp);
return -1;
}
- swab_shared_header_t(hdrp);
/*
* Locking must be performed elsewhere. We make no assumptions
diff --git a/cman/qdisk/main.c b/cman/qdisk/main.c
index 86187ee..4b69ed8 100644
--- a/cman/qdisk/main.c
+++ b/cman/qdisk/main.c
@@ -650,13 +650,19 @@ check_votes(qd_ctx *ctx, node_info_t *ni, int max, disk_msg_t *msg)
static void
print_node_info(FILE *fp, node_info_t *ni)
{
+ uint64_t incarnation;
+
fprintf(fp, "node_info_t [node %d] {\n", ni->ni_status.ps_nodeid);
+
+ incarnation = be_swap64(ni->ni_incarnation);
fprintf(fp, " ni_incarnation = 0x%08x%08x\n",
- ((int)(ni->ni_incarnation>>32))&0xffffffff,
- ((int)(ni->ni_incarnation)&0xffffffff));
+ ((int)(incarnation>>32))&0xffffffff,
+ ((int)(incarnation)&0xffffffff));
+
+ incarnation = be_swap64(ni->ni_evil_incarnation);
fprintf(fp, " ni_evil_incarnation = 0x%08x%08x\n",
- ((int)(ni->ni_evil_incarnation>>32))&0xffffffff,
- ((int)(ni->ni_evil_incarnation)&0xffffffff));
+ ((int)(incarnation>>32))&0xffffffff,
+ ((int)(incarnation)&0xffffffff));
fprintf(fp, " ni_last_seen = %s", ctime(&ni->ni_last_seen));
fprintf(fp, " ni_misses = %d\n", ni->ni_misses);
fprintf(fp, " ni_seen = %d\n", ni->ni_seen);
diff --git a/cman/qdisk/mkqdisk.c b/cman/qdisk/mkqdisk.c
index 6efa630..338bd5c 100644
--- a/cman/qdisk/mkqdisk.c
+++ b/cman/qdisk/mkqdisk.c
@@ -21,8 +21,6 @@ main(int argc, char **argv)
char *newdev = NULL, *newlabel = NULL;
int rv, verbose_level = 1;
- logt_init(PROGRAM_NAME, LOG_MODE_OUTPUT_STDERR, 0, 0, 0, NULL);
-
printf(PROGRAM_NAME " v" RELEASE_VERSION "\n\n");
/* XXX this is horrible but we need to prioritize options as long as
@@ -32,10 +30,15 @@ main(int argc, char **argv)
switch (rv) {
case 'd':
++verbose_level;
+ if (verbose_level > LOG_DEBUG)
+ verbose_level = LOG_DEBUG;
break;
}
}
+ logt_init(PROGRAM_NAME, LOG_MODE_OUTPUT_STDERR,
+ verbose_level, verbose_level, verbose_level, NULL);
+
/* reset the option index to reparse */
optind = 0;
diff --git a/cman/qdisk/proc.c b/cman/qdisk/proc.c
index 28bdd8b..a59613b 100644
--- a/cman/qdisk/proc.c
+++ b/cman/qdisk/proc.c
@@ -127,6 +127,7 @@ static void
print_status_block(status_block_t *sb)
{
time_t timestamp = (time_t)sb->ps_timestamp;
+ uint64_t incarnation = be_swap64(sb->ps_incarnation);
if (sb->ps_state == S_NONE)
return;
@@ -134,15 +135,15 @@ print_status_block(status_block_t *sb)
logt_print(LOG_INFO, "\tLast updated by node %d\n", sb->ps_updatenode);
logt_print(LOG_INFO, "\tLast updated on %s", ctime((time_t *)×tamp));
logt_print(LOG_INFO, "\tState: %s\n", state_str(sb->ps_state));
- logt_print(LOG_INFO, "\tFlags: %04x\n", sb->ps_flags);
+ logt_print(LOG_INFO, "\tFlags: %04x\n", (be_swap16(sb->ps_flags)));
logt_print(LOG_INFO, "\tScore: %d/%d\n", sb->ps_score, sb->ps_scoremax);
logt_print(LOG_INFO, "\tAverage Cycle speed: %d.%06d seconds\n",
sb->ps_ca_sec, sb->ps_ca_usec);
logt_print(LOG_INFO, "\tLast Cycle speed: %d.%06d seconds\n",
sb->ps_lc_sec, sb->ps_lc_usec);
logt_print(LOG_INFO, "\tIncarnation: %08x%08x\n",
- (int)(sb->ps_incarnation>>32&0xffffffff),
- (int)(sb->ps_incarnation&0xffffffff));
+ (int)(incarnation>>32&0xffffffff),
+ (int)(incarnation&0xffffffff));
}
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2009-03-20 19:39 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-03-20 19:39 cluster: STABLE3 - qdisk: Make mixed-endian work Lon Hohberger
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).