/* 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;
}
예제 #3
0
파일: orph.c 프로젝트: sigma-star/mtd-utils
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);
}