/* Write size bytes to the end of file descriptor fd using file_number to determine the random data written i.e. seed for random numbers */ unsigned tests_fill_fragment_file(unsigned file_number, int fd, unsigned size) { off_t offset; offset = lseek(fd, 0, SEEK_END); CHECK(offset != (off_t) -1); return tests_write_fragment_file(file_number, fd, offset, size); }
/* Write size bytes at offset to the file "fragment_n" where n is the file_number and file_number also determines the random data written i.e. seed for random numbers */ unsigned tests_overwite_fragment_file( unsigned file_number, off_t offset, unsigned size) { int fd; unsigned actual_size; char file_name[256]; sprintf(file_name, "fragment_%u", file_number); fd = open(file_name, O_RDWR | tests_maybe_sync_flag()); if (fd == -1 && errno == ENOSPC) { errno = 0; return 0; /* File system full */ } CHECK(fd != -1); actual_size = tests_write_fragment_file(file_number, fd, offset, size); CHECK(close(fd) != -1); return actual_size; }
static void orph(void) { pid_t pid; unsigned i, j, k, n; int fd, done, full; int64_t repeat; ssize_t sz; char dir_name[256]; int fds[MAX_ORPHANS]; /* Create a directory to test in */ pid = getpid(); tests_cat_pid(dir_name, "orph_test_dir_", pid); if (chdir(dir_name) == -1) CHECK(mkdir(dir_name, 0777) != -1); CHECK(chdir(dir_name) != -1); repeat = tests_repeat_parameter; for (;;) { full = 0; done = 0; n = 0; while (n + 100 < MAX_ORPHANS && !done) { /* Make 100 more orphans */ for (i = 0; i < 100; i++) { fd = tests_create_orphan(n + i); if (fd < 0) { done = 1; if (errno == ENOSPC) full = 1; else if (errno != EMFILE) CHECK(0); errno = 0; break; } fds[n + i] = fd; } if (!full) { /* Write to orphans just created */ k = i; for (i = 0; i < k; i++) { if (tests_write_fragment_file(n + i, fds[n+i], 0, 1000) != 1000) { /* * Out of space, so close * remaining files */ for (j = i; j < k; j++) CHECK(close(fds[n + j]) != -1); done = 1; break; } } } if (!done) CHECK(tests_count_files_in_dir(".") == 0); n += i; } /* Check the data in the files */ for (i = 0; i < n; i++) tests_check_fragment_file_fd(i, fds[i]); if (!full && n) { /* Ensure the file system is full */ n -= 1; do { sz = write(fds[n], fds, 4096); if (sz == -1 && errno == ENOSPC) { errno = 0; break; } CHECK(sz >= 0); } while (sz == 4096); CHECK(close(fds[n]) != -1); } /* Check the data in the files */ for (i = 0; i < n; i++) tests_check_fragment_file_fd(i, fds[i]); /* Sleep */ if (tests_sleep_parameter > 0) { unsigned us = tests_sleep_parameter * 1000; unsigned rand_divisor = RAND_MAX / us; unsigned s = (us / 2) + (rand() / rand_divisor); usleep(s); } /* Close orphans */ for (i = 0; i < n; i++) CHECK(close(fds[i]) != -1); /* Break if repeat count exceeded */ if (tests_repeat_parameter > 0 && --repeat <= 0) break; } CHECK(tests_count_files_in_dir(".") == 0); CHECK(chdir("..") != -1); CHECK(rmdir(dir_name) != -1); }