filesetup.c revision 661598287ecc3b8987f312cf8403936552ce686a
153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include <unistd.h>
253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include <fcntl.h>
353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include <string.h>
453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include <assert.h>
5bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe#include <dirent.h>
653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include <sys/stat.h>
753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include <sys/mman.h>
8bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe#include <sys/types.h>
953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
1053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include "fio.h"
1153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
127bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboestatic int extend_file(struct thread_data *td, struct fio_file *f)
1325205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe{
14ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe	int r, new_layout = 0, unlink_file = 0, flags;
1525205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe	unsigned long long left;
1625205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe	unsigned int bs;
1725205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe	char *b;
18b2a151925a91f38aeb298d693687a47269ad4e94Jens Axboe
19507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	/*
20507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	 * check if we need to lay the file out complete again. fio
21507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	 * does that for operations involving reads, or for writes
22507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	 * where overwrite is set
23507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	 */
24507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	if (td_read(td) || (td_write(td) && td->o.overwrite))
25507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe		new_layout = 1;
26ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe	if (td_write(td) && !td->o.overwrite)
27ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe		unlink_file = 1;
28507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe
29ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe	if ((unlink_file || new_layout) && (f->flags & FIO_FILE_EXISTS)) {
307bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		if (unlink(f->file_name) < 0) {
317bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			td_verror(td, errno, "unlink");
327bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			return 1;
337bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		}
347bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
357bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
36507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	flags = O_WRONLY | O_CREAT;
37507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	if (new_layout)
38507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe		flags |= O_TRUNC;
39507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe
40507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	f->fd = open(f->file_name, flags, 0644);
4153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (f->fd < 0) {
42e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, errno, "open");
4353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return 1;
4453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
4553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
467bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (ftruncate(f->fd, f->real_file_size) == -1) {
47e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, errno, "ftruncate");
4853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		goto err;
4953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
5053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
51e8be2ad711db813537a1f2a6a6939c42909ba5ccJens Axboe	if (!new_layout)
52e8be2ad711db813537a1f2a6a6939c42909ba5ccJens Axboe		goto done;
53e8be2ad711db813537a1f2a6a6939c42909ba5ccJens Axboe
547bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (posix_fallocate(f->fd, 0, f->real_file_size) < 0) {
55e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, errno, "posix_fallocate");
5640f8298cd252157fa15d93f8eb470116a94069a0Jens Axboe		goto err;
5740f8298cd252157fa15d93f8eb470116a94069a0Jens Axboe	}
5840f8298cd252157fa15d93f8eb470116a94069a0Jens Axboe
592dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	b = malloc(td->o.max_bs[DDIR_WRITE]);
602dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	memset(b, 0, td->o.max_bs[DDIR_WRITE]);
6153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
627bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	left = f->real_file_size;
6353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	while (left && !td->terminate) {
642dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe		bs = td->o.max_bs[DDIR_WRITE];
6553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		if (bs > left)
6653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			bs = left;
6753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
6853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		r = write(f->fd, b, bs);
6953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
7053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		if (r == (int) bs) {
7153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			left -= bs;
7253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			continue;
7353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		} else {
7453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			if (r < 0)
75e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe				td_verror(td, errno, "write");
7653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			else
77e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe				td_verror(td, EIO, "write");
7853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
7953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			break;
8053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		}
8153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
8253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
8353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (td->terminate)
8453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		unlink(f->file_name);
852dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	else if (td->o.create_fsync)
8653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		fsync(f->fd);
8753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
8853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	free(b);
89507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboedone:
9053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	close(f->fd);
9153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	f->fd = -1;
9253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
9353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboeerr:
9453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	close(f->fd);
9553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	f->fd = -1;
9653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 1;
9753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
9853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
997bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboestatic unsigned long long get_rand_file_size(struct thread_data *td)
1009c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe{
1019c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe	unsigned long long ret;
1029c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe	long r;
1039c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe
1049c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe	r = os_random_long(&td->file_size_state);
1057bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	ret = td->o.file_size_low + (unsigned long long) ((double) td->o.file_size_high * (r / (RAND_MAX + 1.0)));
1062dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	ret -= (ret % td->o.rw_min_bs);
1079c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe	return ret;
1089c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe}
1099c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe
11053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int file_size(struct thread_data *td, struct fio_file *f)
11153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
11253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	struct stat st;
11353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
1147bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (fstat(f->fd, &st) == -1) {
1157bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		td_verror(td, errno, "fstat");
1167bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		return 1;
1177bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
11853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
1197bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	f->real_file_size = st.st_size;
12053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
12153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
12253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
12353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int bdev_size(struct thread_data *td, struct fio_file *f)
12453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
12553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	unsigned long long bytes;
12653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	int r;
12753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
12853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	r = blockdev_size(f->fd, &bytes);
12953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (r) {
130e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, r, "blockdev_size");
13153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return 1;
13253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
13353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
13453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	f->real_file_size = bytes;
13553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
13653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
13753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
13853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int get_file_size(struct thread_data *td, struct fio_file *f)
13953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
14053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	int ret = 0;
14153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
142409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe	if (f->flags & FIO_SIZE_KNOWN)
143409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe		return 0;
144409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe
1457bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (f->filetype == FIO_TYPE_FILE)
1467bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		ret = file_size(td, f);
1477bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	else if (f->filetype == FIO_TYPE_BD)
14853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		ret = bdev_size(td, f);
14953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	else
15053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		f->real_file_size = -1;
15153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
15253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (ret)
15353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return ret;
15453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
15553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (f->file_offset > f->real_file_size) {
1562dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe		log_err("%s: offset extends end (%Lu > %Lu)\n", td->o.name, f->file_offset, f->real_file_size);
15753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return 1;
15853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
15953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
160409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe	f->flags |= FIO_SIZE_KNOWN;
16153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
16253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
16353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
164e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboeint file_invalidate_cache(struct thread_data *td, struct fio_file *f)
165e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe{
166e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	int ret = 0;
167e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
1682dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	if (td->o.odirect)
169b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe		return 0;
170b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe
171e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	/*
172e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	 * FIXME: add blockdev flushing too
173e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	 */
174b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe	if (f->mmap)
1757bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		ret = madvise(f->mmap, f->io_size, MADV_DONTNEED);
176467d1b6b3ebbfcb7cc0545a882ba8a93ea66752bJens Axboe	else if (f->filetype == FIO_TYPE_FILE)
1777bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		ret = fadvise(f->fd, f->file_offset, f->io_size, POSIX_FADV_DONTNEED);
1787e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe	else if (f->filetype == FIO_TYPE_BD) {
179b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe		ret = blockdev_invalidate_cache(f->fd);
1807e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe		if (ret < 0 && errno == EACCES && geteuid()) {
1817e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe			log_err("fio: only root may flush block devices. Cache flush bypassed!\n");
1827e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe			ret = 0;
1837e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe		}
184b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe	} else if (f->filetype == FIO_TYPE_CHAR || f->filetype == FIO_TYPE_PIPE)
185e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe		ret = 0;
186e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
187e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	if (ret < 0) {
188e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, errno, "invalidate_cache");
189e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe		return 1;
190e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	}
191e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
192ad2da605a62faf16887970618b434db19594e17bJens Axboe	return ret;
193e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe}
194e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
195b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboevoid generic_close_file(struct thread_data fio_unused *td, struct fio_file *f)
19653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
197b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe	close(f->fd);
198b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe	f->fd = -1;
19953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
20053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
201b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboeint generic_open_file(struct thread_data *td, struct fio_file *f)
20253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
203661598287ecc3b8987f312cf8403936552ce686aJens Axboe	int is_std = 0;
20453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	int flags = 0;
20553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
206661598287ecc3b8987f312cf8403936552ce686aJens Axboe	if (!strcmp(f->file_name, "-")) {
207661598287ecc3b8987f312cf8403936552ce686aJens Axboe		if (td_rw(td)) {
208661598287ecc3b8987f312cf8403936552ce686aJens Axboe			log_err("fio: can't read/write to stdin/out\n");
209661598287ecc3b8987f312cf8403936552ce686aJens Axboe			return 1;
210661598287ecc3b8987f312cf8403936552ce686aJens Axboe		}
211661598287ecc3b8987f312cf8403936552ce686aJens Axboe		is_std = 1;
212661598287ecc3b8987f312cf8403936552ce686aJens Axboe	}
213661598287ecc3b8987f312cf8403936552ce686aJens Axboe
2142dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	if (td->o.odirect)
2152fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe		flags |= OS_O_DIRECT;
2162dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	if (td->o.sync_io)
2172fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe		flags |= O_SYNC;
21853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
2192fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe	if (td_write(td) || td_rw(td)) {
2202fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe		flags |= O_RDWR;
22153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
222af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe		if (f->filetype == FIO_TYPE_FILE)
2232fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe			flags |= O_CREAT;
2242fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe
225661598287ecc3b8987f312cf8403936552ce686aJens Axboe		if (is_std)
226661598287ecc3b8987f312cf8403936552ce686aJens Axboe			f->fd = dup(STDOUT_FILENO);
227661598287ecc3b8987f312cf8403936552ce686aJens Axboe		else
228661598287ecc3b8987f312cf8403936552ce686aJens Axboe			f->fd = open(f->file_name, flags, 0600);
2292fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe	} else {
230af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe		if (f->filetype == FIO_TYPE_CHAR)
2312fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe			flags |= O_RDWR;
2322fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe		else
2332fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe			flags |= O_RDONLY;
2342fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe
235661598287ecc3b8987f312cf8403936552ce686aJens Axboe		if (is_std)
236661598287ecc3b8987f312cf8403936552ce686aJens Axboe			f->fd = dup(STDIN_FILENO);
237661598287ecc3b8987f312cf8403936552ce686aJens Axboe		else
238661598287ecc3b8987f312cf8403936552ce686aJens Axboe			f->fd = open(f->file_name, flags);
23953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
24053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
24153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (f->fd == -1) {
242e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe		char buf[FIO_VERROR_SIZE];
243e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		int __e = errno;
244e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe
245e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe		snprintf(buf, sizeof(buf) - 1, "open(%s)", f->file_name);
246e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe
247e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe		td_verror(td, __e, buf);
24853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
24953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
250b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe	if (get_file_size(td, f))
251b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe		goto err;
252b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe
25353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
254b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboeerr:
255b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe	close(f->fd);
256b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe	return 1;
257b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe}
258b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe
25921972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboeint open_files(struct thread_data *td)
26021972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe{
26121972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe	struct fio_file *f;
262af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	unsigned int i;
263af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	int err = 0;
26421972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe
26521972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe	for_each_file(td, f, i) {
266b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe		err = td_io_open_file(td, f);
2679bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe		if (err) {
2689bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe			if (td->error == EMFILE) {
2699bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe				log_err("fio: limited open files to: %d\n", td->nr_open_files);
2709bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe				td->o.open_files = td->nr_open_files;
2719bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe				err = 0;
2729bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe				clear_error(td);
2739bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe			}
27421972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe			break;
2759bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe		}
276b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe
2772dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe		if (td->o.open_files == td->nr_open_files)
278b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe			break;
27921972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe	}
28021972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe
2817abf833d25ab6cc866308fe37483dfe2fde28efcJens Axboe	if (!err)
2827abf833d25ab6cc866308fe37483dfe2fde28efcJens Axboe		return 0;
2837abf833d25ab6cc866308fe37483dfe2fde28efcJens Axboe
284bdb4e2e99d4a87e5d3677cc09aa1ce92135125a9Jens Axboe	for_each_file(td, f, i)
285b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe		td_io_close_file(td, f);
2867abf833d25ab6cc866308fe37483dfe2fde28efcJens Axboe
28721972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe	return err;
28821972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe}
28921972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe
2907bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe/*
2917bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * open/close all files, so that ->real_file_size gets set
2927bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */
293bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboestatic int get_file_sizes(struct thread_data *td)
2947bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe{
2957bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	struct fio_file *f;
2967bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	unsigned int i;
297bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe	int err = 0;
2987bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
2997bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	for_each_file(td, f, i) {
300bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe		if (td->io_ops->open_file(td, f)) {
30140b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe			if (td->error != ENOENT) {
30240b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe				log_err("%s\n", td->verror);
30340b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe				err = 1;
30440b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe			}
305541d66d70b8fbe9860b31307c0760e6d5f4c78a8Jens Axboe			clear_error(td);
30607eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe		} else {
30707eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe			if (td->io_ops->close_file)
30807eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe				td->io_ops->close_file(td, f);
30907eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe		}
310409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe
311409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe		if (f->real_file_size == -1ULL && td->o.size)
312409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe			f->real_file_size = td->o.size / td->o.nr_files;
3137bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
314bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe
315bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe	return err;
3167bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe}
3177bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
3187bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe/*
3197bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * Open the files and setup files sizes, creating files if necessary.
3207bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */
32153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboeint setup_files(struct thread_data *td)
32253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
3237bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	unsigned long long total_size, extend_size;
32453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	struct fio_file *f;
325af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	unsigned int i;
326000b080395e45cbe0ce54e75f0e993addbdc8676Jens Axboe	int err = 0, need_extend;
32753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
32853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	/*
32953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	 * if ioengine defines a setup() method, it's responsible for
3307bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * opening the files and setting f->real_file_size to indicate
3317bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * the valid range for that file.
33253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	 */
33353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (td->io_ops->setup)
3347bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		err = td->io_ops->setup(td);
3357bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	else
336bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe		err = get_file_sizes(td);
33753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
338f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe	if (err)
339f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe		return err;
340f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe
3410a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe	/*
3427bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * check sizes. if the files/devices do not exist and the size
3437bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * isn't passed to fio, abort.
3440a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe	 */
3457bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	total_size = 0;
3467bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	for_each_file(td, f, i) {
3477bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		if (f->real_file_size == -1ULL)
3487bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			total_size = -1ULL;
3497bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		else
3507bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			total_size += f->real_file_size;
3517bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
3520a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe
3537bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	/*
3547bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * device/file sizes are zero and no size given, punt
3557bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 */
356409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe	if ((!total_size || total_size == -1ULL) && !td->o.size) {
3577bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		log_err("%s: you need to specify size=\n", td->o.name);
358e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, EINVAL, "total_file_size");
35953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return 1;
36053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
36153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
3627bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	/*
3637bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * now file sizes are known, so we can set ->io_size. if size= is
3647bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * not given, ->io_size is just equal to ->real_file_size. if size
3657bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * is given, ->io_size is size / nr_files.
3667bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 */
3677bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	extend_size = total_size = 0;
3687bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	need_extend = 0;
3697bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	for_each_file(td, f, i) {
3707bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		if (!td->o.file_size_low) {
3717bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			/*
3727bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * no file size range given, file size is equal to
3737bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * total size divided by number of files. if that is
3747bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * zero, set it to the real file size.
3757bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 */
3767bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			f->io_size = td->o.size / td->o.nr_files;
3777bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			if (!f->io_size)
3787bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe				f->io_size = f->real_file_size;
3797bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		} else if (f->real_file_size < td->o.file_size_low ||
3807bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			   f->real_file_size > td->o.file_size_high) {
3817bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			/*
3827bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * file size given. if it's fixed, use that. if it's a
3837bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * range, generate a random size in-between.
3847bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 */
3857bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			if (td->o.file_size_low == td->o.file_size_high)
3867bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe				f->io_size = td->o.file_size_low;
3877bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			else
3887bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe				f->io_size = get_rand_file_size(td);
3897bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		} else
3907bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			f->io_size = f->real_file_size;
39153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
3927bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		if (f->io_size == -1ULL)
3937bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			total_size = -1ULL;
3947bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		else
3957bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			total_size += f->io_size;
3967bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
3977bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		if (f->filetype == FIO_TYPE_FILE &&
3987bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		    f->io_size > f->real_file_size &&
3997bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		    !(td->io_ops->flags & FIO_DISKLESSIO)) {
4007bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			need_extend++;
4017bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			extend_size += f->io_size;
4027bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			f->flags |= FIO_FILE_EXTEND;
4037bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		}
4047bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
40553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
4067bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (!td->o.size)
4077bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		td->o.size = total_size;
40821972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe
4097bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	/*
4107bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * See if we need to extend some files
4117bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 */
4127bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (need_extend) {
4137bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		temp_stall_ts = 1;
4147bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		log_info("%s: Laying out IO file(s) (%u files / %LuMiB)\n",
4157bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			td->o.name, need_extend, extend_size >> 20);
4167bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
4177bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		for_each_file(td, f, i) {
4187bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			if (!(f->flags & FIO_FILE_EXTEND))
4197bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe				continue;
4207bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
421409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe			assert(f->filetype == FIO_TYPE_FILE);
4227bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			f->flags &= ~FIO_FILE_EXTEND;
4237bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			f->real_file_size = f->io_size;
4247bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			err = extend_file(td, f);
4257bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			if (err)
4267bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe				break;
4277bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		}
4287bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		temp_stall_ts = 0;
4297bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
4307bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
4317bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (err)
4327bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		return err;
4337bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
4347bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (!td->o.zone_size)
4357bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		td->o.zone_size = td->o.size;
4367bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
4377bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	td->total_io_size = td->o.size * td->o.loops;
4387bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	return 0;
43953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
44053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
441687270767de17dbad53c50e03e5d73d52505405cJens Axboeint init_random_map(struct thread_data *td)
442687270767de17dbad53c50e03e5d73d52505405cJens Axboe{
443687270767de17dbad53c50e03e5d73d52505405cJens Axboe	int num_maps, blocks;
444687270767de17dbad53c50e03e5d73d52505405cJens Axboe	struct fio_file *f;
445687270767de17dbad53c50e03e5d73d52505405cJens Axboe	unsigned int i;
446687270767de17dbad53c50e03e5d73d52505405cJens Axboe
447687270767de17dbad53c50e03e5d73d52505405cJens Axboe	if (td->o.norandommap)
448687270767de17dbad53c50e03e5d73d52505405cJens Axboe		return 0;
449687270767de17dbad53c50e03e5d73d52505405cJens Axboe
450687270767de17dbad53c50e03e5d73d52505405cJens Axboe	for_each_file(td, f, i) {
451687270767de17dbad53c50e03e5d73d52505405cJens Axboe		blocks = (f->real_file_size + td->o.rw_min_bs - 1) / td->o.rw_min_bs;
452687270767de17dbad53c50e03e5d73d52505405cJens Axboe		num_maps = (blocks + BLOCKS_PER_MAP-1)/ BLOCKS_PER_MAP;
453687270767de17dbad53c50e03e5d73d52505405cJens Axboe		f->file_map = malloc(num_maps * sizeof(long));
454687270767de17dbad53c50e03e5d73d52505405cJens Axboe		if (!f->file_map) {
455687270767de17dbad53c50e03e5d73d52505405cJens Axboe			log_err("fio: failed allocating random map. If running a large number of jobs, try the 'norandommap' option\n");
456687270767de17dbad53c50e03e5d73d52505405cJens Axboe			return 1;
457687270767de17dbad53c50e03e5d73d52505405cJens Axboe		}
458687270767de17dbad53c50e03e5d73d52505405cJens Axboe		f->num_maps = num_maps;
459687270767de17dbad53c50e03e5d73d52505405cJens Axboe		memset(f->file_map, 0, num_maps * sizeof(long));
460687270767de17dbad53c50e03e5d73d52505405cJens Axboe	}
461687270767de17dbad53c50e03e5d73d52505405cJens Axboe
462687270767de17dbad53c50e03e5d73d52505405cJens Axboe	return 0;
463687270767de17dbad53c50e03e5d73d52505405cJens Axboe}
464687270767de17dbad53c50e03e5d73d52505405cJens Axboe
46553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboevoid close_files(struct thread_data *td)
46653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
4670ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe	struct fio_file *f;
468af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	unsigned int i;
46953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
4700ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe	for_each_file(td, f, i) {
471fa1da8653e2177b3cc31a91e963c389f079d4172Jens Axboe		if ((f->flags & FIO_FILE_UNLINK) &&
472fa1da8653e2177b3cc31a91e963c389f079d4172Jens Axboe		    f->filetype == FIO_TYPE_FILE)
473132ad46d22bcf12da95ad69e03c1b6f23f5e60a9Jens Axboe			unlink(f->file_name);
474bdb4e2e99d4a87e5d3677cc09aa1ce92135125a9Jens Axboe
475b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe		td_io_close_file(td, f);
476b3dc7f075b85e004f8c681ebb8566475017696f3Jens Axboe
477fa1da8653e2177b3cc31a91e963c389f079d4172Jens Axboe		free(f->file_name);
478fa1da8653e2177b3cc31a91e963c389f079d4172Jens Axboe		f->file_name = NULL;
479fa1da8653e2177b3cc31a91e963c389f079d4172Jens Axboe
480c343981b9874179009a92e4d29eae95cf341843aJens Axboe		if (f->file_map) {
481b3dc7f075b85e004f8c681ebb8566475017696f3Jens Axboe			free(f->file_map);
482c343981b9874179009a92e4d29eae95cf341843aJens Axboe			f->file_map = NULL;
483c343981b9874179009a92e4d29eae95cf341843aJens Axboe		}
48453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
485b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe
4862dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	td->o.filename = NULL;
487cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	free(td->files);
488b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe	td->files = NULL;
4892dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	td->o.nr_files = 0;
49053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
491af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
492e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboestatic void get_file_type(struct fio_file *f)
493af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe{
494af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	struct stat sb;
495af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
496661598287ecc3b8987f312cf8403936552ce686aJens Axboe	if (!strcmp(f->file_name, "-"))
497661598287ecc3b8987f312cf8403936552ce686aJens Axboe		f->filetype = FIO_TYPE_PIPE;
498661598287ecc3b8987f312cf8403936552ce686aJens Axboe	else
499661598287ecc3b8987f312cf8403936552ce686aJens Axboe		f->filetype = FIO_TYPE_FILE;
500af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
501e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboe	if (!lstat(f->file_name, &sb)) {
502af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe		if (S_ISBLK(sb.st_mode))
503af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe			f->filetype = FIO_TYPE_BD;
504af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe		else if (S_ISCHR(sb.st_mode))
505af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe			f->filetype = FIO_TYPE_CHAR;
506b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe		else if (S_ISFIFO(sb.st_mode))
507b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe			f->filetype = FIO_TYPE_PIPE;
508af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	}
509af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe}
510af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
511af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboevoid add_file(struct thread_data *td, const char *fname)
512af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe{
5137b4e4fe5e6fa26f82f9169c18ec70c08d0805ca9Jens Axboe	int cur_files = td->files_index;
514bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe	char file_name[PATH_MAX];
515af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	struct fio_file *f;
516bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe	int len = 0;
517af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
518af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	td->files = realloc(td->files, (cur_files + 1) * sizeof(*f));
519af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
520af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	f = &td->files[cur_files];
521af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	memset(f, 0, sizeof(*f));
522af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	f->fd = -1;
523bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe
52407eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe	/*
52507eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe	 * init function, io engine may not be loaded yet
52607eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe	 */
52707eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe	if (td->io_ops && (td->io_ops->flags & FIO_DISKLESSIO))
52807eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe		f->real_file_size = -1ULL;
52907eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe
530bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe	if (td->o.directory)
531bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe		len = sprintf(file_name, "%s/", td->o.directory);
532bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe
533bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe	sprintf(file_name + len, "%s", fname);
534bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe	f->file_name = strdup(file_name);
535af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
536e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboe	get_file_type(f);
537af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
5387b4e4fe5e6fa26f82f9169c18ec70c08d0805ca9Jens Axboe	td->files_index++;
5391549441cdfecb2c1a4a8b8d494253859d67b4344Jens Axboe	if (f->filetype == FIO_TYPE_FILE)
5401549441cdfecb2c1a4a8b8d494253859d67b4344Jens Axboe		td->nr_normal_files++;
541af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe}
5420ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe
5430ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboevoid get_file(struct fio_file *f)
5440ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe{
5450ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	f->references++;
5460ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe}
5470ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe
5480ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboevoid put_file(struct thread_data *td, struct fio_file *f)
5490ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe{
5500ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	if (!(f->flags & FIO_FILE_OPEN))
5510ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe		return;
5520ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe
5530ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	assert(f->references);
5540ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	if (--f->references)
5550ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe		return;
5560ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe
557661598287ecc3b8987f312cf8403936552ce686aJens Axboe	if (should_fsync(td) && td->o.fsync_on_close &&
558661598287ecc3b8987f312cf8403936552ce686aJens Axboe	    (f->filetype == FIO_TYPE_FILE || f->filetype == FIO_TYPE_BD))
559ebb1415f729c123b8a13bcbd667bf4b4cc95b4d4Jens Axboe		fsync(f->fd);
560ebb1415f729c123b8a13bcbd667bf4b4cc95b4d4Jens Axboe
5610ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	if (td->io_ops->close_file)
5620ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe		td->io_ops->close_file(td, f);
5631020a139beff50faf1bb18f761b024b664a09e14Jens Axboe
5640ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	td->nr_open_files--;
5650ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	f->flags &= ~FIO_FILE_OPEN;
5660ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe}
567bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
568bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboestatic int recurse_dir(struct thread_data *td, const char *dirname)
569bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe{
570bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	struct dirent *dir;
571bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	int ret = 0;
572bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	DIR *D;
573bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
574bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	D = opendir(dirname);
575bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	if (!D) {
5760ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		char buf[FIO_VERROR_SIZE];
5770ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe
5780ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		snprintf(buf, FIO_VERROR_SIZE - 1, "opendir(%s)", dirname);
5790ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		td_verror(td, errno, buf);
580bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		return 1;
581bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	}
582bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
583bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	while ((dir = readdir(D)) != NULL) {
584bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		char full_path[PATH_MAX];
585bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		struct stat sb;
586bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
587e85b2b83e39b64ba5cb73fbfddbf3902b6e84925Jens Axboe		if (!strcmp(dir->d_name, ".") || !strcmp(dir->d_name, ".."))
588e85b2b83e39b64ba5cb73fbfddbf3902b6e84925Jens Axboe			continue;
58996d32d518a0743a6c050057bc1562e4883e51c5dJens Axboe
590bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		sprintf(full_path, "%s/%s", dirname, dir->d_name);
591bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
592bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		if (lstat(full_path, &sb) == -1) {
593bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			if (errno != ENOENT) {
594bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe				td_verror(td, errno, "stat");
595bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe				return 1;
596bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			}
597bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		}
598bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
599bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		if (S_ISREG(sb.st_mode)) {
600bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			add_file(td, full_path);
6012dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe			td->o.nr_files++;
602bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			continue;
603bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		}
6040ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		if (!S_ISDIR(sb.st_mode))
6050ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe			continue;
606bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
607bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		if ((ret = recurse_dir(td, full_path)) != 0)
608bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			break;
609bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	}
610bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
611bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	closedir(D);
612bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	return ret;
613bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe}
614bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
615bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboeint add_dir_files(struct thread_data *td, const char *path)
616bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe{
6170ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe	int ret = recurse_dir(td, path);
6180ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe
6190ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe	if (!ret)
6200ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		log_info("fio: opendir added %d files\n", td->o.nr_files);
6210ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe
6220ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe	return ret;
623bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe}
624cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe
625cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboevoid dup_files(struct thread_data *td, struct thread_data *org)
626cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe{
627cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	struct fio_file *f;
628cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	unsigned int i;
629cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	size_t bytes;
630cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe
631cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	if (!org->files)
632cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe		return;
633cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe
634cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	bytes = org->files_index * sizeof(*f);
635cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	td->files = malloc(bytes);
636cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	memcpy(td->files, org->files, bytes);
637cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe
638cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	for_each_file(td, f, i) {
639cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe		if (f->file_name)
640cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe			f->file_name = strdup(f->file_name);
641cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	}
642cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe}
643