static void do_an_operation(void) { /* Half the time operate on already open files */ if (tests_random_no(100) < 50) operate_on_dir(top_dir); else operate_on_an_open_file(); }
/* Randomly select something to do with a directory entry */ static void operate_on_entry(struct dir_entry_info *entry) { /* If shrinking, 1 time in 50, remove a directory */ if (entry->type == 'd') { if (shrink && tests_random_no(50) == 0) { dir_remove(entry->entry.dir); return; } operate_on_dir(entry->entry.dir); } /* If shrinking, 1 time in 10, remove a file */ if (entry->type == 'f') { if (shrink && tests_random_no(10) == 0) { file_delete(entry->entry.file); return; } operate_on_file(entry->entry.file); } }
/* Randomly select something to do with a directory entry */ static void operate_on_entry(struct dir_entry_info *entry) { /* 1 time in 1000 rename */ if (tests_random_no(1000) == 0) { rename_entry(entry); return; } if (entry->type == 's') { symlink_check(entry->entry.symlink); /* If shrinking, 1 time in 50, remove a symlink */ if (shrink && tests_random_no(50) == 0) symlink_remove(entry->entry.symlink); return; } if (entry->type == 'd') { /* If shrinking, 1 time in 50, remove a directory */ if (shrink && tests_random_no(50) == 0) { dir_remove(entry->entry.dir); return; } operate_on_dir(entry->entry.dir); } if (entry->type == 'f') { /* If shrinking, 1 time in 10, remove a file */ if (shrink && tests_random_no(10) == 0) { file_delete(entry->entry.file); return; } /* If not growing, 1 time in 10, unlink a file with links > 1 */ if (!grow && entry->entry.file->link_count > 1 && tests_random_no(10) == 0) { file_unlink_file(entry->entry.file); return; } operate_on_file(entry->entry.file); } }