filesetup.c revision ad92396cc21055cee93470dcf65e82ccde03aac5
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;
234ad92396cc21055cee93470dcf65e82ccde03aac5Jens Axboe	if (f->filetype != FIO_TYPE_FILE)
235ad92396cc21055cee93470dcf65e82ccde03aac5Jens Axboe		flags |= O_NOATIME;
23653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
237660a1cb5fb9843ec09a04337714e78d63cd557e7Jens Axboe	if (td_write(td)) {
2384241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe		assert(!read_only);
2394241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe
2402fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe		flags |= O_RDWR;
24153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
242af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe		if (f->filetype == FIO_TYPE_FILE)
2432fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe			flags |= O_CREAT;
2442fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe
245661598287ecc3b8987f312cf8403936552ce686aJens Axboe		if (is_std)
246661598287ecc3b8987f312cf8403936552ce686aJens Axboe			f->fd = dup(STDOUT_FILENO);
247661598287ecc3b8987f312cf8403936552ce686aJens Axboe		else
248661598287ecc3b8987f312cf8403936552ce686aJens Axboe			f->fd = open(f->file_name, flags, 0600);
2492fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe	} else {
2504241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe		if (f->filetype == FIO_TYPE_CHAR && !read_only)
2512fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe			flags |= O_RDWR;
2522fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe		else
2532fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe			flags |= O_RDONLY;
2542fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe
255661598287ecc3b8987f312cf8403936552ce686aJens Axboe		if (is_std)
256661598287ecc3b8987f312cf8403936552ce686aJens Axboe			f->fd = dup(STDIN_FILENO);
257661598287ecc3b8987f312cf8403936552ce686aJens Axboe		else
258661598287ecc3b8987f312cf8403936552ce686aJens Axboe			f->fd = open(f->file_name, flags);
25953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
26053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
26153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (f->fd == -1) {
262e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe		char buf[FIO_VERROR_SIZE];
263e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		int __e = errno;
264e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe
265e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe		snprintf(buf, sizeof(buf) - 1, "open(%s)", f->file_name);
266e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe
267e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe		td_verror(td, __e, buf);
26853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
26953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
270b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe	if (get_file_size(td, f))
271b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe		goto err;
272b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe
27353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
274b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboeerr:
275b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe	close(f->fd);
276b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe	return 1;
277b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe}
278b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe
27921972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboeint open_files(struct thread_data *td)
28021972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe{
28121972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe	struct fio_file *f;
282af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	unsigned int i;
283af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	int err = 0;
28421972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe
28521972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe	for_each_file(td, f, i) {
286b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe		err = td_io_open_file(td, f);
2879bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe		if (err) {
2889bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe			if (td->error == EMFILE) {
2899bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe				log_err("fio: limited open files to: %d\n", td->nr_open_files);
2909bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe				td->o.open_files = td->nr_open_files;
2919bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe				err = 0;
2929bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe				clear_error(td);
2939bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe			}
29421972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe			break;
2959bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe		}
296b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe
2972dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe		if (td->o.open_files == td->nr_open_files)
298b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe			break;
29921972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe	}
30021972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe
3017abf833d25ab6cc866308fe37483dfe2fde28efcJens Axboe	if (!err)
3027abf833d25ab6cc866308fe37483dfe2fde28efcJens Axboe		return 0;
3037abf833d25ab6cc866308fe37483dfe2fde28efcJens Axboe
304bdb4e2e99d4a87e5d3677cc09aa1ce92135125a9Jens Axboe	for_each_file(td, f, i)
305b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe		td_io_close_file(td, f);
3067abf833d25ab6cc866308fe37483dfe2fde28efcJens Axboe
30721972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe	return err;
30821972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe}
30921972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe
3107bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe/*
3117bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * open/close all files, so that ->real_file_size gets set
3127bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */
313bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboestatic int get_file_sizes(struct thread_data *td)
3147bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe{
3157bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	struct fio_file *f;
3167bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	unsigned int i;
317bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe	int err = 0;
3187bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
3197bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	for_each_file(td, f, i) {
320bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe		if (td->io_ops->open_file(td, f)) {
32140b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe			if (td->error != ENOENT) {
32240b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe				log_err("%s\n", td->verror);
32340b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe				err = 1;
32440b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe			}
325541d66d70b8fbe9860b31307c0760e6d5f4c78a8Jens Axboe			clear_error(td);
32607eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe		} else {
32707eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe			if (td->io_ops->close_file)
32807eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe				td->io_ops->close_file(td, f);
32907eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe		}
330409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe
331409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe		if (f->real_file_size == -1ULL && td->o.size)
332409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe			f->real_file_size = td->o.size / td->o.nr_files;
3337bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
334bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe
335bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe	return err;
3367bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe}
3377bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
3387bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe/*
3397bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * Open the files and setup files sizes, creating files if necessary.
3407bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */
34153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboeint setup_files(struct thread_data *td)
34253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
3437bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	unsigned long long total_size, extend_size;
34453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	struct fio_file *f;
345af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	unsigned int i;
346000b080395e45cbe0ce54e75f0e993addbdc8676Jens Axboe	int err = 0, need_extend;
34753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
34853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	/*
34953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	 * if ioengine defines a setup() method, it's responsible for
3507bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * opening the files and setting f->real_file_size to indicate
3517bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * the valid range for that file.
35253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	 */
35353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (td->io_ops->setup)
3547bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		err = td->io_ops->setup(td);
3557bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	else
356bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe		err = get_file_sizes(td);
35753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
358f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe	if (err)
359f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe		return err;
360f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe
3610a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe	/*
3627bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * check sizes. if the files/devices do not exist and the size
3637bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * isn't passed to fio, abort.
3640a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe	 */
3657bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	total_size = 0;
3667bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	for_each_file(td, f, i) {
3677bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		if (f->real_file_size == -1ULL)
3687bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			total_size = -1ULL;
3697bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		else
3707bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			total_size += f->real_file_size;
3717bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
3720a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe
3737bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	/*
3747bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * device/file sizes are zero and no size given, punt
3757bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 */
376409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe	if ((!total_size || total_size == -1ULL) && !td->o.size) {
3777bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		log_err("%s: you need to specify size=\n", td->o.name);
378e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, EINVAL, "total_file_size");
37953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return 1;
38053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
38153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
3827bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	/*
3837bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * now file sizes are known, so we can set ->io_size. if size= is
3847bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * not given, ->io_size is just equal to ->real_file_size. if size
3857bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * is given, ->io_size is size / nr_files.
3867bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 */
3877bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	extend_size = total_size = 0;
3887bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	need_extend = 0;
3897bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	for_each_file(td, f, i) {
390bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang		f->file_offset = td->o.start_offset;
391bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang
3927bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		if (!td->o.file_size_low) {
3937bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			/*
3947bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * no file size range given, file size is equal to
3957bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * total size divided by number of files. if that is
3967bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * zero, set it to the real file size.
3977bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 */
3987bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			f->io_size = td->o.size / td->o.nr_files;
399bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang			if (!f->io_size) {
400bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang				if (f->file_offset > f->real_file_size)
401bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang					goto err_offset;
402bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang				f->io_size = f->real_file_size - f->file_offset;
403bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang			}
4047bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		} else if (f->real_file_size < td->o.file_size_low ||
4057bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			   f->real_file_size > td->o.file_size_high) {
406bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang			if (f->file_offset > td->o.file_size_low)
407bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang				goto err_offset;
4087bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			/*
4097bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * file size given. if it's fixed, use that. if it's a
4107bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * range, generate a random size in-between.
4117bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 */
4127bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			if (td->o.file_size_low == td->o.file_size_high)
413bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang				f->io_size = td->o.file_size_low - f->file_offset;
4147bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			else
415bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang				f->io_size = get_rand_file_size(td) - f->file_offset;
416bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang		} else if (f->file_offset > f->real_file_size)
417bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang			goto err_offset;
418bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang		else
419bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang			f->io_size = f->real_file_size - f->file_offset;
42053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
4217bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		if (f->io_size == -1ULL)
4227bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			total_size = -1ULL;
4237bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		else
4247bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			total_size += f->io_size;
4257bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
4267bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		if (f->filetype == FIO_TYPE_FILE &&
427bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang		    (f->io_size + f->file_offset) > f->real_file_size &&
4287bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		    !(td->io_ops->flags & FIO_DISKLESSIO)) {
4297bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			need_extend++;
430bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang			extend_size += (f->io_size + f->file_offset);
4317bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			f->flags |= FIO_FILE_EXTEND;
432bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang		}
4337bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
43453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
4352298290eabbe1017421a6ba0f5de93d8c2b048adljzhang,Yaxin Hu,Jianchao Tang	if (!td->o.size || td->o.size > total_size)
4367bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		td->o.size = total_size;
43721972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe
4387bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	/*
4397bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * See if we need to extend some files
4407bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 */
4417bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (need_extend) {
4427bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		temp_stall_ts = 1;
443f627d8ae4dca9de8a72928a7928cf2903e81ad41Jens Axboe		log_info("%s: Laying out IO file(s) (%u file(s) / %LuMiB)\n",
4447bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			td->o.name, need_extend, extend_size >> 20);
4457bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
4467bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		for_each_file(td, f, i) {
4477bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			if (!(f->flags & FIO_FILE_EXTEND))
4487bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe				continue;
4497bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
450409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe			assert(f->filetype == FIO_TYPE_FILE);
4517bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			f->flags &= ~FIO_FILE_EXTEND;
452bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang			f->real_file_size = (f->io_size + f->file_offset);
4537bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			err = extend_file(td, f);
4547bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			if (err)
4557bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe				break;
4567bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		}
4577bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		temp_stall_ts = 0;
4587bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
4597bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
4607bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (err)
4617bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		return err;
4627bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
4637bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (!td->o.zone_size)
4647bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		td->o.zone_size = td->o.size;
4657bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
466ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe	/*
467ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe	 * iolog already set the total io size, if we read back
468ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe	 * stored entries.
469ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe	 */
470ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe	if (!td->o.read_iolog_file)
471ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe		td->total_io_size = td->o.size * td->o.loops;
4727bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	return 0;
473bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tangerr_offset:
474bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang	log_err("%s: you need to specify valid offset=\n", td->o.name);
475bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang	return 1;
47653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
47753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
478687270767de17dbad53c50e03e5d73d52505405cJens Axboeint init_random_map(struct thread_data *td)
479687270767de17dbad53c50e03e5d73d52505405cJens Axboe{
480687270767de17dbad53c50e03e5d73d52505405cJens Axboe	int num_maps, blocks;
481687270767de17dbad53c50e03e5d73d52505405cJens Axboe	struct fio_file *f;
482687270767de17dbad53c50e03e5d73d52505405cJens Axboe	unsigned int i;
483687270767de17dbad53c50e03e5d73d52505405cJens Axboe
484687270767de17dbad53c50e03e5d73d52505405cJens Axboe	if (td->o.norandommap)
485687270767de17dbad53c50e03e5d73d52505405cJens Axboe		return 0;
486687270767de17dbad53c50e03e5d73d52505405cJens Axboe
487687270767de17dbad53c50e03e5d73d52505405cJens Axboe	for_each_file(td, f, i) {
488687270767de17dbad53c50e03e5d73d52505405cJens Axboe		blocks = (f->real_file_size + td->o.rw_min_bs - 1) / td->o.rw_min_bs;
489687270767de17dbad53c50e03e5d73d52505405cJens Axboe		num_maps = (blocks + BLOCKS_PER_MAP-1)/ BLOCKS_PER_MAP;
490687270767de17dbad53c50e03e5d73d52505405cJens Axboe		f->file_map = malloc(num_maps * sizeof(long));
491687270767de17dbad53c50e03e5d73d52505405cJens Axboe		if (!f->file_map) {
492687270767de17dbad53c50e03e5d73d52505405cJens Axboe			log_err("fio: failed allocating random map. If running a large number of jobs, try the 'norandommap' option\n");
493687270767de17dbad53c50e03e5d73d52505405cJens Axboe			return 1;
494687270767de17dbad53c50e03e5d73d52505405cJens Axboe		}
495687270767de17dbad53c50e03e5d73d52505405cJens Axboe		f->num_maps = num_maps;
496687270767de17dbad53c50e03e5d73d52505405cJens Axboe		memset(f->file_map, 0, num_maps * sizeof(long));
497687270767de17dbad53c50e03e5d73d52505405cJens Axboe	}
498687270767de17dbad53c50e03e5d73d52505405cJens Axboe
499687270767de17dbad53c50e03e5d73d52505405cJens Axboe	return 0;
500687270767de17dbad53c50e03e5d73d52505405cJens Axboe}
501687270767de17dbad53c50e03e5d73d52505405cJens Axboe
50253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboevoid close_files(struct thread_data *td)
50353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
5040ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe	struct fio_file *f;
505af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	unsigned int i;
50653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
5070ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe	for_each_file(td, f, i) {
508a9b7b3052b35c20e82b8fc909cd546a5fe1ff293Jens Axboe		if (td->o.unlink && f->filetype == FIO_TYPE_FILE)
509132ad46d22bcf12da95ad69e03c1b6f23f5e60a9Jens Axboe			unlink(f->file_name);
510bdb4e2e99d4a87e5d3677cc09aa1ce92135125a9Jens Axboe
511b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe		td_io_close_file(td, f);
512b3dc7f075b85e004f8c681ebb8566475017696f3Jens Axboe
513fa1da8653e2177b3cc31a91e963c389f079d4172Jens Axboe		free(f->file_name);
514fa1da8653e2177b3cc31a91e963c389f079d4172Jens Axboe		f->file_name = NULL;
515fa1da8653e2177b3cc31a91e963c389f079d4172Jens Axboe
516c343981b9874179009a92e4d29eae95cf341843aJens Axboe		if (f->file_map) {
517b3dc7f075b85e004f8c681ebb8566475017696f3Jens Axboe			free(f->file_map);
518c343981b9874179009a92e4d29eae95cf341843aJens Axboe			f->file_map = NULL;
519c343981b9874179009a92e4d29eae95cf341843aJens Axboe		}
52053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
521b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe
5222dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	td->o.filename = NULL;
523cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	free(td->files);
524b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe	td->files = NULL;
5252dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	td->o.nr_files = 0;
52653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
527af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
528e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboestatic void get_file_type(struct fio_file *f)
529af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe{
530af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	struct stat sb;
531af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
532661598287ecc3b8987f312cf8403936552ce686aJens Axboe	if (!strcmp(f->file_name, "-"))
533661598287ecc3b8987f312cf8403936552ce686aJens Axboe		f->filetype = FIO_TYPE_PIPE;
534661598287ecc3b8987f312cf8403936552ce686aJens Axboe	else
535661598287ecc3b8987f312cf8403936552ce686aJens Axboe		f->filetype = FIO_TYPE_FILE;
536af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
537e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboe	if (!lstat(f->file_name, &sb)) {
538af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe		if (S_ISBLK(sb.st_mode))
539af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe			f->filetype = FIO_TYPE_BD;
540af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe		else if (S_ISCHR(sb.st_mode))
541af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe			f->filetype = FIO_TYPE_CHAR;
542b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe		else if (S_ISFIFO(sb.st_mode))
543b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe			f->filetype = FIO_TYPE_PIPE;
544af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	}
545af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe}
546af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
547f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboeint add_file(struct thread_data *td, const char *fname)
548af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe{
5497b4e4fe5e6fa26f82f9169c18ec70c08d0805ca9Jens Axboe	int cur_files = td->files_index;
550bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe	char file_name[PATH_MAX];
551af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	struct fio_file *f;
552bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe	int len = 0;
553af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
554af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	td->files = realloc(td->files, (cur_files + 1) * sizeof(*f));
555af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
556af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	f = &td->files[cur_files];
557af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	memset(f, 0, sizeof(*f));
558af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	f->fd = -1;
559bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe
56007eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe	/*
56107eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe	 * init function, io engine may not be loaded yet
56207eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe	 */
56307eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe	if (td->io_ops && (td->io_ops->flags & FIO_DISKLESSIO))
56407eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe		f->real_file_size = -1ULL;
56507eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe
566bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe	if (td->o.directory)
567bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe		len = sprintf(file_name, "%s/", td->o.directory);
568bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe
569bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe	sprintf(file_name + len, "%s", fname);
570bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe	f->file_name = strdup(file_name);
571af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
572e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboe	get_file_type(f);
573af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
5747b4e4fe5e6fa26f82f9169c18ec70c08d0805ca9Jens Axboe	td->files_index++;
5751549441cdfecb2c1a4a8b8d494253859d67b4344Jens Axboe	if (f->filetype == FIO_TYPE_FILE)
5761549441cdfecb2c1a4a8b8d494253859d67b4344Jens Axboe		td->nr_normal_files++;
577f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
578f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	return cur_files;
579af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe}
5800ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe
5810ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboevoid get_file(struct fio_file *f)
5820ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe{
58397af62cec418cd722fb43c6010d6430534e12353Jens Axboe	assert(f->flags & FIO_FILE_OPEN);
5840ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	f->references++;
5850ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe}
5860ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe
5870ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboevoid put_file(struct thread_data *td, struct fio_file *f)
5880ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe{
5890ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	if (!(f->flags & FIO_FILE_OPEN))
5900ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe		return;
5910ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe
5920ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	assert(f->references);
5930ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	if (--f->references)
5940ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe		return;
5950ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe
596d424d4dd657eaf4aeb8ffb07a550a5f64940f41aJens Axboe	if (should_fsync(td) && td->o.fsync_on_close)
597ebb1415f729c123b8a13bcbd667bf4b4cc95b4d4Jens Axboe		fsync(f->fd);
598ebb1415f729c123b8a13bcbd667bf4b4cc95b4d4Jens Axboe
5990ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	if (td->io_ops->close_file)
6000ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe		td->io_ops->close_file(td, f);
6011020a139beff50faf1bb18f761b024b664a09e14Jens Axboe
6020ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	td->nr_open_files--;
6030ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	f->flags &= ~FIO_FILE_OPEN;
6040ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe}
605bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
606bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboestatic int recurse_dir(struct thread_data *td, const char *dirname)
607bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe{
608bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	struct dirent *dir;
609bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	int ret = 0;
610bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	DIR *D;
611bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
612bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	D = opendir(dirname);
613bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	if (!D) {
6140ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		char buf[FIO_VERROR_SIZE];
6150ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe
6160ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		snprintf(buf, FIO_VERROR_SIZE - 1, "opendir(%s)", dirname);
6170ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		td_verror(td, errno, buf);
618bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		return 1;
619bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	}
620bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
621bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	while ((dir = readdir(D)) != NULL) {
622bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		char full_path[PATH_MAX];
623bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		struct stat sb;
624bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
625e85b2b83e39b64ba5cb73fbfddbf3902b6e84925Jens Axboe		if (!strcmp(dir->d_name, ".") || !strcmp(dir->d_name, ".."))
626e85b2b83e39b64ba5cb73fbfddbf3902b6e84925Jens Axboe			continue;
62796d32d518a0743a6c050057bc1562e4883e51c5dJens Axboe
628bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		sprintf(full_path, "%s/%s", dirname, dir->d_name);
629bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
630bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		if (lstat(full_path, &sb) == -1) {
631bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			if (errno != ENOENT) {
632bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe				td_verror(td, errno, "stat");
633bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe				return 1;
634bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			}
635bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		}
636bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
637bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		if (S_ISREG(sb.st_mode)) {
638bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			add_file(td, full_path);
6392dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe			td->o.nr_files++;
640bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			continue;
641bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		}
6420ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		if (!S_ISDIR(sb.st_mode))
6430ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe			continue;
644bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
645bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		if ((ret = recurse_dir(td, full_path)) != 0)
646bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			break;
647bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	}
648bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
649bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	closedir(D);
650bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	return ret;
651bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe}
652bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
653bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboeint add_dir_files(struct thread_data *td, const char *path)
654bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe{
6550ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe	int ret = recurse_dir(td, path);
6560ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe
6570ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe	if (!ret)
6580ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		log_info("fio: opendir added %d files\n", td->o.nr_files);
6590ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe
6600ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe	return ret;
661bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe}
662cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe
663cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboevoid dup_files(struct thread_data *td, struct thread_data *org)
664cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe{
665cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	struct fio_file *f;
666cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	unsigned int i;
667cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	size_t bytes;
668cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe
669cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	if (!org->files)
670cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe		return;
671cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe
672cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	bytes = org->files_index * sizeof(*f);
673cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	td->files = malloc(bytes);
674cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	memcpy(td->files, org->files, bytes);
675cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe
676cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	for_each_file(td, f, i) {
677cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe		if (f->file_name)
678cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe			f->file_name = strdup(f->file_name);
679cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	}
680cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe}
681f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
682f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe/*
683f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe * Returns the index that matches the filename, or -1 if not there
684f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe */
685f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboeint get_fileno(struct thread_data *td, const char *fname)
686f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe{
687f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	struct fio_file *f;
688f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	unsigned int i;
689f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
690f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	for_each_file(td, f, i)
691f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe		if (!strcmp(f->file_name, fname))
692f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe			return i;
693f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
694f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	return -1;
695f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe}
696f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
697f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe/*
698f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe * For log usage, where we add/open/close files automatically
699f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe */
700f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboevoid free_release_files(struct thread_data *td)
701f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe{
702f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	close_files(td);
703f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	td->files_index = 0;
704f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	td->nr_normal_files = 0;
705f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe}
706