Pretty up the good/bad block verify dumping
Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
diff --git a/verify.c b/verify.c
index 81b05a9..01e2542 100644
--- a/verify.c
+++ b/verify.c
@@ -71,6 +71,27 @@
}
}
+static void fill_pattern_headers(struct thread_data *td, struct io_u *io_u,
+ unsigned long seed, int use_seed)
+{
+ unsigned int hdr_inc, header_num;
+ struct verify_header *hdr;
+ void *p = io_u->buf;
+
+ fill_pattern(td, p, io_u->buflen, io_u, seed, use_seed);
+
+ hdr_inc = io_u->buflen;
+ if (td->o.verify_interval)
+ hdr_inc = td->o.verify_interval;
+
+ header_num = 0;
+ for (; p < io_u->buf + io_u->buflen; p += hdr_inc) {
+ hdr = p;
+ populate_hdr(td, io_u, hdr, header_num, hdr_inc);
+ header_num++;
+ }
+}
+
static void memswp(void *buf1, void *buf2, unsigned int len)
{
char swap[200];
@@ -174,13 +195,16 @@
unsigned int crc_len;
};
-static void dump_buf(char *buf, unsigned int len, const char *name,
- unsigned long long offset)
+static void dump_buf(char *buf, unsigned int len, unsigned long long offset,
+ const char *type, struct fio_file *f)
{
- char fname[80];
+ char fname[256];
int ret, fd;
- sprintf(fname, "%llu.%s", offset, name);
+ strcpy(fname, f->file_name);
+ basename(fname);
+
+ sprintf(fname + strlen(fname), ".%llu.%s", offset, type);
fd = open(fname, O_CREAT | O_TRUNC | O_WRONLY, 0644);
if (fd < 0) {
@@ -201,40 +225,40 @@
}
close(fd);
- log_err(" %s data dumped as %s\n", name, fname);
+ log_err(" %s data dumped as %s\n", type, fname);
}
+/*
+ * Dump the contents of the read block and re-generate the correct data
+ * and dump that too.
+ */
static void dump_verify_buffers(struct verify_header *hdr, struct vcont *vc)
{
struct thread_data *td = vc->td;
struct io_u *io_u = vc->io_u;
unsigned long hdr_offset;
- unsigned int hdr_inc, header_num;
struct io_u dummy;
- void *buf, *p;
+ void *buf;
+ /*
+ * Dump the contents we just read off disk
+ */
hdr_offset = vc->hdr_num * hdr->len;
- dump_buf(io_u->buf + hdr_offset, hdr->len, "received",
- io_u->offset + hdr_offset);
+ dump_buf(io_u->buf + hdr_offset, hdr->len, io_u->offset + hdr_offset,
+ "received", vc->io_u->file);
- buf = p = malloc(io_u->buflen);
+ /*
+ * Allocate a new buf and re-generate the original data
+ */
+ buf = malloc(io_u->buflen);
dummy = *io_u;
- fill_pattern(td, p, io_u->buflen, &dummy, hdr->rand_seed, 1);
+ dummy.buf = buf;
- hdr_inc = io_u->buflen;
- if (td->o.verify_interval)
- hdr_inc = td->o.verify_interval;
+ fill_pattern_headers(td, &dummy, hdr->rand_seed, 1);
- header_num = 0;
- for (; p < buf + io_u->buflen; p += hdr_inc) {
- hdr = p;
- populate_hdr(td, io_u, hdr, header_num, hdr_inc);
- header_num++;
- }
-
- dump_buf(buf + hdr_offset, hdr->len, "expected",
- io_u->offset + hdr_offset);
+ dump_buf(buf + hdr_offset, hdr->len, io_u->offset + hdr_offset,
+ "expected", vc->io_u->file);
free(buf);
}
@@ -866,28 +890,14 @@
/*
* fill body of io_u->buf with random data and add a header with the
- * crc32 or md5 sum of that data.
+ * checksum of choice
*/
void populate_verify_io_u(struct thread_data *td, struct io_u *io_u)
{
- struct verify_header *hdr;
- unsigned int hdr_inc, header_num = 0;
- void *p = io_u->buf;
-
if (td->o.verify == VERIFY_NULL)
return;
- fill_pattern(td, p, io_u->buflen, io_u, 0, 0);
-
- hdr_inc = io_u->buflen;
- if (td->o.verify_interval)
- hdr_inc = td->o.verify_interval;
-
- for (; p < io_u->buf + io_u->buflen; p += hdr_inc) {
- hdr = p;
- populate_hdr(td, io_u, hdr, header_num, hdr_inc);
- header_num++;
- }
+ fill_pattern_headers(td, io_u, 0, 0);
}
int get_next_verify(struct thread_data *td, struct io_u *io_u)