filesetup.c revision 4d4e80f2b4260f2c8b37a8612ce655502a799f7a
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"
11f17c43928c202e557f2f325272c60d9050ee528eJens Axboe#include "smalloc.h"
124906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe#include "filehash.h"
1353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
147172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboestatic int root_warn;
157172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe
167bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboestatic int extend_file(struct thread_data *td, struct fio_file *f)
1725205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe{
18ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe	int r, new_layout = 0, unlink_file = 0, flags;
1925205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe	unsigned long long left;
2025205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe	unsigned int bs;
2125205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe	char *b;
22b2a151925a91f38aeb298d693687a47269ad4e94Jens Axboe
234241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe	if (read_only) {
244241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe		log_err("fio: refusing extend of file due to read-only\n");
254241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe		return 0;
264241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe	}
274241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe
28507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	/*
29507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	 * check if we need to lay the file out complete again. fio
30507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	 * does that for operations involving reads, or for writes
31507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	 * where overwrite is set
32507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	 */
33507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	if (td_read(td) || (td_write(td) && td->o.overwrite))
34507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe		new_layout = 1;
35ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe	if (td_write(td) && !td->o.overwrite)
36ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe		unlink_file = 1;
37507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe
386ae1f57f2cb8661b97b770372eeb3694f6d5a744Jens Axboe	if (unlink_file || new_layout) {
39982016d689dc7fedbb09646ba0df7e72a781b164Zhang, Yanmin		if ((unlink(f->file_name) < 0) && (errno != ENOENT)) {
407bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			td_verror(td, errno, "unlink");
417bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			return 1;
427bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		}
437bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
447bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
45507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	flags = O_WRONLY | O_CREAT;
46507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	if (new_layout)
47507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe		flags |= O_TRUNC;
48507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe
49ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "open file %s, flags %x\n", f->file_name, flags);
50507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	f->fd = open(f->file_name, flags, 0644);
5153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (f->fd < 0) {
52e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, errno, "open");
5353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return 1;
5453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
5553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
56fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis	if (!new_layout)
57fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis		goto done;
58fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis
59ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "truncate file %s, size %llu\n", f->file_name,
60ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe							f->real_file_size);
617bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (ftruncate(f->fd, f->real_file_size) == -1) {
62e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, errno, "ftruncate");
6353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		goto err;
6453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
6553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
66ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "fallocate file %s, size %llu\n", f->file_name,
67ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe							f->real_file_size);
687bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (posix_fallocate(f->fd, 0, f->real_file_size) < 0) {
69e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, errno, "posix_fallocate");
7040f8298cd252157fa15d93f8eb470116a94069a0Jens Axboe		goto err;
7140f8298cd252157fa15d93f8eb470116a94069a0Jens Axboe	}
7240f8298cd252157fa15d93f8eb470116a94069a0Jens Axboe
732dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	b = malloc(td->o.max_bs[DDIR_WRITE]);
742dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	memset(b, 0, td->o.max_bs[DDIR_WRITE]);
7553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
767bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	left = f->real_file_size;
7753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	while (left && !td->terminate) {
782dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe		bs = td->o.max_bs[DDIR_WRITE];
7953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		if (bs > left)
8053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			bs = left;
8153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
8253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		r = write(f->fd, b, bs);
8353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
8453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		if (r == (int) bs) {
8553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			left -= bs;
8653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			continue;
8753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		} else {
8853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			if (r < 0)
89e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe				td_verror(td, errno, "write");
9053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			else
91e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe				td_verror(td, EIO, "write");
9253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
9353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			break;
9453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		}
9553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
9653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
9753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (td->terminate)
9853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		unlink(f->file_name);
992dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	else if (td->o.create_fsync)
10053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		fsync(f->fd);
10153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
10253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	free(b);
103507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboedone:
10453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	close(f->fd);
10553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	f->fd = -1;
10653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
10753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboeerr:
10853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	close(f->fd);
10953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	f->fd = -1;
11053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 1;
11153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
11253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
1137bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboestatic unsigned long long get_rand_file_size(struct thread_data *td)
1149c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe{
1159c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe	unsigned long long ret;
1169c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe	long r;
1179c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe
1189c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe	r = os_random_long(&td->file_size_state);
119d11a531f38b9b612dfb3bd09c89d011dc786f81dljzhang,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)));
1202dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	ret -= (ret % td->o.rw_min_bs);
1219c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe	return ret;
1229c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe}
1239c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe
12453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int file_size(struct thread_data *td, struct fio_file *f)
12553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
12653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	struct stat st;
12753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
1287bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (fstat(f->fd, &st) == -1) {
1297bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		td_verror(td, errno, "fstat");
1307bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		return 1;
1317bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
13253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
1337bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	f->real_file_size = st.st_size;
13453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
13553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
13653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
13753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int bdev_size(struct thread_data *td, struct fio_file *f)
13853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
13953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	unsigned long long bytes;
14053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	int r;
14153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
14253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	r = blockdev_size(f->fd, &bytes);
14353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (r) {
144e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, r, "blockdev_size");
14553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return 1;
14653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
14753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
14853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	f->real_file_size = bytes;
14953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
15053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
15153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
15253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int get_file_size(struct thread_data *td, struct fio_file *f)
15353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
15453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	int ret = 0;
15553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
156409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe	if (f->flags & FIO_SIZE_KNOWN)
157409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe		return 0;
158409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe
1597bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (f->filetype == FIO_TYPE_FILE)
1607bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		ret = file_size(td, f);
1617bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	else if (f->filetype == FIO_TYPE_BD)
16253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		ret = bdev_size(td, f);
16353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	else
16453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		f->real_file_size = -1;
16553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
16653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (ret)
16753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return ret;
16853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
16953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (f->file_offset > f->real_file_size) {
1702dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe		log_err("%s: offset extends end (%Lu > %Lu)\n", td->o.name, f->file_offset, f->real_file_size);
17153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return 1;
17253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
17353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
174409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe	f->flags |= FIO_SIZE_KNOWN;
17553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
17653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
17753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
178e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboeint file_invalidate_cache(struct thread_data *td, struct fio_file *f)
179e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe{
180e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	int ret = 0;
181e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
182ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_IO, "invalidate cache (%d)\n", td->o.odirect);
183ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
1842dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	if (td->o.odirect)
185b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe		return 0;
186b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe
187e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	/*
188e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	 * FIXME: add blockdev flushing too
189e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	 */
190b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe	if (f->mmap)
1917bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		ret = madvise(f->mmap, f->io_size, MADV_DONTNEED);
192467d1b6b3ebbfcb7cc0545a882ba8a93ea66752bJens Axboe	else if (f->filetype == FIO_TYPE_FILE)
1937bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		ret = fadvise(f->fd, f->file_offset, f->io_size, POSIX_FADV_DONTNEED);
1947e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe	else if (f->filetype == FIO_TYPE_BD) {
195b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe		ret = blockdev_invalidate_cache(f->fd);
1967e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe		if (ret < 0 && errno == EACCES && geteuid()) {
1977172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe			if (!root_warn) {
1987172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe				log_err("fio: only root may flush block devices. Cache flush bypassed!\n");
1997172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe				root_warn = 1;
2007172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe			}
2017e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe			ret = 0;
2027e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe		}
203b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe	} else if (f->filetype == FIO_TYPE_CHAR || f->filetype == FIO_TYPE_PIPE)
204e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe		ret = 0;
205e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
206e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	if (ret < 0) {
207e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, errno, "invalidate_cache");
208e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe		return 1;
209e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	}
210e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
211ad2da605a62faf16887970618b434db19594e17bJens Axboe	return ret;
212e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe}
213e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
2146977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboeint generic_close_file(struct thread_data fio_unused *td, struct fio_file *f)
21553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
2166977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe	int ret = 0;
2176977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe
218ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "fd close %s\n", f->file_name);
2194906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe
2204906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe	remove_file_hash(f);
2214906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe
2226977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe	if (close(f->fd) < 0)
2236977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe		ret = errno;
2246977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe
225b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe	f->fd = -1;
2266977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe	return ret;
22753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
22853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
2294d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboestatic int file_lookup_open(struct fio_file *f, int flags)
23053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
23129c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe	struct fio_file *__f;
2324d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	int from_hash;
2334d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
2344d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	__f = lookup_file_hash(f->file_name);
2354d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (__f) {
2364d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		/*
2374d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		 * racy, need the __f->lock locked
2384d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		 */
2394d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		f->lock = __f->lock;
2404d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		f->lock_owner = __f->lock_owner;
2414d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		f->lock_batch = __f->lock_batch;
2424d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		f->lock_ddir = __f->lock_ddir;
2434d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		f->fd = dup(__f->fd);
2444d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		f->references++;
2454d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		from_hash = 1;
2464d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	} else {
2474d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		f->fd = open(f->file_name, flags, 0600);
2484d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		from_hash = 0;
2494d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	}
2504d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
2514d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	return from_hash;
2524d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe}
2534d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
2544d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboeint generic_open_file(struct thread_data *td, struct fio_file *f)
2554d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe{
256661598287ecc3b8987f312cf8403936552ce686aJens Axboe	int is_std = 0;
25753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	int flags = 0;
25829c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe	int from_hash = 0;
25953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
260ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "fd open %s\n", f->file_name);
261ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
262661598287ecc3b8987f312cf8403936552ce686aJens Axboe	if (!strcmp(f->file_name, "-")) {
263661598287ecc3b8987f312cf8403936552ce686aJens Axboe		if (td_rw(td)) {
264661598287ecc3b8987f312cf8403936552ce686aJens Axboe			log_err("fio: can't read/write to stdin/out\n");
265661598287ecc3b8987f312cf8403936552ce686aJens Axboe			return 1;
266661598287ecc3b8987f312cf8403936552ce686aJens Axboe		}
267661598287ecc3b8987f312cf8403936552ce686aJens Axboe		is_std = 1;
268ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe
269ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe		/*
270ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe		 * move output logging to stderr, if we are writing to stdout
271ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe		 */
272ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe		if (td_write(td))
273ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe			f_out = stderr;
274661598287ecc3b8987f312cf8403936552ce686aJens Axboe	}
275661598287ecc3b8987f312cf8403936552ce686aJens Axboe
2762dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	if (td->o.odirect)
2772fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe		flags |= OS_O_DIRECT;
2782dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	if (td->o.sync_io)
2792fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe		flags |= O_SYNC;
280ad92396cc21055cee93470dcf65e82ccde03aac5Jens Axboe	if (f->filetype != FIO_TYPE_FILE)
281ad92396cc21055cee93470dcf65e82ccde03aac5Jens Axboe		flags |= O_NOATIME;
28253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
283056f3459149a7670257350d84b49858718e4a0e6Aaron Carrollopen_again:
284660a1cb5fb9843ec09a04337714e78d63cd557e7Jens Axboe	if (td_write(td)) {
2854241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe		assert(!read_only);
2864241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe
2872fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe		flags |= O_RDWR;
28853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
289af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe		if (f->filetype == FIO_TYPE_FILE)
2902fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe			flags |= O_CREAT;
2912fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe
292661598287ecc3b8987f312cf8403936552ce686aJens Axboe		if (is_std)
293661598287ecc3b8987f312cf8403936552ce686aJens Axboe			f->fd = dup(STDOUT_FILENO);
2944d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		else
2954d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe			from_hash = file_lookup_open(f, flags);
2962fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe	} else {
2974241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe		if (f->filetype == FIO_TYPE_CHAR && !read_only)
2982fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe			flags |= O_RDWR;
2992fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe		else
3002fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe			flags |= O_RDONLY;
3012fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe
302661598287ecc3b8987f312cf8403936552ce686aJens Axboe		if (is_std)
303661598287ecc3b8987f312cf8403936552ce686aJens Axboe			f->fd = dup(STDIN_FILENO);
3044d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		else
3054d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe			from_hash = file_lookup_open(f, flags);
30653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
30753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
30853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (f->fd == -1) {
309e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe		char buf[FIO_VERROR_SIZE];
310e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		int __e = errno;
311e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe
312056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll		if (errno == EPERM && (flags & O_NOATIME)) {
313056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll			flags &= ~O_NOATIME;
314056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll			goto open_again;
315056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll		}
316056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll
317e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe		snprintf(buf, sizeof(buf) - 1, "open(%s)", f->file_name);
318e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe
319e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe		td_verror(td, __e, buf);
32053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
32153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
322b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe	if (get_file_size(td, f))
323b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe		goto err;
324b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe
32529c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe	if (!from_hash && f->fd != -1) {
32629c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe		if (add_file_hash(f)) {
32729c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe			int ret;
32829c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe
32929c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe			/*
33029c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe			 * OK to ignore, we haven't done anything with it
33129c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe			 */
33229c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe			ret = generic_close_file(td, f);
33329c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe			goto open_again;
33429c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe		}
33529c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe	}
3364906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe
33753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
338b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboeerr:
339b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe	close(f->fd);
340b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe	return 1;
341b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe}
342b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe
34321972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboeint open_files(struct thread_data *td)
34421972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe{
34521972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe	struct fio_file *f;
346af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	unsigned int i;
347af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	int err = 0;
34821972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe
349ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "open files\n");
350ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
35121972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe	for_each_file(td, f, i) {
352b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe		err = td_io_open_file(td, f);
3539bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe		if (err) {
3549bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe			if (td->error == EMFILE) {
3559bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe				log_err("fio: limited open files to: %d\n", td->nr_open_files);
3569bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe				td->o.open_files = td->nr_open_files;
3579bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe				err = 0;
3589bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe				clear_error(td);
3599bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe			}
36021972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe			break;
3619bf27b4530fca07088ab978aea47be79a3d48879Jens Axboe		}
362b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe
3632dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe		if (td->o.open_files == td->nr_open_files)
364b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe			break;
36521972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe	}
36621972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe
3677abf833d25ab6cc866308fe37483dfe2fde28efcJens Axboe	if (!err)
3687abf833d25ab6cc866308fe37483dfe2fde28efcJens Axboe		return 0;
3697abf833d25ab6cc866308fe37483dfe2fde28efcJens Axboe
370bdb4e2e99d4a87e5d3677cc09aa1ce92135125a9Jens Axboe	for_each_file(td, f, i)
371b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe		td_io_close_file(td, f);
3727abf833d25ab6cc866308fe37483dfe2fde28efcJens Axboe
37321972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe	return err;
37421972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe}
37521972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe
3767bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe/*
3777bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * open/close all files, so that ->real_file_size gets set
3787bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */
379bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboestatic int get_file_sizes(struct thread_data *td)
3807bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe{
3817bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	struct fio_file *f;
3827bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	unsigned int i;
383bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe	int err = 0;
3847bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
3857bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	for_each_file(td, f, i) {
386bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe		if (td->io_ops->open_file(td, f)) {
38740b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe			if (td->error != ENOENT) {
38840b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe				log_err("%s\n", td->verror);
38940b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe				err = 1;
39040b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe			}
391541d66d70b8fbe9860b31307c0760e6d5f4c78a8Jens Axboe			clear_error(td);
39207eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe		} else {
39307eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe			if (td->io_ops->close_file)
39407eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe				td->io_ops->close_file(td, f);
39507eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe		}
396409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe
397409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe		if (f->real_file_size == -1ULL && td->o.size)
398409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe			f->real_file_size = td->o.size / td->o.nr_files;
3997bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
400bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe
401bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe	return err;
4027bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe}
4037bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
4047bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe/*
4057bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * Open the files and setup files sizes, creating files if necessary.
4067bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */
40753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboeint setup_files(struct thread_data *td)
40853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
4097bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	unsigned long long total_size, extend_size;
41053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	struct fio_file *f;
411af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	unsigned int i;
412000b080395e45cbe0ce54e75f0e993addbdc8676Jens Axboe	int err = 0, need_extend;
41353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
414ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "setup files\n");
415ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
41653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	/*
41753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	 * if ioengine defines a setup() method, it's responsible for
4187bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * opening the files and setting f->real_file_size to indicate
4197bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * the valid range for that file.
42053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	 */
42153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (td->io_ops->setup)
4227bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		err = td->io_ops->setup(td);
4237bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	else
424bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe		err = get_file_sizes(td);
42553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
426f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe	if (err)
427f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe		return err;
428f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe
4290a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe	/*
4307bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * check sizes. if the files/devices do not exist and the size
4317bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * isn't passed to fio, abort.
4320a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe	 */
4337bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	total_size = 0;
4347bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	for_each_file(td, f, i) {
4357bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		if (f->real_file_size == -1ULL)
4367bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			total_size = -1ULL;
4377bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		else
4387bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			total_size += f->real_file_size;
4397bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
4400a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe
4417bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	/*
4427bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * device/file sizes are zero and no size given, punt
4437bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 */
4441f809d151ddc4a4c348c2e4f6007db510e3e08a2Jens Axboe	if ((!total_size || total_size == -1ULL) && !td->o.size &&
445aa31f1f108348ba2a8749c73fa8c25f3d4630a7cShawn Lewis	    !(td->io_ops->flags & FIO_NOIO) && !td->o.fill_device) {
4467bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		log_err("%s: you need to specify size=\n", td->o.name);
447e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, EINVAL, "total_file_size");
44853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return 1;
44953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
45053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
4517bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	/*
4527bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * now file sizes are known, so we can set ->io_size. if size= is
4537bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * not given, ->io_size is just equal to ->real_file_size. if size
4547bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * is given, ->io_size is size / nr_files.
4557bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 */
4567bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	extend_size = total_size = 0;
4577bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	need_extend = 0;
4587bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	for_each_file(td, f, i) {
459bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang		f->file_offset = td->o.start_offset;
460bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang
4617bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		if (!td->o.file_size_low) {
4627bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			/*
4637bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * no file size range given, file size is equal to
4647bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * total size divided by number of files. if that is
4657bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * zero, set it to the real file size.
4667bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 */
4677bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			f->io_size = td->o.size / td->o.nr_files;
46865bdb10a09222d8b5d213de74824be775772ea8fJens Axboe			if (!f->io_size)
469273f8c912d981439049d9b21aa048aaeaa323c5dJens Axboe				f->io_size = f->real_file_size - f->file_offset;
4707bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		} else if (f->real_file_size < td->o.file_size_low ||
4717bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			   f->real_file_size > td->o.file_size_high) {
472bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang			if (f->file_offset > td->o.file_size_low)
473bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang				goto err_offset;
4747bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			/*
4757bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * file size given. if it's fixed, use that. if it's a
4767bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * range, generate a random size in-between.
4777bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 */
4787bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			if (td->o.file_size_low == td->o.file_size_high)
479bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang				f->io_size = td->o.file_size_low - f->file_offset;
4807bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			else
481bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang				f->io_size = get_rand_file_size(td) - f->file_offset;
48265bdb10a09222d8b5d213de74824be775772ea8fJens Axboe		} else
483bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang			f->io_size = f->real_file_size - f->file_offset;
48453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
4857bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		if (f->io_size == -1ULL)
4867bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			total_size = -1ULL;
4877bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		else
4887bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			total_size += f->io_size;
4897bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
4907bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		if (f->filetype == FIO_TYPE_FILE &&
491bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang		    (f->io_size + f->file_offset) > f->real_file_size &&
4927bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		    !(td->io_ops->flags & FIO_DISKLESSIO)) {
4937bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			need_extend++;
494bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang			extend_size += (f->io_size + f->file_offset);
4957bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			f->flags |= FIO_FILE_EXTEND;
496bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang		}
4977bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
49853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
4992298290eabbe1017421a6ba0f5de93d8c2b048adljzhang,Yaxin Hu,Jianchao Tang	if (!td->o.size || td->o.size > total_size)
5007bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		td->o.size = total_size;
50121972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe
5027bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	/*
5037bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * See if we need to extend some files
5047bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 */
5057bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (need_extend) {
5067bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		temp_stall_ts = 1;
507f627d8ae4dca9de8a72928a7928cf2903e81ad41Jens Axboe		log_info("%s: Laying out IO file(s) (%u file(s) / %LuMiB)\n",
5087bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			td->o.name, need_extend, extend_size >> 20);
5097bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
5107bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		for_each_file(td, f, i) {
5117bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			if (!(f->flags & FIO_FILE_EXTEND))
5127bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe				continue;
5137bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
514409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe			assert(f->filetype == FIO_TYPE_FILE);
5157bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			f->flags &= ~FIO_FILE_EXTEND;
516bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang			f->real_file_size = (f->io_size + f->file_offset);
5177bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			err = extend_file(td, f);
5187bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			if (err)
5197bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe				break;
5207bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		}
5217bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		temp_stall_ts = 0;
5227bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
5237bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
5247bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (err)
5257bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		return err;
5267bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
5277bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (!td->o.zone_size)
5287bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		td->o.zone_size = td->o.size;
5297bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
530ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe	/*
531ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe	 * iolog already set the total io size, if we read back
532ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe	 * stored entries.
533ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe	 */
534ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe	if (!td->o.read_iolog_file)
535ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe		td->total_io_size = td->o.size * td->o.loops;
5367bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	return 0;
537bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tangerr_offset:
538bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang	log_err("%s: you need to specify valid offset=\n", td->o.name);
539bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang	return 1;
54053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
54153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
542687270767de17dbad53c50e03e5d73d52505405cJens Axboeint init_random_map(struct thread_data *td)
543687270767de17dbad53c50e03e5d73d52505405cJens Axboe{
544509eab12448823a8eefbe925804b5308ee63bf5eJens Axboe	unsigned long long blocks, num_maps;
545687270767de17dbad53c50e03e5d73d52505405cJens Axboe	struct fio_file *f;
546687270767de17dbad53c50e03e5d73d52505405cJens Axboe	unsigned int i;
547687270767de17dbad53c50e03e5d73d52505405cJens Axboe
548de8dd119d7d869dd9c90c6d62bf4bededd10642eJens Axboe	if (td->o.norandommap || !td_random(td))
549687270767de17dbad53c50e03e5d73d52505405cJens Axboe		return 0;
550687270767de17dbad53c50e03e5d73d52505405cJens Axboe
551687270767de17dbad53c50e03e5d73d52505405cJens Axboe	for_each_file(td, f, i) {
552509eab12448823a8eefbe925804b5308ee63bf5eJens Axboe		blocks = (f->real_file_size + td->o.rw_min_bs - 1) / (unsigned long long) td->o.rw_min_bs;
553509eab12448823a8eefbe925804b5308ee63bf5eJens Axboe		num_maps = (blocks + BLOCKS_PER_MAP-1)/ (unsigned long long) BLOCKS_PER_MAP;
554f17c43928c202e557f2f325272c60d9050ee528eJens Axboe		f->file_map = smalloc(num_maps * sizeof(long));
555687270767de17dbad53c50e03e5d73d52505405cJens Axboe		if (!f->file_map) {
556687270767de17dbad53c50e03e5d73d52505405cJens Axboe			log_err("fio: failed allocating random map. If running a large number of jobs, try the 'norandommap' option\n");
557687270767de17dbad53c50e03e5d73d52505405cJens Axboe			return 1;
558687270767de17dbad53c50e03e5d73d52505405cJens Axboe		}
559687270767de17dbad53c50e03e5d73d52505405cJens Axboe		f->num_maps = num_maps;
560687270767de17dbad53c50e03e5d73d52505405cJens Axboe	}
561687270767de17dbad53c50e03e5d73d52505405cJens Axboe
562687270767de17dbad53c50e03e5d73d52505405cJens Axboe	return 0;
563687270767de17dbad53c50e03e5d73d52505405cJens Axboe}
564687270767de17dbad53c50e03e5d73d52505405cJens Axboe
56553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboevoid close_files(struct thread_data *td)
56653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
5670ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe	struct fio_file *f;
568af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	unsigned int i;
56953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
57024ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe	for_each_file(td, f, i)
57124ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe		td_io_close_file(td, f);
57224ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe}
57324ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe
57424ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboevoid close_and_free_files(struct thread_data *td)
57524ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe{
57624ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe	struct fio_file *f;
57724ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe	unsigned int i;
57824ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe
579ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "close files\n");
580ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
5810ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe	for_each_file(td, f, i) {
582a9b7b3052b35c20e82b8fc909cd546a5fe1ff293Jens Axboe		if (td->o.unlink && f->filetype == FIO_TYPE_FILE)
583132ad46d22bcf12da95ad69e03c1b6f23f5e60a9Jens Axboe			unlink(f->file_name);
584bdb4e2e99d4a87e5d3677cc09aa1ce92135125a9Jens Axboe
585b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe		td_io_close_file(td, f);
586b3dc7f075b85e004f8c681ebb8566475017696f3Jens Axboe
587f17c43928c202e557f2f325272c60d9050ee528eJens Axboe		sfree(f->file_name);
588fa1da8653e2177b3cc31a91e963c389f079d4172Jens Axboe		f->file_name = NULL;
589fa1da8653e2177b3cc31a91e963c389f079d4172Jens Axboe
590c343981b9874179009a92e4d29eae95cf341843aJens Axboe		if (f->file_map) {
591f17c43928c202e557f2f325272c60d9050ee528eJens Axboe			sfree(f->file_map);
592c343981b9874179009a92e4d29eae95cf341843aJens Axboe			f->file_map = NULL;
593c343981b9874179009a92e4d29eae95cf341843aJens Axboe		}
59478d99e6a2695d3a7936c5dd02f996f13a30309b1Jens Axboe		sfree(f);
59553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
596b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe
5972dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	td->o.filename = NULL;
598cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	free(td->files);
599b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe	td->files = NULL;
6002dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	td->o.nr_files = 0;
60153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
602af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
603e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboestatic void get_file_type(struct fio_file *f)
604af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe{
605af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	struct stat sb;
606af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
607661598287ecc3b8987f312cf8403936552ce686aJens Axboe	if (!strcmp(f->file_name, "-"))
608661598287ecc3b8987f312cf8403936552ce686aJens Axboe		f->filetype = FIO_TYPE_PIPE;
609661598287ecc3b8987f312cf8403936552ce686aJens Axboe	else
610661598287ecc3b8987f312cf8403936552ce686aJens Axboe		f->filetype = FIO_TYPE_FILE;
611af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
612e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboe	if (!lstat(f->file_name, &sb)) {
613af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe		if (S_ISBLK(sb.st_mode))
614af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe			f->filetype = FIO_TYPE_BD;
615af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe		else if (S_ISCHR(sb.st_mode))
616af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe			f->filetype = FIO_TYPE_CHAR;
617b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe		else if (S_ISFIFO(sb.st_mode))
618b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe			f->filetype = FIO_TYPE_PIPE;
619af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	}
620af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe}
621af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
622f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboeint add_file(struct thread_data *td, const char *fname)
623af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe{
6247b4e4fe5e6fa26f82f9169c18ec70c08d0805ca9Jens Axboe	int cur_files = td->files_index;
625bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe	char file_name[PATH_MAX];
626af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	struct fio_file *f;
627bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe	int len = 0;
628af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
629ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "add file %s\n", fname);
630ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
631f17c43928c202e557f2f325272c60d9050ee528eJens Axboe	f = smalloc(sizeof(*f));
632af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	f->fd = -1;
633bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe
634126d65c6fc97d6acdc568aa5a969c012018daf15Jens Axboe	td->files = realloc(td->files, (cur_files + 1) * sizeof(f));
635126d65c6fc97d6acdc568aa5a969c012018daf15Jens Axboe
636126d65c6fc97d6acdc568aa5a969c012018daf15Jens Axboe	td->files[cur_files] = f;
637126d65c6fc97d6acdc568aa5a969c012018daf15Jens Axboe
63807eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe	/*
63907eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe	 * init function, io engine may not be loaded yet
64007eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe	 */
64107eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe	if (td->io_ops && (td->io_ops->flags & FIO_DISKLESSIO))
64207eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe		f->real_file_size = -1ULL;
64307eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe
644bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe	if (td->o.directory)
645bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe		len = sprintf(file_name, "%s/", td->o.directory);
646bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe
647bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe	sprintf(file_name + len, "%s", fname);
648f17c43928c202e557f2f325272c60d9050ee528eJens Axboe	f->file_name = smalloc_strdup(file_name);
649af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
650e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboe	get_file_type(f);
651af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
6524d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	switch (td->o.file_lock_mode) {
6534d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	case FILE_LOCK_NONE:
6544d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		break;
6554d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	case FILE_LOCK_READWRITE:
6564d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		f->lock = fio_mutex_rw_init();
6574d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		break;
6584d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	case FILE_LOCK_EXCLUSIVE:
6594d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		f->lock = fio_mutex_init(1);
6604d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		break;
6614d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	default:
6624d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		log_err("fio: unknown lock mode: %d\n", td->o.file_lock_mode);
6634d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		assert(0);
6644d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	}
66529c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe
6667b4e4fe5e6fa26f82f9169c18ec70c08d0805ca9Jens Axboe	td->files_index++;
6671549441cdfecb2c1a4a8b8d494253859d67b4344Jens Axboe	if (f->filetype == FIO_TYPE_FILE)
6681549441cdfecb2c1a4a8b8d494253859d67b4344Jens Axboe		td->nr_normal_files++;
669f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
670f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	return cur_files;
671af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe}
6720ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe
6730ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboevoid get_file(struct fio_file *f)
6740ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe{
6758172fe972f3a79d42f34d7f6e259ed3f7f800316Jens Axboe	dprint(FD_FILE, "get file %s, ref=%d\n", f->file_name, f->references);
67697af62cec418cd722fb43c6010d6430534e12353Jens Axboe	assert(f->flags & FIO_FILE_OPEN);
6770ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	f->references++;
6780ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe}
6790ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe
6806977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboeint put_file(struct thread_data *td, struct fio_file *f)
6810ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe{
6826977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe	int ret = 0;
6836977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe
6848172fe972f3a79d42f34d7f6e259ed3f7f800316Jens Axboe	dprint(FD_FILE, "put file %s, ref=%d\n", f->file_name, f->references);
685ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
6860ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	if (!(f->flags & FIO_FILE_OPEN))
6876977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe		return 0;
6880ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe
6890ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	assert(f->references);
6900ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	if (--f->references)
6916977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe		return 0;
6920ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe
693d424d4dd657eaf4aeb8ffb07a550a5f64940f41aJens Axboe	if (should_fsync(td) && td->o.fsync_on_close)
694ebb1415f729c123b8a13bcbd667bf4b4cc95b4d4Jens Axboe		fsync(f->fd);
695ebb1415f729c123b8a13bcbd667bf4b4cc95b4d4Jens Axboe
6960ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	if (td->io_ops->close_file)
6976977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe		ret = td->io_ops->close_file(td, f);
6981020a139beff50faf1bb18f761b024b664a09e14Jens Axboe
6990ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	td->nr_open_files--;
7000ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	f->flags &= ~FIO_FILE_OPEN;
7016977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe	return ret;
7020ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe}
703bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
7044d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid lock_file(struct thread_data *td, struct fio_file *f, enum fio_ddir ddir)
705b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe{
7064d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (!f->lock || td->o.file_lock_mode == FILE_LOCK_NONE)
7074d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		return;
70829c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe
7094d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (f->lock_owner == td && f->lock_batch--)
7104d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		return;
7114d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
7124d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (td->o.file_lock_mode == FILE_LOCK_READWRITE) {
7134d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		if (ddir == DDIR_READ)
7144d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe			fio_mutex_down_read(f->lock);
7154d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		else
7164d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe			fio_mutex_down_write(f->lock);
7174d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	} else if (td->o.file_lock_mode == FILE_LOCK_EXCLUSIVE)
7184d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		fio_mutex_down(f->lock);
7194d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
7204d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	f->lock_owner = td;
7214d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	f->lock_batch = td->o.lockfile_batch;
7224d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	f->lock_ddir = ddir;
723b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe}
724b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe
7254d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid unlock_file(struct thread_data *td, struct fio_file *f)
726b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe{
7274d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (!f->lock || td->o.file_lock_mode == FILE_LOCK_NONE)
7284d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		return;
7294d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (f->lock_batch)
7304d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		return;
7314d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
7324d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (td->o.file_lock_mode == FILE_LOCK_READWRITE) {
7334d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		const int is_read = f->lock_ddir == DDIR_READ;
7344d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		int val = fio_mutex_getval(f->lock);
73529c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe
7364d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		if ((is_read && val == 1) || (!is_read && val == -1))
7374d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe			f->lock_owner = NULL;
73829c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe
7394d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		if (is_read)
7404d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe			fio_mutex_up_read(f->lock);
7414d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		else
7424d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe			fio_mutex_up_write(f->lock);
7434d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	} else if (td->o.file_lock_mode == FILE_LOCK_EXCLUSIVE) {
7444d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		int val = fio_mutex_getval(f->lock);
7454d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
7464d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		if (val == 0)
7474d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe			f->lock_owner = NULL;
7484d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
7494d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		fio_mutex_up(f->lock);
75029c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe	}
751b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe}
752b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe
7534d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid unlock_file_all(struct thread_data *td, struct fio_file *f)
7544d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe{
7554d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (f->lock_owner != td)
7564d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		return;
7574d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
7584d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	f->lock_batch = 0;
7594d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	unlock_file(td, f);
7604d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe}
7614d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
762bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboestatic int recurse_dir(struct thread_data *td, const char *dirname)
763bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe{
764bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	struct dirent *dir;
765bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	int ret = 0;
766bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	DIR *D;
767bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
768bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	D = opendir(dirname);
769bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	if (!D) {
7700ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		char buf[FIO_VERROR_SIZE];
7710ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe
7720ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		snprintf(buf, FIO_VERROR_SIZE - 1, "opendir(%s)", dirname);
7730ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		td_verror(td, errno, buf);
774bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		return 1;
775bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	}
776bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
777bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	while ((dir = readdir(D)) != NULL) {
778bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		char full_path[PATH_MAX];
779bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		struct stat sb;
780bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
781e85b2b83e39b64ba5cb73fbfddbf3902b6e84925Jens Axboe		if (!strcmp(dir->d_name, ".") || !strcmp(dir->d_name, ".."))
782e85b2b83e39b64ba5cb73fbfddbf3902b6e84925Jens Axboe			continue;
78396d32d518a0743a6c050057bc1562e4883e51c5dJens Axboe
784bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		sprintf(full_path, "%s/%s", dirname, dir->d_name);
785bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
786bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		if (lstat(full_path, &sb) == -1) {
787bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			if (errno != ENOENT) {
788bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe				td_verror(td, errno, "stat");
789bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe				return 1;
790bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			}
791bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		}
792bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
793bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		if (S_ISREG(sb.st_mode)) {
794bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			add_file(td, full_path);
7952dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe			td->o.nr_files++;
796bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			continue;
797bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		}
7980ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		if (!S_ISDIR(sb.st_mode))
7990ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe			continue;
800bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
801bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		if ((ret = recurse_dir(td, full_path)) != 0)
802bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			break;
803bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	}
804bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
805bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	closedir(D);
806bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	return ret;
807bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe}
808bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
809bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboeint add_dir_files(struct thread_data *td, const char *path)
810bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe{
8110ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe	int ret = recurse_dir(td, path);
8120ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe
8130ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe	if (!ret)
8140ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		log_info("fio: opendir added %d files\n", td->o.nr_files);
8150ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe
8160ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe	return ret;
817bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe}
818cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe
819cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboevoid dup_files(struct thread_data *td, struct thread_data *org)
820cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe{
821cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	struct fio_file *f;
822cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	unsigned int i;
823cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	size_t bytes;
824cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe
825cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	if (!org->files)
826cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe		return;
827cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe
828b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe	bytes = org->files_index * sizeof(f);
829cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	td->files = malloc(bytes);
830cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	memcpy(td->files, org->files, bytes);
831cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe
832cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	for_each_file(td, f, i) {
833b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe		struct fio_file *__f;
834b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe
835f17c43928c202e557f2f325272c60d9050ee528eJens Axboe		__f = smalloc(sizeof(*__f));
836b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe
837cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe		if (f->file_name)
838f17c43928c202e557f2f325272c60d9050ee528eJens Axboe			__f->file_name = smalloc_strdup(f->file_name);
839b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe
840b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe		td->files[i] = __f;
841cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	}
842cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe}
843f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
844f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe/*
845f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe * Returns the index that matches the filename, or -1 if not there
846f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe */
847f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboeint get_fileno(struct thread_data *td, const char *fname)
848f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe{
849f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	struct fio_file *f;
850f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	unsigned int i;
851f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
852f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	for_each_file(td, f, i)
853f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe		if (!strcmp(f->file_name, fname))
854f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe			return i;
855f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
856f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	return -1;
857f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe}
858f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
859f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe/*
860f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe * For log usage, where we add/open/close files automatically
861f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe */
862f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboevoid free_release_files(struct thread_data *td)
863f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe{
864f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	close_files(td);
865f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	td->files_index = 0;
866f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	td->nr_normal_files = 0;
867f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe}
868