diff options
-rw-r--r-- | tests/fs-tests/integrity/integck.c | 119 |
1 files changed, 65 insertions, 54 deletions
diff --git a/tests/fs-tests/integrity/integck.c b/tests/fs-tests/integrity/integck.c index 5cb7bca..2dbe9de 100644 --- a/tests/fs-tests/integrity/integck.c +++ b/tests/fs-tests/integrity/integck.c @@ -196,6 +196,17 @@ static int is_truncation(struct write_info *w) } /* + * Return a random number between 0 and max - 1. + */ +static unsigned int random_no(unsigned int max) +{ + assert(max < RAND_MAX); + if (max == 0) + return 0; + return rand() % max; +} + +/* * Allocate a buffer of 'size' bytes and fill it with zeroes. */ static void *zalloc(size_t size) @@ -567,11 +578,11 @@ static void file_unlink(struct dir_entry_info *entry) static struct dir_entry_info *pick_entry(struct file_info *file) { struct dir_entry_info *entry; - size_t r; + unsigned int r; if (!file->link_count) return NULL; - r = tests_random_no(file->link_count); + r = random_no(file->link_count); entry = file->links; while (entry && r--) entry = entry->next_link; @@ -660,7 +671,7 @@ static struct fd_info *file_open(struct file_info *file) char *path; path = dir_path(file->links->parent, file->links->name); - if (tests_random_no(100) == 1) + if (random_no(100) == 1) flags |= O_SYNC; fd = open(path, flags); CHECK(fd != -1); @@ -806,30 +817,30 @@ static void get_offset_and_size(struct file_info *file, off_t *offset, size_t *size) { - size_t r, n; + unsigned int r, n; - r = tests_random_no(100); + r = random_no(100); if (r == 0 && grow) /* 1 time in 100, when growing, write off the end of the file */ - *offset = file->length + tests_random_no(10000000); + *offset = file->length + random_no(10000000); else if (r < 4) /* 3 (or 4) times in 100, write at the beginning of file */ *offset = 0; else if (r < 52 || !grow) /* 48 times in 100, write into the file */ - *offset = tests_random_no(file->length); + *offset = random_no(file->length); else /* 48 times in 100, write at the end of the file */ *offset = file->length; /* Distribute the size logarithmically */ - if (tests_random_no(1000) == 0) - r = tests_random_no(fsinfo.log10_initial_free + 2); + if (random_no(1000) == 0) + r = random_no(fsinfo.log10_initial_free + 2); else - r = tests_random_no(fsinfo.log10_initial_free); + r = random_no(fsinfo.log10_initial_free); n = 1; while (r--) n *= 10; - *size = tests_random_no(n); + *size = random_no(n); if (!grow && *offset + *size > file->length) *size = file->length - *offset; if (*size == 0) @@ -875,7 +886,7 @@ static void file_mmap_write(struct file_info *file) write_cnt += 1; w = w->next; } - r = tests_random_no(write_cnt); + r = random_no(write_cnt); w = file->writes; for (i = 0; w && w->next && i < r; i++) w = w->next; @@ -897,15 +908,15 @@ static void file_mmap_write(struct file_info *file) CHECK(addr != MAP_FAILED); /* Randomly select a part of the mmapped area to write */ - size = tests_random_no(w->size); + size = random_no(w->size); if (size > free_space) size = free_space; if (size == 0) size = 1; - offset = w->offset + tests_random_no(w->size - size); + offset = w->offset + random_no(w->size - size); /* Write it */ - seed = tests_random_no(MAX_RANDOM_SEED); + seed = random_no(MAX_RANDOM_SEED); srand(seed); waddr = addr + (offset - offs); for (i = 0; i < size; i++) @@ -926,19 +937,19 @@ static void file_write(struct file_info *file, int fd) int truncate = 0; if (fsinfo.can_mmap && !full && !file->deleted && - tests_random_no(100) == 1) { + random_no(100) == 1) { file_mmap_write(file); return; } get_offset_and_size(file, &offset, &size); - seed = tests_random_no(MAX_RANDOM_SEED); + seed = random_no(MAX_RANDOM_SEED); actual = file_write_data(file, fd, offset, size, seed); if (offset + actual <= file->length && shrink) /* 1 time in 100, when shrinking truncate after the write */ - if (tests_random_no(100) == 0) + if (random_no(100) == 0) truncate = 1; if (actual != 0) @@ -1006,7 +1017,7 @@ static void file_truncate(struct file_info *file, int fd) { size_t new_length; - new_length = tests_random_no(file->length); + new_length = random_no(file->length); if (file_ftruncate(file, fd, new_length)) file_truncate_info(file, new_length); @@ -1431,15 +1442,15 @@ static char *make_name(struct dir_info *dir) do { found = 0; - if (tests_random_no(5) == 1) { - int i, n = tests_random_no(fsinfo.max_name_len) + 1; + if (random_no(5) == 1) { + int i, n = random_no(fsinfo.max_name_len) + 1; CHECK(n > 0 && n < 256); for (i = 0; i < n; i++) - name[i] = 'a' + tests_random_no(26); + name[i] = 'a' + random_no(26); name[i] = '\0'; } else - sprintf(name, "%u", (unsigned)tests_random_no(1000000)); + sprintf(name, "%u", random_no(1000000)); for (entry = dir->first; entry; entry = entry->next) { if (strcmp(entry->name, name) == 0) { found = 1; @@ -1456,9 +1467,9 @@ static struct file_info *pick_file(void) for (;;) { struct dir_entry_info *entry; - size_t r; + unsigned int r; - r = tests_random_no(dir->number_of_entries); + r = random_no(dir->number_of_entries); entry = dir->first; while (entry && r) { entry = entry->next; @@ -1482,13 +1493,13 @@ static struct dir_info *pick_dir(void) { struct dir_info *dir = top_dir; - if (tests_random_no(40) >= 30) + if (random_no(40) >= 30) return dir; for (;;) { struct dir_entry_info *entry; size_t r; - r = tests_random_no(dir->number_of_entries); + r = random_no(dir->number_of_entries); entry = dir->first; while (entry && r) { entry = entry->next; @@ -1514,7 +1525,7 @@ static struct dir_info *pick_dir(void) if (!entry) return dir; dir = entry->dir; - if (tests_random_no(40) >= 30) + if (random_no(40) >= 30) return dir; } } @@ -1524,15 +1535,15 @@ static char *pick_rename_name(struct dir_info **parent, { struct dir_info *dir = pick_dir(); struct dir_entry_info *entry; - size_t r; + unsigned int r; *parent = dir; *rename_entry = NULL; - if (grow || tests_random_no(20) < 10) + if (grow || random_no(20) < 10) return dup_string(make_name(dir)); - r = tests_random_no(dir->number_of_entries); + r = random_no(dir->number_of_entries); entry = dir->first; while (entry && r) { entry = entry->next; @@ -1673,15 +1684,15 @@ static char *pick_symlink_target(const char *symlink_path) { struct dir_info *dir; struct dir_entry_info *entry; - size_t r; char *path, *rel_path; + unsigned int r; dir = pick_dir(); - if (tests_random_no(100) < 10) + if (random_no(100) < 10) return dir_path(dir, make_name(dir)); - r = tests_random_no(dir->number_of_entries); + r = random_no(dir->number_of_entries); entry = dir->first; while (entry && r) { entry = entry->next; @@ -1692,7 +1703,7 @@ static char *pick_symlink_target(const char *symlink_path) if (!entry) return dir_path(dir, make_name(dir)); path = dir_path(dir, entry->name); - if (tests_random_no(20) < 10) + if (random_no(20) < 10) return path; rel_path = relative_path(symlink_path, path); free(path); @@ -1742,20 +1753,20 @@ static void operate_on_file(struct file_info *file); static void operate_on_entry(struct dir_entry_info *entry) { /* 1 time in 1000 rename */ - if (tests_random_no(1000) == 0) { + if (random_no(1000) == 0) { rename_entry(entry); return; } if (entry->type == 's') { symlink_check(entry->symlink); /* If shrinking, 1 time in 50, remove a symlink */ - if (shrink && tests_random_no(50) == 0) + if (shrink && random_no(50) == 0) symlink_remove(entry->symlink); return; } if (entry->type == 'd') { /* If shrinking, 1 time in 50, remove a directory */ - if (shrink && tests_random_no(50) == 0) { + if (shrink && random_no(50) == 0) { dir_remove(entry->dir); return; } @@ -1763,13 +1774,13 @@ static void operate_on_entry(struct dir_entry_info *entry) } if (entry->type == 'f') { /* If shrinking, 1 time in 10, remove a file */ - if (shrink && tests_random_no(10) == 0) { + if (shrink && random_no(10) == 0) { file_delete(entry->file); return; } /* If not growing, 1 time in 10, unlink a file with links > 1 */ if (!grow && entry->file->link_count > 1 && - tests_random_no(10) == 0) { + random_no(10) == 0) { file_unlink_file(entry->file); return; } @@ -1780,11 +1791,11 @@ static void operate_on_entry(struct dir_entry_info *entry) /* Randomly select something to do with a directory */ static void operate_on_dir(struct dir_info *dir) { - size_t r; struct dir_entry_info *entry; struct file_info *file; + unsigned int r; - r = tests_random_no(14); + r = random_no(14); if (r == 0 && grow) /* When growing, 1 time in 14 create a file */ file_new(dir, make_name(dir)); @@ -1794,12 +1805,12 @@ static void operate_on_dir(struct dir_info *dir) else if (r == 2 && grow && (file = pick_file()) != NULL) /* When growing, 1 time in 14 create a hard link */ link_new(dir, make_name(dir), file); - else if (r == 3 && grow && tests_random_no(5) == 0) + else if (r == 3 && grow && random_no(5) == 0) /* When growing, 1 time in 70 create a symbolic link */ symlink_new(dir, make_name(dir)); else { /* Otherwise randomly select an entry to operate on */ - r = tests_random_no(dir->number_of_entries); + r = random_no(dir->number_of_entries); entry = dir->first; while (entry && r) { entry = entry->next; @@ -1819,24 +1830,24 @@ static void operate_on_file(struct file_info *file) return; } /* Try to keep about 20 files open */ - if (open_files_count < 20 && tests_random_no(2) == 0) { + if (open_files_count < 20 && random_no(2) == 0) { file_open(file); return; } /* Try to keep up to 40 files open */ - if (open_files_count < 40 && tests_random_no(20) == 0) { + if (open_files_count < 40 && random_no(20) == 0) { file_open(file); return; } /* Occasionly truncate */ - if (shrink && tests_random_no(100) == 0) { + if (shrink && random_no(100) == 0) { file_truncate_file(file); return; } /* Mostly just write */ file_write_file(file); /* Once in a while check it too */ - if (tests_random_no(100) == 1) { + if (random_no(100) == 1) { int fd = -2; if (file->links) @@ -1853,9 +1864,9 @@ static void operate_on_file(struct file_info *file) /* Randomly select something to do with an open file */ static void operate_on_open_file(struct fd_info *fdi) { - size_t r; + unsigned int r; - r = tests_random_no(1000); + r = random_no(1000); if (shrink && r < 5) file_truncate(fdi->file, fdi->fd); else if (r < 21) @@ -1865,7 +1876,7 @@ static void operate_on_open_file(struct fd_info *fdi) else { file_write(fdi->file, fdi->fd); if (r >= 999) { - if (tests_random_no(100) >= 50) + if (random_no(100) >= 50) CHECK(fsync(fdi->fd) == 0); else CHECK(fdatasync(fdi->fd) == 0); @@ -1876,7 +1887,7 @@ static void operate_on_open_file(struct fd_info *fdi) /* Select an open file at random */ static void operate_on_an_open_file(void) { - size_t r; + unsigned int r; struct open_file_info *ofi; /* When shrinking, close all open files 1 time in 128 */ @@ -1904,7 +1915,7 @@ static void operate_on_an_open_file(void) ofi = ofi->next; } } - r = tests_random_no(open_files_count); + r = random_no(open_files_count); for (ofi = open_files; ofi; ofi = ofi->next, --r) if (!r) { operate_on_open_file(ofi->fdi); @@ -1915,7 +1926,7 @@ static void operate_on_an_open_file(void) static void do_an_operation(void) { /* Half the time operate on already open files */ - if (tests_random_no(100) < 50) + if (random_no(100) < 50) operate_on_dir(top_dir); else operate_on_an_open_file(); |