return add_dir_files(td, td->o.opendir);
}
+static int str_header_offset_cb(void *data, unsigned int *off)
+{
+ struct thread_data *td = data;
+ if (*off && *off < sizeof(struct verify_header)) {
+ log_err("fio: header_offset too small\n");
+ return 1;
+ }
+ td->o.header_offset = *off;
+ return 0;
+}
+
#define __stringify_1(x) #x
#define __stringify(x) __stringify_1(x)
.help = "Store buffer header every N bytes",
.def = "0",
},
+ {
+ .name = "header_offset",
+ .type = FIO_OPT_STR_VAL_INT,
+ .help = "Offset header location by N bytes",
+ .def = "0",
+ .cb = str_header_offset_cb,
+ },
{
.name = "write_iolog",
.type = FIO_OPT_STR_STORE,
}
}
+void memswp(void* buf1, void* buf2, unsigned int len)
+{
+ struct verify_header swap;
+ memcpy(&swap, buf1, len);
+ memcpy(buf1, buf2, len);
+ memcpy(buf2, &swap, len);
+}
+
static void hexdump(void *buffer, int len)
{
unsigned char *p = buffer;
hdr_inc = td->o.header_interval;
for (; p < (unsigned char*) io_u->buf + io_u->buflen; p += hdr_inc) {
+ if (td->o.header_offset)
+ memswp(p, &p[td->o.header_offset], sizeof(*hdr));
+
hdr = (struct verify_header*) p;
if (hdr->fio_magic != FIO_HDR_MAGIC) {
*/
void populate_verify_io_u(struct thread_data *td, struct io_u *io_u)
{
- const unsigned int len = io_u->buflen - sizeof(struct verify_header);
struct verify_header *hdr;
unsigned char *p = io_u->buf, *data;
- unsigned int data_len;
+ unsigned int hdr_inc, data_len;
if (td->o.verify == VERIFY_NULL)
return;
- fill_random_bytes(td, p, len);
+ fill_random_bytes(td, p, io_u->buflen);
+
+ hdr_inc = io_u->buflen;
+ if (td->o.header_interval)
+ hdr_inc = td->o.header_interval;
+ data_len = hdr_inc - sizeof(*hdr);
- for (;p < (unsigned char*) io_u->buf + io_u->buflen; p += hdr->len) {
+ for (;p < (unsigned char*) io_u->buf + io_u->buflen; p += hdr_inc) {
hdr = (struct verify_header*) p;
hdr->fio_magic = FIO_HDR_MAGIC;
hdr->verify_type = td->o.verify;
- hdr->len = io_u->buflen;
- if (td->o.header_interval)
- hdr->len = td->o.header_interval;
+ hdr->len = hdr_inc;
data = p + sizeof(*hdr);
- data_len = hdr->len - sizeof(*hdr);
switch (td->o.verify) {
case VERIFY_MD5:
fill_md5(hdr, data, data_len);
log_err("fio: bad verify type: %d\n", td->o.verify);
assert(0);
}
+ if (td->o.header_offset)
+ memswp(p, &p[td->o.header_offset], sizeof(*hdr));
}
}