Commit c48101ae92c5ac6f2412ca345d9cc3557add8e47
1 parent
838ab728
qemu-io: Verify read data by patterns (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 <kwolf@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@7182 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
40 additions
and
4 deletions
qemu-io.c
... | ... | @@ -192,6 +192,7 @@ read_help(void) |
192 | 192 | " Reads a segment of the currently open file, optionally dumping it to the\n" |
193 | 193 | " standard output stream (with -v option) for subsequent inspection.\n" |
194 | 194 | " -p, -- use bdrv_pread to read the file\n" |
195 | +" -P, -- use a pattern to verify read data\n" | |
195 | 196 | " -C, -- report statistics in a machine parsable format\n" |
196 | 197 | " -v, -- dump buffer to standard output\n" |
197 | 198 | " -q, -- quite mode, do not show I/O statistics\n" |
... | ... | @@ -207,8 +208,10 @@ read_f(int argc, char **argv) |
207 | 208 | char *buf; |
208 | 209 | int64_t offset; |
209 | 210 | int count, total; |
211 | + int pattern = 0; | |
212 | + int Pflag = 0; | |
210 | 213 | |
211 | - while ((c = getopt(argc, argv, "Cpqv")) != EOF) { | |
214 | + while ((c = getopt(argc, argv, "CpP:qv")) != EOF) { | |
212 | 215 | switch (c) { |
213 | 216 | case 'C': |
214 | 217 | Cflag = 1; |
... | ... | @@ -216,6 +219,10 @@ read_f(int argc, char **argv) |
216 | 219 | case 'p': |
217 | 220 | pflag = 1; |
218 | 221 | break; |
222 | + case 'P': | |
223 | + Pflag = 1; | |
224 | + pattern = atoi(optarg); | |
225 | + break; | |
219 | 226 | case 'q': |
220 | 227 | qflag = 1; |
221 | 228 | break; |
... | ... | @@ -270,6 +277,17 @@ read_f(int argc, char **argv) |
270 | 277 | return 0; |
271 | 278 | } |
272 | 279 | |
280 | + if (Pflag) { | |
281 | + void* cmp_buf = malloc(count); | |
282 | + memset(cmp_buf, pattern, count); | |
283 | + if (memcmp(buf, cmp_buf, count)) { | |
284 | + printf("Pattern verification failed at offset %lld, " | |
285 | + "%d bytes\n", | |
286 | + (long long) offset, count); | |
287 | + } | |
288 | + free(cmp_buf); | |
289 | + } | |
290 | + | |
273 | 291 | if (qflag) |
274 | 292 | return 0; |
275 | 293 | |
... | ... | @@ -291,7 +309,7 @@ static const cmdinfo_t read_cmd = { |
291 | 309 | .cfunc = read_f, |
292 | 310 | .argmin = 2, |
293 | 311 | .argmax = -1, |
294 | - .args = "[-aCpqv] off len", | |
312 | + .args = "[-aCpqv] [-P pattern ] off len", | |
295 | 313 | .oneline = "reads a number of bytes at a specified offset", |
296 | 314 | .help = read_help, |
297 | 315 | }; |
... | ... | @@ -312,6 +330,7 @@ readv_help(void) |
312 | 330 | " standard output stream (with -v option) for subsequent inspection.\n" |
313 | 331 | " Uses multiple iovec buffers if more than one byte range is specified.\n" |
314 | 332 | " -C, -- report statistics in a machine parsable format\n" |
333 | +" -P, -- use a pattern to verify read data\n" | |
315 | 334 | " -v, -- dump buffer to standard output\n" |
316 | 335 | " -q, -- quite mode, do not show I/O statistics\n" |
317 | 336 | "\n"); |
... | ... | @@ -328,12 +347,18 @@ readv_f(int argc, char **argv) |
328 | 347 | int count = 0, total; |
329 | 348 | int nr_iov, i; |
330 | 349 | QEMUIOVector qiov; |
350 | + int pattern = 0; | |
351 | + int Pflag = 0; | |
331 | 352 | |
332 | - while ((c = getopt(argc, argv, "Cqv")) != EOF) { | |
353 | + while ((c = getopt(argc, argv, "CP:qv")) != EOF) { | |
333 | 354 | switch (c) { |
334 | 355 | case 'C': |
335 | 356 | Cflag = 1; |
336 | 357 | break; |
358 | + case 'P': | |
359 | + Pflag = 1; | |
360 | + pattern = atoi(optarg); | |
361 | + break; | |
337 | 362 | case 'q': |
338 | 363 | qflag = 1; |
339 | 364 | break; |
... | ... | @@ -406,6 +431,17 @@ readv_f(int argc, char **argv) |
406 | 431 | return 0; |
407 | 432 | } |
408 | 433 | |
434 | + if (Pflag) { | |
435 | + void* cmp_buf = malloc(count); | |
436 | + memset(cmp_buf, pattern, count); | |
437 | + if (memcmp(buf, cmp_buf, count)) { | |
438 | + printf("Pattern verification failed at offset %lld, " | |
439 | + "%d bytes\n", | |
440 | + (long long) offset, count); | |
441 | + } | |
442 | + free(cmp_buf); | |
443 | + } | |
444 | + | |
409 | 445 | if (qflag) |
410 | 446 | return 0; |
411 | 447 | |
... | ... | @@ -426,7 +462,7 @@ static const cmdinfo_t readv_cmd = { |
426 | 462 | .cfunc = readv_f, |
427 | 463 | .argmin = 2, |
428 | 464 | .argmax = -1, |
429 | - .args = "[-Cqv] off len [len..]", | |
465 | + .args = "[-Cqv] [-P pattern ] off len [len..]", | |
430 | 466 | .oneline = "reads a number of bytes at a specified offset", |
431 | 467 | .help = readv_help, |
432 | 468 | }; | ... | ... |