From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LrubD-0002Gm-JF for qemu-devel@nongnu.org; Thu, 09 Apr 2009 09:47:23 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Lrub8-0002DU-5C for qemu-devel@nongnu.org; Thu, 09 Apr 2009 09:47:22 -0400 Received: from [199.232.76.173] (port=32897 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Lrub7-0002DE-RQ for qemu-devel@nongnu.org; Thu, 09 Apr 2009 09:47:17 -0400 Received: from mx2.redhat.com ([66.187.237.31]:49703) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1Lrub6-0001sj-6s for qemu-devel@nongnu.org; Thu, 09 Apr 2009 09:47:16 -0400 Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n39DlFKT020471 for ; Thu, 9 Apr 2009 09:47:15 -0400 From: Kevin Wolf Date: Thu, 9 Apr 2009 15:46:16 +0200 Message-Id: <1239284776-2115-1-git-send-email-kwolf@redhat.com> Subject: [Qemu-devel] [PATCH] qemu-io: Verify read data by patterns Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Kevin Wolf This patch adds a -P option to read and readv which allows to compare the read data to a given pattern. This can be used to verify data written by write -P. Signed-off-by: Kevin Wolf --- qemu-io.c | 42 ++++++++++++++++++++++++++++++++++++++---- 1 files changed, 38 insertions(+), 4 deletions(-) diff --git a/qemu-io.c b/qemu-io.c index 3e5c444..b32c45e 100644 --- a/qemu-io.c +++ b/qemu-io.c @@ -192,6 +192,7 @@ read_help(void) " Reads a segment of the currently open file, optionally dumping it to the\n" " standard output stream (with -v option) for subsequent inspection.\n" " -p, -- use bdrv_pread to read the file\n" +" -P, -- use a pattern to verify read data\n" " -C, -- report statistics in a machine parsable format\n" " -v, -- dump buffer to standard output\n" " -q, -- quite mode, do not show I/O statistics\n" @@ -207,8 +208,10 @@ read_f(int argc, char **argv) char *buf; int64_t offset; int count, total; + int pattern = 0; + int use_pattern = 0; - while ((c = getopt(argc, argv, "Cpqv")) != EOF) { + while ((c = getopt(argc, argv, "CpP:qv")) != EOF) { switch (c) { case 'C': Cflag = 1; @@ -216,6 +219,10 @@ read_f(int argc, char **argv) case 'p': pflag = 1; break; + case 'P': + use_pattern = 1; + pattern = atoi(optarg); + break; case 'q': qflag = 1; break; @@ -270,6 +277,16 @@ read_f(int argc, char **argv) return 0; } + if (use_pattern) { + void* cmp_buf = malloc(count); + memset(cmp_buf, pattern, count); + if (memcmp(buf, cmp_buf, count)) { + printf("Pattern verification failed at offset %lld, %d bytes\n", + (long long) offset, count); + } + free(cmp_buf); + } + if (qflag) return 0; @@ -291,7 +308,7 @@ static const cmdinfo_t read_cmd = { .cfunc = read_f, .argmin = 2, .argmax = -1, - .args = "[-aCpqv] off len", + .args = "[-aCpqv] [-P pattern ] off len", .oneline = "reads a number of bytes at a specified offset", .help = read_help, }; @@ -312,6 +329,7 @@ readv_help(void) " standard output stream (with -v option) for subsequent inspection.\n" " Uses multiple iovec buffers if more than one byte range is specified.\n" " -C, -- report statistics in a machine parsable format\n" +" -P, -- use a pattern to verify read data\n" " -v, -- dump buffer to standard output\n" " -q, -- quite mode, do not show I/O statistics\n" "\n"); @@ -328,12 +346,18 @@ readv_f(int argc, char **argv) int count = 0, total; int nr_iov, i; QEMUIOVector qiov; + int pattern = 0; + int use_pattern = 0; - while ((c = getopt(argc, argv, "Cqv")) != EOF) { + while ((c = getopt(argc, argv, "CP:qv")) != EOF) { switch (c) { case 'C': Cflag = 1; break; + case 'P': + use_pattern = 1; + pattern = atoi(optarg); + break; case 'q': qflag = 1; break; @@ -406,6 +430,16 @@ readv_f(int argc, char **argv) return 0; } + if (use_pattern) { + void* cmp_buf = malloc(count); + memset(cmp_buf, pattern, count); + if (memcmp(buf, cmp_buf, count)) { + printf("Pattern verification failed at offset %lld, %d bytes\n", + (long long) offset, count); + } + free(cmp_buf); + } + if (qflag) return 0; @@ -426,7 +460,7 @@ static const cmdinfo_t readv_cmd = { .cfunc = readv_f, .argmin = 2, .argmax = -1, - .args = "[-Cqv] off len [len..]", + .args = "[-Cqv] [-P pattern ] off len [len..]", .oneline = "reads a number of bytes at a specified offset", .help = readv_help, }; -- 1.6.0.6