file: unionize lfsr/randommap
We only use one of them, add file flags to distinguish between the
two.
Signed-off-by: Jens Axboe <axboe@fb.com>
diff --git a/file.h b/file.h
index 4d24bdc..f7a1eae 100644
--- a/file.h
+++ b/file.h
@@ -27,6 +27,8 @@
FIO_FILE_size_known = 1 << 4, /* size has been set */
FIO_FILE_hashed = 1 << 5, /* file is on hash */
FIO_FILE_partial_mmap = 1 << 6, /* can't do full mmap */
+ FIO_FILE_axmap = 1 << 7, /* uses axmap */
+ FIO_FILE_lfsr = 1 << 8, /* lfsr is used */
};
enum file_lock_mode {
@@ -107,11 +109,12 @@
};
/*
- * block map for random io
+ * block map or LFSR for random io
*/
- struct axmap *io_axmap;
-
- struct fio_lfsr lfsr;
+ union {
+ struct axmap *io_axmap;
+ struct fio_lfsr lfsr;
+ };
/*
* Used for zipf random distribution
@@ -154,6 +157,8 @@
FILE_FLAG_FNS(size_known);
FILE_FLAG_FNS(hashed);
FILE_FLAG_FNS(partial_mmap);
+FILE_FLAG_FNS(axmap);
+FILE_FLAG_FNS(lfsr);
#undef FILE_FLAG_FNS
/*
diff --git a/filesetup.c b/filesetup.c
index c026048..0fb5589 100644
--- a/filesetup.c
+++ b/filesetup.c
@@ -1044,12 +1044,16 @@
seed = td->rand_seeds[FIO_RAND_BLOCK_OFF];
- if (!lfsr_init(&f->lfsr, blocks, seed, 0))
+ if (!lfsr_init(&f->lfsr, blocks, seed, 0)) {
+ fio_file_set_lfsr(f);
continue;
+ }
} else if (!td->o.norandommap) {
f->io_axmap = axmap_new(blocks);
- if (f->io_axmap)
+ if (f->io_axmap) {
+ fio_file_set_axmap(f);
continue;
+ }
} else if (td->o.norandommap)
continue;
@@ -1104,8 +1108,10 @@
sfree(f->file_name);
f->file_name = NULL;
- axmap_free(f->io_axmap);
- f->io_axmap = NULL;
+ if (fio_file_axmap(f)) {
+ axmap_free(f->io_axmap);
+ f->io_axmap = NULL;
+ }
sfree(f);
}
@@ -1537,9 +1543,9 @@
f->last_start[i] = -1ULL;
}
- if (f->io_axmap)
+ if (fio_file_axmap(f))
axmap_reset(f->io_axmap);
- if (td->o.random_generator == FIO_RAND_GEN_LFSR)
+ else if (fio_file_lfsr(f))
lfsr_reset(&f->lfsr, td->rand_seeds[FIO_RAND_BLOCK_OFF]);
}
diff --git a/io_ddir.h b/io_ddir.h
index 269768e..b16a6b9 100644
--- a/io_ddir.h
+++ b/io_ddir.h
@@ -42,7 +42,7 @@
#define td_trim(td) ((td)->o.td_ddir & TD_DDIR_TRIM)
#define td_rw(td) (((td)->o.td_ddir & TD_DDIR_RW) == TD_DDIR_RW)
#define td_random(td) ((td)->o.td_ddir & TD_DDIR_RAND)
-#define file_randommap(td, f) (!(td)->o.norandommap && (f)->io_axmap)
+#define file_randommap(td, f) (!(td)->o.norandommap && fio_file_axmap((f)))
static inline int ddir_sync(enum fio_ddir ddir)
{
diff --git a/io_u.c b/io_u.c
index efbcea9..23a9e4a 100644
--- a/io_u.c
+++ b/io_u.c
@@ -100,6 +100,8 @@
} else {
uint64_t off = 0;
+ assert(fio_file_lfsr(f));
+
if (lfsr_next(&f->lfsr, &off))
return 1;