static void update_test_data(void) { uint64_t i, n; grow = 1; shrink = 0; full = 0; while (!full) do_an_operation(); grow = 0; shrink = 1; /* Drop to less than 50% full */ n = operation_count / 10; while (n--) { uint64_t free; uint64_t total; for (i = 0; i < 10; ++i) do_an_operation(); free = tests_get_free_space(); total = tests_get_total_space(); if ((free * 100) / total >= 50) break; } grow = 0; shrink = 0; full = 0; n = operation_count * 2; for (i = 0; i < n; ++i) do_an_operation(); }
static void create_test_data(void) { uint64_t i; grow = 1; shrink = 0; full = 0; operation_count = 0; while (!full) { do_an_operation(); ++operation_count; } grow = 0; shrink = 1; /* Drop to less than 90% full */ for (;;) { uint64_t free; uint64_t total; for (i = 0; i < 10; ++i) do_an_operation(); free = tests_get_free_space(); total = tests_get_total_space(); if ((free * 100) / total >= 10) break; } grow = 0; shrink = 0; full = 0; for (i = 0; i < operation_count * 2; ++i) do_an_operation(); }
/* Calculate: free_space * numerator / denominator */ uint64_t tests_get_big_file_size(unsigned numerator, unsigned denominator) { if (denominator == 0) denominator = 1; if (numerator > denominator) numerator = denominator; return numerator * (tests_get_free_space() / denominator); }
void integck(void) { pid_t pid; int64_t rpt; uint64_t z; char dir_name[256]; /* Make our top directory */ pid = getpid(); printf("pid is %u\n", (unsigned) pid); tests_cat_pid(dir_name, "integck_test_dir_", pid); if (chdir(dir_name) != -1) { /* Remove it if it is already there */ tests_clear_dir("."); CHECK(chdir("..") != -1); CHECK(rmdir(dir_name) != -1); } initial_free_space = tests_get_free_space(); log10_initial_free_space = 0; for (z = initial_free_space; z >= 10; z /= 10) ++log10_initial_free_space; top_dir = dir_new(NULL, dir_name); if (!top_dir) return; srand(pid); create_test_data(); if (!tests_fs_is_rootfs()) { close_open_files(); tests_remount(); /* Requires root access */ } /* Check everything */ dir_check(top_dir); check_deleted_files(); for (rpt = 0; tests_repeat_parameter == 0 || rpt < tests_repeat_parameter; ++rpt) { update_test_data(); if (!tests_fs_is_rootfs()) { close_open_files(); tests_remount(); /* Requires root access */ } /* Check everything */ dir_check(top_dir); check_deleted_files(); } /* Tidy up by removing everything */ close_open_files(); tests_clear_dir(dir_name); CHECK(rmdir(dir_name) != -1); }
static void file_mmap_write(struct file_info *file) { size_t write_cnt = 0, r, i, len, size; struct write_info *w = file->writes; void *addr; char *waddr; off_t offs, offset; unsigned seed; uint64_t free_space; int fd; char *path; if (!file->links) return; free_space = tests_get_free_space(); if (!free_space) return; /* Randomly pick a written area of the file */ if (!w) return; while (w) { write_cnt += 1; w = w->next; } r = tests_random_no(write_cnt); w = file->writes; for (i = 0; w && w->next && i < r; i++) w = w->next; offs = (w->offset / mem_page_size) * mem_page_size; len = w->size + (w->offset - offs); if (len > 1 << 24) len = 1 << 24; /* Open it */ path = dir_path(file->links->parent, file->links->name); fd = open(path, O_RDWR); CHECK(fd != -1); free(path); /* mmap it */ addr = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, offs); CHECK(close(fd) != -1); CHECK(addr != MAP_FAILED); /* Randomly select a part of the mmapped area to write */ size = tests_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); /* Write it */ seed = tests_random_no(10000000); srand(seed); waddr = addr + (offset - offs); for (i = 0; i < size; i++) waddr[i] = rand(); /* Unmap it */ CHECK(munmap(addr, len) != -1); /* Record what was written */ file_write_info(file, offset, size, seed); }