aboutsummaryrefslogtreecommitdiff
path: root/tests/fs-tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests/fs-tests')
-rw-r--r--tests/fs-tests/integrity/integck.c126
1 files changed, 69 insertions, 57 deletions
diff --git a/tests/fs-tests/integrity/integck.c b/tests/fs-tests/integrity/integck.c
index 1703364..4f39ce3 100644
--- a/tests/fs-tests/integrity/integck.c
+++ b/tests/fs-tests/integrity/integck.c
@@ -1776,8 +1776,47 @@ static void symlink_remove(struct symlink_info *symlink)
free(path);
}
-static void operate_on_dir(struct dir_info *dir);
-static void operate_on_file(struct file_info *file);
+static int operate_on_dir(struct dir_info *dir);
+
+/* Randomly select something to do with a file */
+static void operate_on_file(struct file_info *file)
+{
+ /* Try to keep at least 10 files open */
+ if (open_files_count < 10) {
+ file_open(file);
+ return;
+ }
+ /* Try to keep about 20 files open */
+ 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 && random_no(20) == 0) {
+ file_open(file);
+ return;
+ }
+ /* Occasionly truncate */
+ 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 (random_no(100) == 1) {
+ int fd = -2;
+
+ if (file->links)
+ fd = -1;
+ else if (file->fds)
+ fd = file->fds->fd;
+ if (fd != -2) {
+ check_run_no += 1;
+ file_check(file, fd);
+ }
+ }
+}
/* Randomly select something to do with a directory entry */
static void operate_on_entry(struct dir_entry_info *entry)
@@ -1818,8 +1857,10 @@ 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)
+/*
+ * Randomly select something to do with a directory.
+ */
+static int operate_on_dir(struct dir_info *dir)
{
struct dir_entry_info *entry;
struct file_info *file;
@@ -1849,54 +1890,17 @@ static void operate_on_dir(struct dir_info *dir)
if (entry)
operate_on_entry(entry);
}
-}
-/* Randomly select something to do with a file */
-static void operate_on_file(struct file_info *file)
-{
- /* Try to keep at least 10 files open */
- if (open_files_count < 10) {
- file_open(file);
- return;
- }
- /* Try to keep about 20 files open */
- 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 && random_no(20) == 0) {
- file_open(file);
- return;
- }
- /* Occasionly truncate */
- 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 (random_no(100) == 1) {
- int fd = -2;
-
- if (file->links)
- fd = -1;
- else if (file->fds)
- fd = file->fds->fd;
- if (fd != -2) {
- check_run_no += 1;
- file_check(file, fd);
- }
- }
+ return 0;
}
-/* Randomly select something to do with an open file */
-static void operate_on_open_file(struct fd_info *fdi)
+/*
+ * Randomly select something to do with an open file.
+ */
+static int operate_on_open_file(struct fd_info *fdi)
{
- unsigned int r;
+ unsigned int r = random_no(1000);
- r = random_no(1000);
if (shrink && r < 5)
file_truncate(fdi->file, fdi->fd);
else if (r < 21)
@@ -1912,10 +1916,14 @@ static void operate_on_open_file(struct fd_info *fdi)
CHECK(fdatasync(fdi->fd) == 0);
}
}
+
+ return 0;
}
-/* Select an open file at random */
-static void operate_on_an_open_file(void)
+/*
+ * Randomly select an open file and do a random operation on it.
+ */
+static int operate_on_an_open_file(void)
{
unsigned int r;
struct open_file_info *ofi;
@@ -1928,9 +1936,10 @@ static void operate_on_an_open_file(void)
x &= 127;
if (x == 0) {
close_open_files();
- return;
+ return 0;
}
}
+
/* Close any open files that have errored */
if (!fsinfo.nospc_size_ok) {
ofi = open_files;
@@ -1945,23 +1954,26 @@ static void operate_on_an_open_file(void)
ofi = ofi->next;
}
}
+
r = random_no(open_files_count);
- for (ofi = open_files; ofi; ofi = ofi->next, --r)
+ for (ofi = open_files; ofi; ofi = ofi->next, r--)
if (!r) {
- operate_on_open_file(ofi->fdi);
- return;
+ return operate_on_open_file(ofi->fdi);
}
+
+ return 0;
}
+/*
+ * Do a random file-system operation.
+ */
static int do_an_operation(void)
{
/* Half the time operate on already open files */
if (random_no(100) < 50)
- operate_on_dir(top_dir);
+ return operate_on_dir(top_dir);
else
- operate_on_an_open_file();
-
- return 0;
+ return operate_on_an_open_file();
}
/*