From: Jens Axboe Date: Tue, 17 Apr 2018 23:48:43 +0000 (-0600) Subject: init: ensure that read/write use the same random seed for verify X-Git-Tag: fio-3.7~28 X-Git-Url: https://git.kernel.dk/?p=fio.git;a=commitdiff_plain;h=a2e313142546aa5cb95ba7cb3708b7e06f58518c init: ensure that read/write use the same random seed for verify If we are verifying, then reads need to use the same blockrange random trim as writes. Otherwise doing a deferred verify of a write job may not yield the same block size ranges, causing verify to fail. Example of failed job: $ cat job.fio [global] ioengine=sync verify=md5 bsrange=1k-16k rw=randwrite randseed=50 size=10m filename=foo [write] rw=randwrite do_verify=0 write_iolog=wlog [read] rw=randread do_verify=1 verify_fatal=1 verify_dump=1 write_iolog=rlog $ fio --section=write job.fio $ fio --section=read job.fio Fixes: https://github.com/axboe/fio/issues/582 Signed-off-by: Jens Axboe --- diff --git a/init.c b/init.c index f5ff73d0..07d1cdd3 100644 --- a/init.c +++ b/init.c @@ -997,23 +997,26 @@ void td_fill_verify_state_seed(struct thread_data *td) static void td_fill_rand_seeds_internal(struct thread_data *td, bool use64) { + unsigned int read_seed = td->rand_seeds[FIO_RAND_BS_OFF]; + unsigned int write_seed = td->rand_seeds[FIO_RAND_BS1_OFF]; + unsigned int trim_seed = td->rand_seeds[FIO_RAND_BS2_OFF]; int i; /* * trimwrite is special in that we need to generate the same * offsets to get the "write after trim" effect. If we are * using bssplit to set buffer length distributions, ensure that - * we seed the trim and write generators identically. + * we seed the trim and write generators identically. Ditto for + * verify, read and writes must have the same seed, if we are doing + * read verify. */ - if (td_trimwrite(td)) { - init_rand_seed(&td->bsrange_state[DDIR_READ], td->rand_seeds[FIO_RAND_BS_OFF], use64); - init_rand_seed(&td->bsrange_state[DDIR_WRITE], td->rand_seeds[FIO_RAND_BS1_OFF], use64); - init_rand_seed(&td->bsrange_state[DDIR_TRIM], td->rand_seeds[FIO_RAND_BS1_OFF], use64); - } else { - init_rand_seed(&td->bsrange_state[DDIR_READ], td->rand_seeds[FIO_RAND_BS_OFF], use64); - init_rand_seed(&td->bsrange_state[DDIR_WRITE], td->rand_seeds[FIO_RAND_BS1_OFF], use64); - init_rand_seed(&td->bsrange_state[DDIR_TRIM], td->rand_seeds[FIO_RAND_BS2_OFF], use64); - } + if (td->o.verify != VERIFY_NONE) + write_seed = read_seed; + if (td_trimwrite(td)) + trim_seed = write_seed; + init_rand_seed(&td->bsrange_state[DDIR_READ], read_seed, use64); + init_rand_seed(&td->bsrange_state[DDIR_WRITE], write_seed, use64); + init_rand_seed(&td->bsrange_state[DDIR_TRIM], trim_seed, use64); td_fill_verify_state_seed(td); init_rand_seed(&td->rwmix_state, td->rand_seeds[FIO_RAND_MIX_OFF], false);