#include "smalloc.h"
#include "filehash.h"
#include "os/os.h"
+#include "hash.h"
+#include "lib/bitmap.h"
#ifdef FIO_HAVE_LINUX_FALLOCATE
#include <linux/falloc.h>
static int __init_rand_distribution(struct thread_data *td, struct fio_file *f)
{
- unsigned int range_size;
+ unsigned int range_size, seed;
unsigned long nranges;
range_size = min(td->o.min_bs[DDIR_READ], td->o.min_bs[DDIR_WRITE]);
nranges = (f->real_file_size + range_size - 1) / range_size;
+ seed = jhash(f->file_name, strlen(f->file_name), 0) * td->thread_number;
+ if (!td->o.rand_repeatable)
+ seed = td->rand_seeds[4];
+
if (td->o.random_distribution == FIO_RAND_DIST_ZIPF)
- zipf_init(&f->zipf, nranges, td->o.zipf_theta);
+ zipf_init(&f->zipf, nranges, td->o.zipf_theta, seed);
else
- pareto_init(&f->zipf, nranges, td->o.pareto_h);
+ pareto_init(&f->zipf, nranges, td->o.pareto_h, seed);
return 1;
}
int init_random_map(struct thread_data *td)
{
- unsigned long long blocks, num_maps;
+ unsigned long long blocks;
struct fio_file *f;
unsigned int i;
for_each_file(td, f, i) {
blocks = (f->real_file_size + td->o.rw_min_bs - 1) /
(unsigned long long) td->o.rw_min_bs;
- num_maps = (blocks + BLOCKS_PER_MAP - 1) /
- (unsigned long long) BLOCKS_PER_MAP;
- if (num_maps == (unsigned long) num_maps) {
- f->file_map = smalloc(num_maps * sizeof(unsigned long));
- if (f->file_map) {
- f->num_maps = num_maps;
- continue;
- }
- } else
- f->file_map = NULL;
+ f->io_bitmap = bitmap_new(blocks);
+ if (f->io_bitmap)
+ continue;
if (!td->o.softrandommap) {
log_err("fio: failed allocating random map. If running"
log_info("fio: file %s failed allocating random map. Running "
"job without.\n", f->file_name);
- f->num_maps = 0;
}
return 0;
sfree(f->file_name);
f->file_name = NULL;
- sfree(f->file_map);
- f->file_map = NULL;
+ bitmap_free(f->io_bitmap);
+ f->io_bitmap = NULL;
sfree(f);
}