t/zbd: Combine write and read fio commands for test case #6
[fio.git] / verify.c
index da429e793a86e8f0198a8cffaa5bf8a964898fcc..5ee0029d130e2f891d48cbd6c1ee01203085a6c3 100644 (file)
--- a/verify.c
+++ b/verify.c
@@ -8,12 +8,14 @@
 #include <pthread.h>
 #include <libgen.h>
 
+#include "arch/arch.h"
 #include "fio.h"
 #include "verify.h"
 #include "trim.h"
 #include "lib/rand.h"
 #include "lib/hweight.h"
 #include "lib/pattern.h"
+#include "oslib/asprintf.h"
 
 #include "crc/md5.h"
 #include "crc/crc64.h"
@@ -39,33 +41,27 @@ void fill_buffer_pattern(struct thread_data *td, void *p, unsigned int len)
        (void)cpy_pattern(td->o.buffer_pattern, td->o.buffer_pattern_bytes, p, len);
 }
 
-static void __fill_buffer(struct thread_options *o, unsigned long seed, void *p,
+static void __fill_buffer(struct thread_options *o, uint64_t seed, void *p,
                          unsigned int len)
 {
        __fill_random_buf_percentage(seed, p, o->compress_percentage, len, len, o->buffer_pattern, o->buffer_pattern_bytes);
 }
 
-static unsigned long fill_buffer(struct thread_data *td, void *p,
-                                unsigned int len)
-{
-       struct frand_state *fs = &td->verify_state;
-       struct thread_options *o = &td->o;
-
-       return fill_random_buf_percentage(fs, p, o->compress_percentage, len, len, o->buffer_pattern, o->buffer_pattern_bytes);
-}
-
 void fill_verify_pattern(struct thread_data *td, void *p, unsigned int len,
-                        struct io_u *io_u, unsigned long seed, int use_seed)
+                        struct io_u *io_u, uint64_t seed, int use_seed)
 {
        struct thread_options *o = &td->o;
 
        if (!o->verify_pattern_bytes) {
                dprint(FD_VERIFY, "fill random bytes len=%u\n", len);
 
-               if (use_seed)
-                       __fill_buffer(o, seed, p, len);
-               else
-                       io_u->rand_seed = fill_buffer(td, p, len);
+               if (!use_seed) {
+                       seed = __rand(&td->verify_state);
+                       if (sizeof(int) != sizeof(long *))
+                               seed *= (unsigned long)__rand(&td->verify_state);
+               }
+               io_u->rand_seed = seed;
+               __fill_buffer(o, seed, p, len);
                return;
        }
 
@@ -100,7 +96,7 @@ static unsigned int get_hdr_inc(struct thread_data *td, struct io_u *io_u)
 }
 
 static void fill_pattern_headers(struct thread_data *td, struct io_u *io_u,
-                                unsigned long seed, int use_seed)
+                                uint64_t seed, int use_seed)
 {
        unsigned int hdr_inc, header_num;
        struct verify_header *hdr;
@@ -844,13 +840,11 @@ static int verify_header(struct io_u *io_u, struct thread_data *td,
         * For read-only workloads, the program cannot be certain of the
         * last numberio written to a block. Checking of numberio will be
         * done only for workloads that write data.  For verify_only,
-        * numberio will be checked in the last iteration when the correct
-        * state of numberio, that would have been written to each block
-        * in a previous run of fio, has been reached.
+        * numberio check is skipped.
         */
        if (td_write(td) && (td_min_bs(td) == td_max_bs(td)) &&
            !td->o.time_based)
-               if (!td->o.verify_only || td->o.loops == 0)
+               if (!td->o.verify_only)
                        if (hdr->numberio != io_u->numberio) {
                                log_err("verify: bad header numberio %"PRIu16
                                        ", wanted %"PRIu16,
@@ -1191,6 +1185,10 @@ static void populate_hdr(struct thread_data *td, struct io_u *io_u,
 
        fill_hdr(td, io_u, hdr, header_num, header_len, io_u->rand_seed);
 
+       if (header_len <= hdr_size(td, hdr)) {
+               td_verror(td, EINVAL, "Blocksize too small");
+               return;
+       }
        data_len = header_len - hdr_size(td, hdr);
 
        data = p + hdr_size(td, hdr);
@@ -1312,8 +1310,7 @@ int get_next_verify(struct thread_data *td, struct io_u *io_u)
                /*
                 * Ensure that the associated IO has completed
                 */
-               read_barrier();
-               if (ipo->flags & IP_F_IN_FLIGHT)
+               if (atomic_load_acquire(&ipo->flags) & IP_F_IN_FLIGHT)
                        goto nothing;
 
                rb_erase(n, &td->io_hist_tree);
@@ -1325,8 +1322,7 @@ int get_next_verify(struct thread_data *td, struct io_u *io_u)
                /*
                 * Ensure that the associated IO has completed
                 */
-               read_barrier();
-               if (ipo->flags & IP_F_IN_FLIGHT)
+               if (atomic_load_acquire(&ipo->flags) & IP_F_IN_FLIGHT)
                        goto nothing;
 
                flist_del(&ipo->list);
@@ -1635,8 +1631,7 @@ struct all_io_list *get_all_io_list(int save_mask, size_t *sz)
                        s->rand.state32.s[3] = 0;
                        s->rand.use64 = 0;
                }
-               s->name[sizeof(s->name) - 1] = '\0';
-               strncpy((char *) s->name, td->o.name, sizeof(s->name) - 1);
+               snprintf((char *) s->name, sizeof(s->name), "%s", td->o.name);
                next = io_list_next(s);
        }