filesetup.c revision 4241ea8fb0606f9bd5b7ed1278d3b7825883acf6
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
127172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboestatic int root_warn;
137172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe
147bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboestatic int extend_file(struct thread_data *td, struct fio_file *f)
1525205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe{
16ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe	int r, new_layout = 0, unlink_file = 0, flags;
1725205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe	unsigned long long left;
1825205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe	unsigned int bs;
1925205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe	char *b;
20b2a151925a91f38aeb298d693687a47269ad4e94Jens Axboe
214241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe	if (read_only) {
224241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe		log_err("fio: refusing extend of file due to read-only\n");
234241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe		return 0;
244241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe	}
254241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe
26507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	/*
27507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	 * check if we need to lay the file out complete again. fio
28507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	 * does that for operations involving reads, or for writes
29507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	 * where overwrite is set
30507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	 */
31507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	if (td_read(td) || (td_write(td) && td->o.overwrite))
32507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe		new_layout = 1;
33ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe	if (td_write(td) && !td->o.overwrite)
34ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe		unlink_file = 1;
35507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe
36ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe	if ((unlink_file || new_layout) && (f->flags & FIO_FILE_EXISTS)) {
377bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		if (unlink(f->file_name) < 0) {
387bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			td_verror(td, errno, "unlink");
397bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			return 1;
407bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		}
417bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
427bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
43507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	flags = O_WRONLY | O_CREAT;
44507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	if (new_layout)
45507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe		flags |= O_TRUNC;
46507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe
47507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	f->fd = open(f->file_name, flags, 0644);
4853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (f->fd < 0) {
49e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, errno, "open");
5053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return 1;
5153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
5253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
537bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (ftruncate(f->fd, f->real_file_size) == -1) {
54e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, errno, "ftruncate");
5553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		goto err;
5653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
5753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
58e8be2ad711db813537a1f2a6a6939c42909ba5ccJens Axboe	if (!new_layout)
59e8be2ad711db813537a1f2a6a6939c42909ba5ccJens Axboe		goto done;
60e8be2ad711db813537a1f2a6a6939c42909ba5ccJens Axboe
617bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (posix_fallocate(f->fd, 0, f->real_file_size) < 0) {
62e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, errno, "posix_fallocate");
6340f8298cd252157fa15d93f8eb470116a94069a0Jens Axboe		goto err;
6440f8298cd252157fa15d93f8eb470116a94069a0Jens Axboe	}
6540f8298cd252157fa15d93f8eb470116a94069a0Jens Axboe
662dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	b = malloc(td->o.max_bs[DDIR_WRITE]);
672dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	memset(b, 0, td->o.max_bs[DDIR_WRITE]);
6853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
697bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	left = f->real_file_size;
7053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	while (left && !td->terminate) {
712dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe		bs = td->o.max_bs[DDIR_WRITE];
7253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		if (bs > left)
7353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			bs = left;
7453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
7553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		r = write(f->fd, b, bs);
7653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
7753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		if (r == (int) bs) {
7853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			left -= bs;
7953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			continue;
8053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		} else {
8153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			if (r < 0)
82e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe				td_verror(td, errno, "write");
8353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			else
84e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe				td_verror(td, EIO, "write");
8553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
8653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			break;
8753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		}
8853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
8953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
9053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (td->terminate)
9153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		unlink(f->file_name);
922dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	else if (td->o.create_fsync)
9353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		fsync(f->fd);
9453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
9553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	free(b);
96507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboedone:
9753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	close(f->fd);
9853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	f->fd = -1;
9953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
10053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboeerr:
10153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	close(f->fd);
10253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	f->fd = -1;
10353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 1;
10453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
10553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
1067bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboestatic unsigned long long get_rand_file_size(struct thread_data *td)
1079c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe{
1089c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe	unsigned long long ret;
1099c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe	long r;
1109c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe
1119c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe	r = os_random_long(&td->file_size_state);
112d11a531f38b9b612dfb3bd09c89d011dc786f81dljzhang,Yaxin Hu,Jianchao Tang	ret = td->o.file_size_low + (unsigned long long) ((double) (td->o.file_size_high - td->o.file_size_low) * (r / (RAND_MAX + 1.0)));
1132dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	ret -= (ret % td->o.rw_min_bs);
1149c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe	return ret;
1159c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe}
1169c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe
11753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int file_size(struct thread_data *td, struct fio_file *f)
11853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
11953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	struct stat st;
12053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
1217bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (fstat(f->fd, &st) == -1) {
1227bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		td_verror(td, errno, "fstat");
1237bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		return 1;
1247bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
12553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
1267bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	f->real_file_size = st.st_size;
12753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
12853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
12953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
13053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int bdev_size(struct thread_data *td, struct fio_file *f)
13153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
13253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	unsigned long long bytes;
13353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	int r;
13453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
13553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	r = blockdev_size(f->fd, &bytes);
13653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (r) {
137e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, r, "blockdev_size");
13853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return 1;
13953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
14053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
14153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	f->real_file_size = bytes;
14253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
14353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
14453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
14553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int get_file_size(struct thread_data *td, struct fio_file *f)
14653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
14753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	int ret = 0;
14853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
149409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe	if (f->flags & FIO_SIZE_KNOWN)
150409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe		return 0;
151409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe
1527bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (f->filetype == FIO_TYPE_FILE)
1537bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		ret = file_size(td, f);
1547bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	else if (f->filetype == FIO_TYPE_BD)
15553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		ret = bdev_size(td, f);
15653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	else
15753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		f->real_file_size = -1;
15853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
15953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (ret)
16053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return ret;
16153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
16253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (f->file_offset > f->real_file_size) {
1632dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe		log_err("%s: offset extends end (%Lu > %Lu)\n", td->o.name, f->file_offset, f->real_file_size);
16453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return 1;
16553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
16653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
167409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe	f->flags |= FIO_SIZE_KNOWN;
16853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
16953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
17053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
171e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboeint file_invalidate_cache(struct thread_data *td, struct fio_file *f)
172e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe{
173e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	int ret = 0;
174e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
1752dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	if (td->o.odirect)
176b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe		return 0;
177b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe
178e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	/*
179e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	 * FIXME: add blockdev flushing too
180e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	 */
181b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe	if (f->mmap)
1827bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		ret = madvise(f->mmap, f->io_size, MADV_DONTNEED);
183467d1b6b3ebbfcb7cc0545a882ba8a93ea66752bJens Axboe	else if (f->filetype == FIO_TYPE_FILE)
1847bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		ret = fadvise(f->fd, f->file_offset, f->io_size, POSIX_FADV_DONTNEED);
1857e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe	else if (f->filetype == FIO_TYPE_BD) {
186b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe		ret = blockdev_invalidate_cache(f->fd);
1877e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe		if (ret < 0 && errno == EACCES && geteuid()) {
1887172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe			if (!root_warn) {
1897172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe				log_err("fio: only root may flush block devices. Cache flush bypassed!\n");
1907172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe				root_warn = 1;
1917172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe			}
1927e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe			ret = 0;
1937e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe		}
194b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe	} else if (f->filetype == FIO_TYPE_CHAR || f->filetype == FIO_TYPE_PIPE)
195e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe		ret = 0;
196e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
197e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	if (ret < 0) {
198e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, errno, "invalidate_cache");
199e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe		return 1;
200e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	}
201e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
202ad2da605a62faf16887970618b434db19594e17bJens Axboe	return ret;
203e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe}
204e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
205b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboevoid generic_close_file(struct thread_data fio_unused *td, struct fio_file *f)
20653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
207b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe	close(f->fd);
208b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe	f->fd = -1;
20953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
21053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
211b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboeint generic_open_file(struct thread_data *td, struct fio_file *f)
21253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
213661598287ecc3b8987f312cf8403936552ce686aJens Axboe	int is_std = 0;
21453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	int flags = 0;
21553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
216661598287ecc3b8987f312cf8403936552ce686aJens Axboe	if (!strcmp(f->file_name, "-")) {
217661598287ecc3b8987f312cf8403936552ce686aJens Axboe		if (td_rw(td)) {
218661598287ecc3b8987f312cf8403936552ce686aJens Axboe			log_err("fio: can't read/write to stdin/out\n");
219661598287ecc3b8987f312cf8403936552ce686aJens Axboe			return 1;
220661598287ecc3b8987f312cf8403936552ce686aJens Axboe		}
221661598287ecc3b8987f312cf8403936552ce686aJens Axboe		is_std = 1;
222ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe
223ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe		/*
224ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe		 * move output logging to stderr, if we are writing to stdout
225ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe		 */
226ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe		if (td_write(td))
227ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe			f_out = stderr;
228661598287ecc3b8987f312cf8403936552ce686aJens Axboe	}
229661598287ecc3b8987f312cf8403936552ce686aJens Axboe
2302dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	if (td->o.odirect)
2312fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe		flags |= OS_O_DIRECT;
2322dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	if (td->o.sync_io)
2332fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe		flags |= O_SYNC;
23453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
235660a1cb5fb9843ec09a04337714e78d63cd557e7Jens Axboe	if (td_write(td)) {
2364241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe		assert(!read_only);
2374241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe
2382fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe		flags |= O_RDWR;
23953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
240af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe		if (f->filetype == FIO_TYPE_FILE)
2412fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe			flags |= O_CREAT;
2422fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe
243661598287ecc3b8987f312cf8403936552ce686aJens Axboe		if (is_std)
244661598287ecc3b8987f312cf8403936552ce686aJens Axboe			f->fd = dup(STDOUT_FILENO);
245661598287ecc3b8987f312cf8403936552ce686aJens Axboe		else
246661598287ecc3b8987f312cf8403936552ce686aJens Axboe			f->fd = open(f->file_name, flags, 0600);
2472fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe	} else {
2484241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe		if (f->filetype == FIO_TYPE_CHAR && !read_only)
2492fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe			flags |= O_RDWR;
2502fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe		else
2512fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe			flags |= O_RDONLY;
2522fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe
253661598287ecc3b8987f312cf8403936552ce686aJens Axboe		if (is_std)
254661598287ecc3b8987f312cf8403936552ce686aJens Axboe			f->fd = dup(STDIN_FILENO);
255661598287ecc3b8987f312cf8403936552ce686aJens Axboe		else
256661598287ecc3b8987f312cf8403936552ce686aJens Axboe			f->fd = open(f->file_name, flags);
25753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
25853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
25953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (f->fd == -1) {
260e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe		char buf[FIO_VERROR_SIZE];
261e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		int __e = errno;
262e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe
263e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe		snprintf(buf, sizeof(buf) - 1, "open(%s)", f->file_name);
264e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe
265e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe		td_verror(td, __e, buf);
26653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
26753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
268b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe	if (get_file_size(td, f))
269b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe		goto err;
270b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe
27153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
272b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboeerr:
273b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe	close(f->fd);
274b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe	return 1;
275b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe}
276b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe
27721972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboeint open_files(struct thread_data *td)
27821972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe{
27921972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe	struct fio_file *f;
280af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	unsigned int i;
281af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	int err = 0;
28221972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe
28321972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe	for_each_file(td, f, i) {
284b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe		err = td_io_open_file(td, f);
2859bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe		if (err) {
2869bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe			if (td->error == EMFILE) {
2879bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe				log_err("fio: limited open files to: %d\n", td->nr_open_files);
2889bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe				td->o.open_files = td->nr_open_files;
2899bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe				err = 0;
2909bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe				clear_error(td);
2919bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe			}
29221972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe			break;
2939bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe		}
294b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe
2952dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe		if (td->o.open_files == td->nr_open_files)
296b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe			break;
29721972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe	}
29821972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe
2997abf833d25ab6cc866308fe37483dfe2fde28efcJens Axboe	if (!err)
3007abf833d25ab6cc866308fe37483dfe2fde28efcJens Axboe		return 0;
3017abf833d25ab6cc866308fe37483dfe2fde28efcJens Axboe
302bdb4e2e99d4a87e5d3677cc09aa1ce92135125a9Jens Axboe	for_each_file(td, f, i)
303b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe		td_io_close_file(td, f);
3047abf833d25ab6cc866308fe37483dfe2fde28efcJens Axboe
30521972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe	return err;
30621972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe}
30721972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe
3087bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe/*
3097bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * open/close all files, so that ->real_file_size gets set
3107bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */
311bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboestatic int get_file_sizes(struct thread_data *td)
3127bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe{
3137bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	struct fio_file *f;
3147bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	unsigned int i;
315bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe	int err = 0;
3167bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
3177bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	for_each_file(td, f, i) {
318bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe		if (td->io_ops->open_file(td, f)) {
31940b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe			if (td->error != ENOENT) {
32040b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe				log_err("%s\n", td->verror);
32140b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe				err = 1;
32240b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe			}
323541d66d70b8fbe9860b31307c0760e6d5f4c78a8Jens Axboe			clear_error(td);
32407eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe		} else {
32507eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe			if (td->io_ops->close_file)
32607eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe				td->io_ops->close_file(td, f);
32707eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe		}
328409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe
329409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe		if (f->real_file_size == -1ULL && td->o.size)
330409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe			f->real_file_size = td->o.size / td->o.nr_files;
3317bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
332bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe
333bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe	return err;
3347bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe}
3357bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
3367bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe/*
3377bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * Open the files and setup files sizes, creating files if necessary.
3387bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */
33953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboeint setup_files(struct thread_data *td)
34053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
3417bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	unsigned long long total_size, extend_size;
34253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	struct fio_file *f;
343af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	unsigned int i;
344000b080395e45cbe0ce54e75f0e993addbdc8676Jens Axboe	int err = 0, need_extend;
34553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
34653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	/*
34753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	 * if ioengine defines a setup() method, it's responsible for
3487bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * opening the files and setting f->real_file_size to indicate
3497bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * the valid range for that file.
35053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	 */
35153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (td->io_ops->setup)
3527bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		err = td->io_ops->setup(td);
3537bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	else
354bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe		err = get_file_sizes(td);
35553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
356f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe	if (err)
357f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe		return err;
358f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe
3590a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe	/*
3607bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * check sizes. if the files/devices do not exist and the size
3617bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * isn't passed to fio, abort.
3620a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe	 */
3637bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	total_size = 0;
3647bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	for_each_file(td, f, i) {
3657bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		if (f->real_file_size == -1ULL)
3667bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			total_size = -1ULL;
3677bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		else
3687bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			total_size += f->real_file_size;
3697bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
3700a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe
3717bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	/*
3727bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * device/file sizes are zero and no size given, punt
3737bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 */
374409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe	if ((!total_size || total_size == -1ULL) && !td->o.size) {
3757bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		log_err("%s: you need to specify size=\n", td->o.name);
376e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, EINVAL, "total_file_size");
37753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return 1;
37853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
37953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
3807bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	/*
3817bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * now file sizes are known, so we can set ->io_size. if size= is
3827bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * not given, ->io_size is just equal to ->real_file_size. if size
3837bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * is given, ->io_size is size / nr_files.
3847bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 */
3857bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	extend_size = total_size = 0;
3867bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	need_extend = 0;
3877bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	for_each_file(td, f, i) {
388bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang		f->file_offset = td->o.start_offset;
389bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang
3907bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		if (!td->o.file_size_low) {
3917bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			/*
3927bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * no file size range given, file size is equal to
3937bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * total size divided by number of files. if that is
3947bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * zero, set it to the real file size.
3957bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 */
3967bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			f->io_size = td->o.size / td->o.nr_files;
397bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang			if (!f->io_size) {
398bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang				if (f->file_offset > f->real_file_size)
399bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang					goto err_offset;
400bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang				f->io_size = f->real_file_size - f->file_offset;
401bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang			}
4027bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		} else if (f->real_file_size < td->o.file_size_low ||
4037bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			   f->real_file_size > td->o.file_size_high) {
404bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang			if (f->file_offset > td->o.file_size_low)
405bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang				goto err_offset;
4067bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			/*
4077bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * file size given. if it's fixed, use that. if it's a
4087bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * range, generate a random size in-between.
4097bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 */
4107bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			if (td->o.file_size_low == td->o.file_size_high)
411bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang				f->io_size = td->o.file_size_low - f->file_offset;
4127bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			else
413bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang				f->io_size = get_rand_file_size(td) - f->file_offset;
414bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang		} else if (f->file_offset > f->real_file_size)
415bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang			goto err_offset;
416bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang		else
417bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang			f->io_size = f->real_file_size - f->file_offset;
41853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
4197bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		if (f->io_size == -1ULL)
4207bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			total_size = -1ULL;
4217bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		else
4227bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			total_size += f->io_size;
4237bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
4247bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		if (f->filetype == FIO_TYPE_FILE &&
425bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang		    (f->io_size + f->file_offset) > f->real_file_size &&
4267bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		    !(td->io_ops->flags & FIO_DISKLESSIO)) {
4277bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			need_extend++;
428bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang			extend_size += (f->io_size + f->file_offset);
4297bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			f->flags |= FIO_FILE_EXTEND;
430bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang		}
4317bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
43253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
4332298290eabbe1017421a6ba0f5de93d8c2b048adljzhang,Yaxin Hu,Jianchao Tang	if (!td->o.size || td->o.size > total_size)
4347bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		td->o.size = total_size;
43521972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe
4367bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	/*
4377bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * See if we need to extend some files
4387bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 */
4397bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (need_extend) {
4407bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		temp_stall_ts = 1;
441f627d8ae4dca9de8a72928a7928cf2903e81ad41Jens Axboe		log_info("%s: Laying out IO file(s) (%u file(s) / %LuMiB)\n",
4427bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			td->o.name, need_extend, extend_size >> 20);
4437bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
4447bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		for_each_file(td, f, i) {
4457bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			if (!(f->flags & FIO_FILE_EXTEND))
4467bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe				continue;
4477bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
448409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe			assert(f->filetype == FIO_TYPE_FILE);
4497bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			f->flags &= ~FIO_FILE_EXTEND;
450bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang			f->real_file_size = (f->io_size + f->file_offset);
4517bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			err = extend_file(td, f);
4527bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			if (err)
4537bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe				break;
4547bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		}
4557bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		temp_stall_ts = 0;
4567bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
4577bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
4587bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (err)
4597bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		return err;
4607bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
4617bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (!td->o.zone_size)
4627bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		td->o.zone_size = td->o.size;
4637bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
464ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe	/*
465ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe	 * iolog already set the total io size, if we read back
466ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe	 * stored entries.
467ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe	 */
468ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe	if (!td->o.read_iolog_file)
469ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe		td->total_io_size = td->o.size * td->o.loops;
4707bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	return 0;
471bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tangerr_offset:
472bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang	log_err("%s: you need to specify valid offset=\n", td->o.name);
473bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang	return 1;
47453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
47553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
476687270767de17dbad53c50e03e5d73d52505405cJens Axboeint init_random_map(struct thread_data *td)
477687270767de17dbad53c50e03e5d73d52505405cJens Axboe{
478687270767de17dbad53c50e03e5d73d52505405cJens Axboe	int num_maps, blocks;
479687270767de17dbad53c50e03e5d73d52505405cJens Axboe	struct fio_file *f;
480687270767de17dbad53c50e03e5d73d52505405cJens Axboe	unsigned int i;
481687270767de17dbad53c50e03e5d73d52505405cJens Axboe
482687270767de17dbad53c50e03e5d73d52505405cJens Axboe	if (td->o.norandommap)
483687270767de17dbad53c50e03e5d73d52505405cJens Axboe		return 0;
484687270767de17dbad53c50e03e5d73d52505405cJens Axboe
485687270767de17dbad53c50e03e5d73d52505405cJens Axboe	for_each_file(td, f, i) {
486687270767de17dbad53c50e03e5d73d52505405cJens Axboe		blocks = (f->real_file_size + td->o.rw_min_bs - 1) / td->o.rw_min_bs;
487687270767de17dbad53c50e03e5d73d52505405cJens Axboe		num_maps = (blocks + BLOCKS_PER_MAP-1)/ BLOCKS_PER_MAP;
488687270767de17dbad53c50e03e5d73d52505405cJens Axboe		f->file_map = malloc(num_maps * sizeof(long));
489687270767de17dbad53c50e03e5d73d52505405cJens Axboe		if (!f->file_map) {
490687270767de17dbad53c50e03e5d73d52505405cJens Axboe			log_err("fio: failed allocating random map. If running a large number of jobs, try the 'norandommap' option\n");
491687270767de17dbad53c50e03e5d73d52505405cJens Axboe			return 1;
492687270767de17dbad53c50e03e5d73d52505405cJens Axboe		}
493687270767de17dbad53c50e03e5d73d52505405cJens Axboe		f->num_maps = num_maps;
494687270767de17dbad53c50e03e5d73d52505405cJens Axboe		memset(f->file_map, 0, num_maps * sizeof(long));
495687270767de17dbad53c50e03e5d73d52505405cJens Axboe	}
496687270767de17dbad53c50e03e5d73d52505405cJens Axboe
497687270767de17dbad53c50e03e5d73d52505405cJens Axboe	return 0;
498687270767de17dbad53c50e03e5d73d52505405cJens Axboe}
499687270767de17dbad53c50e03e5d73d52505405cJens Axboe
50053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboevoid close_files(struct thread_data *td)
50153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
5020ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe	struct fio_file *f;
503af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	unsigned int i;
50453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
5050ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe	for_each_file(td, f, i) {
506a9b7b3052b35c20e82b8fc909cd546a5fe1ff293Jens Axboe		if (td->o.unlink && f->filetype == FIO_TYPE_FILE)
507132ad46d22bcf12da95ad69e03c1b6f23f5e60a9Jens Axboe			unlink(f->file_name);
508bdb4e2e99d4a87e5d3677cc09aa1ce92135125a9Jens Axboe
509b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe		td_io_close_file(td, f);
510b3dc7f075b85e004f8c681ebb8566475017696f3Jens Axboe
511fa1da8653e2177b3cc31a91e963c389f079d4172Jens Axboe		free(f->file_name);
512fa1da8653e2177b3cc31a91e963c389f079d4172Jens Axboe		f->file_name = NULL;
513fa1da8653e2177b3cc31a91e963c389f079d4172Jens Axboe
514c343981b9874179009a92e4d29eae95cf341843aJens Axboe		if (f->file_map) {
515b3dc7f075b85e004f8c681ebb8566475017696f3Jens Axboe			free(f->file_map);
516c343981b9874179009a92e4d29eae95cf341843aJens Axboe			f->file_map = NULL;
517c343981b9874179009a92e4d29eae95cf341843aJens Axboe		}
51853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
519b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe
5202dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	td->o.filename = NULL;
521cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	free(td->files);
522b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe	td->files = NULL;
5232dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	td->o.nr_files = 0;
52453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
525af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
526e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboestatic void get_file_type(struct fio_file *f)
527af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe{
528af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	struct stat sb;
529af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
530661598287ecc3b8987f312cf8403936552ce686aJens Axboe	if (!strcmp(f->file_name, "-"))
531661598287ecc3b8987f312cf8403936552ce686aJens Axboe		f->filetype = FIO_TYPE_PIPE;
532661598287ecc3b8987f312cf8403936552ce686aJens Axboe	else
533661598287ecc3b8987f312cf8403936552ce686aJens Axboe		f->filetype = FIO_TYPE_FILE;
534af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
535e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboe	if (!lstat(f->file_name, &sb)) {
536af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe		if (S_ISBLK(sb.st_mode))
537af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe			f->filetype = FIO_TYPE_BD;
538af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe		else if (S_ISCHR(sb.st_mode))
539af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe			f->filetype = FIO_TYPE_CHAR;
540b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe		else if (S_ISFIFO(sb.st_mode))
541b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe			f->filetype = FIO_TYPE_PIPE;
542af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	}
543af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe}
544af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
545f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboeint add_file(struct thread_data *td, const char *fname)
546af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe{
5477b4e4fe5e6fa26f82f9169c18ec70c08d0805ca9Jens Axboe	int cur_files = td->files_index;
548bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe	char file_name[PATH_MAX];
549af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	struct fio_file *f;
550bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe	int len = 0;
551af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
552af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	td->files = realloc(td->files, (cur_files + 1) * sizeof(*f));
553af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
554af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	f = &td->files[cur_files];
555af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	memset(f, 0, sizeof(*f));
556af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	f->fd = -1;
557bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe
55807eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe	/*
55907eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe	 * init function, io engine may not be loaded yet
56007eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe	 */
56107eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe	if (td->io_ops && (td->io_ops->flags & FIO_DISKLESSIO))
56207eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe		f->real_file_size = -1ULL;
56307eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe
564bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe	if (td->o.directory)
565bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe		len = sprintf(file_name, "%s/", td->o.directory);
566bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe
567bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe	sprintf(file_name + len, "%s", fname);
568bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe	f->file_name = strdup(file_name);
569af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
570e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboe	get_file_type(f);
571af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
5727b4e4fe5e6fa26f82f9169c18ec70c08d0805ca9Jens Axboe	td->files_index++;
5731549441cdfecb2c1a4a8b8d494253859d67b4344Jens Axboe	if (f->filetype == FIO_TYPE_FILE)
5741549441cdfecb2c1a4a8b8d494253859d67b4344Jens Axboe		td->nr_normal_files++;
575f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
576f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	return cur_files;
577af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe}
5780ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe
5790ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboevoid get_file(struct fio_file *f)
5800ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe{
58197af62cec418cd722fb43c6010d6430534e12353Jens Axboe	assert(f->flags & FIO_FILE_OPEN);
5820ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	f->references++;
5830ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe}
5840ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe
5850ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboevoid put_file(struct thread_data *td, struct fio_file *f)
5860ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe{
5870ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	if (!(f->flags & FIO_FILE_OPEN))
5880ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe		return;
5890ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe
5900ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	assert(f->references);
5910ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	if (--f->references)
5920ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe		return;
5930ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe
594d424d4dd657eaf4aeb8ffb07a550a5f64940f41aJens Axboe	if (should_fsync(td) && td->o.fsync_on_close)
595ebb1415f729c123b8a13bcbd667bf4b4cc95b4d4Jens Axboe		fsync(f->fd);
596ebb1415f729c123b8a13bcbd667bf4b4cc95b4d4Jens Axboe
5970ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	if (td->io_ops->close_file)
5980ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe		td->io_ops->close_file(td, f);
5991020a139beff50faf1bb18f761b024b664a09e14Jens Axboe
6000ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	td->nr_open_files--;
6010ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	f->flags &= ~FIO_FILE_OPEN;
6020ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe}
603bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
604bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboestatic int recurse_dir(struct thread_data *td, const char *dirname)
605bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe{
606bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	struct dirent *dir;
607bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	int ret = 0;
608bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	DIR *D;
609bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
610bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	D = opendir(dirname);
611bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	if (!D) {
6120ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		char buf[FIO_VERROR_SIZE];
6130ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe
6140ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		snprintf(buf, FIO_VERROR_SIZE - 1, "opendir(%s)", dirname);
6150ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		td_verror(td, errno, buf);
616bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		return 1;
617bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	}
618bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
619bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	while ((dir = readdir(D)) != NULL) {
620bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		char full_path[PATH_MAX];
621bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		struct stat sb;
622bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
623e85b2b83e39b64ba5cb73fbfddbf3902b6e84925Jens Axboe		if (!strcmp(dir->d_name, ".") || !strcmp(dir->d_name, ".."))
624e85b2b83e39b64ba5cb73fbfddbf3902b6e84925Jens Axboe			continue;
62596d32d518a0743a6c050057bc1562e4883e51c5dJens Axboe
626bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		sprintf(full_path, "%s/%s", dirname, dir->d_name);
627bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
628bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		if (lstat(full_path, &sb) == -1) {
629bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			if (errno != ENOENT) {
630bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe				td_verror(td, errno, "stat");
631bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe				return 1;
632bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			}
633bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		}
634bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
635bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		if (S_ISREG(sb.st_mode)) {
636bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			add_file(td, full_path);
6372dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe			td->o.nr_files++;
638bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			continue;
639bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		}
6400ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		if (!S_ISDIR(sb.st_mode))
6410ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe			continue;
642bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
643bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		if ((ret = recurse_dir(td, full_path)) != 0)
644bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			break;
645bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	}
646bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
647bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	closedir(D);
648bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	return ret;
649bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe}
650bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
651bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboeint add_dir_files(struct thread_data *td, const char *path)
652bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe{
6530ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe	int ret = recurse_dir(td, path);
6540ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe
6550ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe	if (!ret)
6560ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		log_info("fio: opendir added %d files\n", td->o.nr_files);
6570ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe
6580ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe	return ret;
659bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe}
660cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe
661cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboevoid dup_files(struct thread_data *td, struct thread_data *org)
662cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe{
663cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	struct fio_file *f;
664cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	unsigned int i;
665cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	size_t bytes;
666cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe
667cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	if (!org->files)
668cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe		return;
669cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe
670cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	bytes = org->files_index * sizeof(*f);
671cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	td->files = malloc(bytes);
672cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	memcpy(td->files, org->files, bytes);
673cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe
674cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	for_each_file(td, f, i) {
675cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe		if (f->file_name)
676cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe			f->file_name = strdup(f->file_name);
677cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	}
678cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe}
679f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
680f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe/*
681f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe * Returns the index that matches the filename, or -1 if not there
682f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe */
683f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboeint get_fileno(struct thread_data *td, const char *fname)
684f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe{
685f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	struct fio_file *f;
686f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	unsigned int i;
687f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
688f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	for_each_file(td, f, i)
689f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe		if (!strcmp(f->file_name, fname))
690f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe			return i;
691f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
692f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	return -1;
693f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe}
694f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
695f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe/*
696f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe * For log usage, where we add/open/close files automatically
697f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe */
698f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboevoid free_release_files(struct thread_data *td)
699f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe{
700f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	close_files(td);
701f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	td->files_index = 0;
702f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	td->nr_normal_files = 0;
703f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe}
704