Add specific verify=pattern that doesn't use any headers, it
just writes the specified pattern and verifies it.
Signed-off-by: Jens Axboe <axboe@fb.com>
verified for workloads that write data.
See also verify_pattern.
verified for workloads that write data.
See also verify_pattern.
+ pattern Verify a strict pattern. Normally fio includes
+ a header with some basic information and
+ checksumming, but if this option is set, only
+ the specific pattern set with 'verify_pattern'
+ is verified.
+
null Only pretend to verify. Useful for testing
internals with ioengine=null, not for much
else.
null Only pretend to verify. Useful for testing
internals with ioengine=null, not for much
else.
Write extra information about each I/O (timestamp, block number, etc.). The
block number is verified. See \fBverify_pattern\fR as well.
.TP
Write extra information about each I/O (timestamp, block number, etc.). The
block number is verified. See \fBverify_pattern\fR as well.
.TP
+.B pattern
+Verify a strict pattern. Normally fio includes a header with some basic
+information and checksumming, but if this option is set, only the
+specific pattern set with \fBverify_pattern\fR is verified.
+.TP
.B null
Pretend to verify. Used for testing internals.
.RE
.B null
Pretend to verify. Used for testing internals.
.RE
fio will fill 1/2/3/4 bytes of the buffer at the time(it can be either a
decimal or a hex number). The verify_pattern if larger than a 32-bit quantity
has to be a hex number that starts with either "0x" or "0X". Use with
fio will fill 1/2/3/4 bytes of the buffer at the time(it can be either a
decimal or a hex number). The verify_pattern if larger than a 32-bit quantity
has to be a hex number that starts with either "0x" or "0X". Use with
+\fBverify\fP=meta or \fBverify\fP=pattern.
.TP
.BI verify_fatal \fR=\fPbool
If true, exit the job on the first observed verification failure. Default:
.TP
.BI verify_fatal \fR=\fPbool
If true, exit the job on the first observed verification failure. Default:
*/
fill:
pattern_length = i;
*/
fill:
pattern_length = i;
+ if (!i && !off)
+ i = 1;
while (i > 1 && i * 2 <= max_size) {
memcpy(&pattern[i], &pattern[0], i);
i *= 2;
while (i > 1 && i * 2 <= max_size) {
memcpy(&pattern[i], &pattern[0], i);
i *= 2;
.oval = VERIFY_META,
.help = "Use io information",
},
.oval = VERIFY_META,
.help = "Use io information",
},
+ { .ival = "pattern",
+ .oval = VERIFY_PATTERN_NO_HDR,
+ .help = "Verify strict pattern",
+ },
{
.ival = "null",
.oval = VERIFY_NULL,
{
.ival = "null",
.oval = VERIFY_NULL,
len = sizeof(struct vhdr_sha1);
break;
case VERIFY_PATTERN:
len = sizeof(struct vhdr_sha1);
break;
case VERIFY_PATTERN:
+ case VERIFY_PATTERN_NO_HDR:
if (td->o.verifysort || (td->flags & TD_F_VER_BACKLOG))
io_u->rand_seed = hdr->rand_seed;
if (td->o.verifysort || (td->flags & TD_F_VER_BACKLOG))
io_u->rand_seed = hdr->rand_seed;
- ret = verify_header(io_u, hdr, hdr_num, hdr_inc);
- if (ret)
- return ret;
+ if (td->o.verify != VERIFY_PATTERN_NO_HDR) {
+ ret = verify_header(io_u, hdr, hdr_num, hdr_inc);
+ if (ret)
+ return ret;
+ }
if (td->o.verify != VERIFY_NONE)
verify_type = td->o.verify;
if (td->o.verify != VERIFY_NONE)
verify_type = td->o.verify;
ret = verify_io_u_sha1(hdr, &vc);
break;
case VERIFY_PATTERN:
ret = verify_io_u_sha1(hdr, &vc);
break;
case VERIFY_PATTERN:
+ case VERIFY_PATTERN_NO_HDR:
ret = verify_io_u_pattern(hdr, &vc);
break;
default:
ret = verify_io_u_pattern(hdr, &vc);
break;
default:
unsigned int data_len;
void *data, *p;
unsigned int data_len;
void *data, *p;
+ if (td->o.verify == VERIFY_PATTERN_NO_HDR)
+ return;
+
p = (void *) hdr;
hdr->magic = FIO_HDR_MAGIC;
p = (void *) hdr;
hdr->magic = FIO_HDR_MAGIC;
VERIFY_META, /* block_num, timestamp etc. */
VERIFY_SHA1, /* sha1 sum data blocks */
VERIFY_PATTERN, /* verify specific patterns */
VERIFY_META, /* block_num, timestamp etc. */
VERIFY_SHA1, /* sha1 sum data blocks */
VERIFY_PATTERN, /* verify specific patterns */
+ VERIFY_PATTERN_NO_HDR, /* verify specific patterns, no hdr */
VERIFY_NULL, /* pretend to verify */
};
VERIFY_NULL, /* pretend to verify */
};