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>
6d74ac843d82345862070400cb5fe408524c613f3YAMAMOTO Takashi#include <libgen.h>
753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include <sys/stat.h>
853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include <sys/mman.h>
9bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe#include <sys/types.h>
1053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
1153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include "fio.h"
12f17c43928c202e557f2f325272c60d9050ee528eJens Axboe#include "smalloc.h"
134906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe#include "filehash.h"
14bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt#include "options.h"
15ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran#include "os/os.h"
162316296a514711bb388d87b34742c04bb561d986Jens Axboe#include "hash.h"
177ebd796f4e50c21d652e62bf1e112755b0f338a8Jens Axboe#include "lib/axmap.h"
1853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
1997ac992c99d89eed8cdf9249bb038ac4d7b709b9Jens Axboe#ifdef CONFIG_LINUX_FALLOCATE
20a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou#include <linux/falloc.h>
21a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou#endif
22a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou
237172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboestatic int root_warn;
247172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe
25bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardtstatic FLIST_HEAD(filename_list);
26bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt
27eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes/*
28eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * List entry for filename_list
29eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes */
30eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughesstruct file_name {
31eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	struct flist_head list;
32eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	char *filename;
33eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes};
34eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
35c592b9fe12d4739d99d5bece517e304804876df6Jens Axboestatic inline void clear_error(struct thread_data *td)
36c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe{
37c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe	td->error = 0;
38c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe	td->verror[0] = '\0';
39c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe}
40c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe
413baddf2450d811be658fb47ef883ee84478dc352Jens Axboe/*
423baddf2450d811be658fb47ef883ee84478dc352Jens Axboe * Leaves f->fd open on success, caller must close
433baddf2450d811be658fb47ef883ee84478dc352Jens Axboe */
447bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboestatic int extend_file(struct thread_data *td, struct fio_file *f)
4525205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe{
46ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe	int r, new_layout = 0, unlink_file = 0, flags;
4725205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe	unsigned long long left;
4825205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe	unsigned int bs;
49f3e1eb23a6c900921caa58c6cad66d3b60b0b6d7Jens Axboe	char *b = NULL;
50b2a151925a91f38aeb298d693687a47269ad4e94Jens Axboe
514241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe	if (read_only) {
524241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe		log_err("fio: refusing extend of file due to read-only\n");
534241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe		return 0;
544241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe	}
554241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe
56507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	/*
57507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	 * check if we need to lay the file out complete again. fio
58507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	 * does that for operations involving reads, or for writes
59507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	 * where overwrite is set
60507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	 */
611417daeb92c44632f2e1e376d736a0f198d7af8dJens Axboe	if (td_read(td) ||
621417daeb92c44632f2e1e376d736a0f198d7af8dJens Axboe	   (td_write(td) && td->o.overwrite && !td->o.file_append) ||
63eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	    (td_write(td) && td_ioengine_flagged(td, FIO_NOEXTEND)))
64507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe		new_layout = 1;
651417daeb92c44632f2e1e376d736a0f198d7af8dJens Axboe	if (td_write(td) && !td->o.overwrite && !td->o.file_append)
66ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe		unlink_file = 1;
67507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe
686ae1f57f2cb8661b97b770372eeb3694f6d5a744Jens Axboe	if (unlink_file || new_layout) {
69eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		int ret;
70eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
71bd199f2b98eeb9101795e40fdef5889c630178c1Jens Axboe		dprint(FD_FILE, "layout unlink %s\n", f->file_name);
72eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
73eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		ret = td_io_unlink_file(td, f);
74eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		if (ret != 0 && ret != ENOENT) {
757bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			td_verror(td, errno, "unlink");
767bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			return 1;
777bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		}
787bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
797bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
80eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	flags = O_WRONLY;
81eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	if (td->o.allow_create)
82eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		flags |= O_CREAT;
83507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	if (new_layout)
84507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe		flags |= O_TRUNC;
85507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe
869c0f3f3279985b724c2f1358bb05cc2c795f2265Bruce Cran#ifdef WIN32
879c0f3f3279985b724c2f1358bb05cc2c795f2265Bruce Cran	flags |= _O_BINARY;
889c0f3f3279985b724c2f1358bb05cc2c795f2265Bruce Cran#endif
899c0f3f3279985b724c2f1358bb05cc2c795f2265Bruce Cran
90ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "open file %s, flags %x\n", f->file_name, flags);
91507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	f->fd = open(f->file_name, flags, 0644);
9253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (f->fd < 0) {
93eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		int err = errno;
94eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
95eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		if (err == ENOENT && !td->o.allow_create)
96eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			log_err("fio: file creation disallowed by "
97eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes					"allow_file_create=0\n");
98eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		else
99eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			td_verror(td, err, "open");
10053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return 1;
10153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
10253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
10397ac992c99d89eed8cdf9249bb038ac4d7b709b9Jens Axboe#ifdef CONFIG_POSIX_FALLOCATE
104a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou	if (!td->o.fill_device) {
105a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou		switch (td->o.fallocate_mode) {
106a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou		case FIO_FALLOCATE_NONE:
107a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			break;
108a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou		case FIO_FALLOCATE_POSIX:
109a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			dprint(FD_FILE, "posix_fallocate file %s size %llu\n",
1104b91ee8fd12c72bd76ce9f5ff9116626b48566a0Jens Axboe				 f->file_name,
1114b91ee8fd12c72bd76ce9f5ff9116626b48566a0Jens Axboe				 (unsigned long long) f->real_file_size);
112a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou
113a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			r = posix_fallocate(f->fd, 0, f->real_file_size);
114a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			if (r > 0) {
115a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou				log_err("fio: posix_fallocate fails: %s\n",
116a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou						strerror(r));
117a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			}
118a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			break;
11997ac992c99d89eed8cdf9249bb038ac4d7b709b9Jens Axboe#ifdef CONFIG_LINUX_FALLOCATE
120a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou		case FIO_FALLOCATE_KEEP_SIZE:
121a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			dprint(FD_FILE,
122a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou				"fallocate(FALLOC_FL_KEEP_SIZE) "
1234b91ee8fd12c72bd76ce9f5ff9116626b48566a0Jens Axboe				"file %s size %llu\n", f->file_name,
1244b91ee8fd12c72bd76ce9f5ff9116626b48566a0Jens Axboe				(unsigned long long) f->real_file_size);
1257bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe
126a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			r = fallocate(f->fd, FALLOC_FL_KEEP_SIZE, 0,
127a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou					f->real_file_size);
128888677a428eb6ae6b54195e99734d6d6b3ee55e7Jens Axboe			if (r != 0)
129a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou				td_verror(td, errno, "fallocate");
130888677a428eb6ae6b54195e99734d6d6b3ee55e7Jens Axboe
131a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			break;
13297ac992c99d89eed8cdf9249bb038ac4d7b709b9Jens Axboe#endif /* CONFIG_LINUX_FALLOCATE */
133a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou		default:
134a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			log_err("fio: unknown fallocate mode: %d\n",
135a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou				td->o.fallocate_mode);
136a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			assert(0);
1377bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe		}
1387bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe	}
13997ac992c99d89eed8cdf9249bb038ac4d7b709b9Jens Axboe#endif /* CONFIG_POSIX_FALLOCATE */
1409b8365618309572d8fd2579c8ea3132db89f843fBruce Cran
141eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	/*
142eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	 * If our jobs don't require regular files initially, we're done.
143eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	 */
144fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis	if (!new_layout)
145fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis		goto done;
146fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis
1475e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	/*
1485e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	 * The size will be -1ULL when fill_device is used, so don't truncate
1495e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	 * or fallocate this file, just write it
1505e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	 */
1515e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	if (!td->o.fill_device) {
1525e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe		dprint(FD_FILE, "truncate file %s, size %llu\n", f->file_name,
1534b91ee8fd12c72bd76ce9f5ff9116626b48566a0Jens Axboe					(unsigned long long) f->real_file_size);
1545e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe		if (ftruncate(f->fd, f->real_file_size) == -1) {
1553cd4c66f35fad0df64e4e6dfeddc5bdfd5206e0cJohn			if (errno != EFBIG) {
1563cd4c66f35fad0df64e4e6dfeddc5bdfd5206e0cJohn				td_verror(td, errno, "ftruncate");
1573cd4c66f35fad0df64e4e6dfeddc5bdfd5206e0cJohn				goto err;
1583cd4c66f35fad0df64e4e6dfeddc5bdfd5206e0cJohn			}
1595e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe		}
1605e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	}
16140f8298cd252157fa15d93f8eb470116a94069a0Jens Axboe
1627bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	left = f->real_file_size;
163eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	bs = td->o.max_bs[DDIR_WRITE];
164eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	if (bs > left)
165eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		bs = left;
166eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
167eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	b = malloc(bs);
168eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	if (!b) {
169eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		td_verror(td, errno, "malloc");
170eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		goto err;
171eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	}
172eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
17353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	while (left && !td->terminate) {
17453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		if (bs > left)
17553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			bs = left;
17653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
177cc86c395fd9dd2002ec1edc0967b7c9453debdfbJens Axboe		fill_io_buffer(td, b, bs, bs);
178cc86c395fd9dd2002ec1edc0967b7c9453debdfbJens Axboe
17953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		r = write(f->fd, b, bs);
18053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
1815e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe		if (r > 0) {
1825e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			left -= r;
18353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			continue;
18453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		} else {
1855e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			if (r < 0) {
1865e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe				int __e = errno;
1875e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe
1885e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe				if (__e == ENOSPC) {
1895e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe					if (td->o.fill_device)
1905e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe						break;
1915e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe					log_info("fio: ENOSPC on laying out "
1925e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe						 "file, stopping\n");
1935e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe					break;
1945e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe				}
195e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe				td_verror(td, errno, "write");
1965e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			} else
197e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe				td_verror(td, EIO, "write");
19853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
19953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			break;
20053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		}
20153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
20253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
203ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe	if (td->terminate) {
204ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe		dprint(FD_FILE, "terminate unlink %s\n", f->file_name);
2059187a269bf4539fa4b5b97a9b7439ba408d6b872Castor Fu		td_io_unlink_file(td, f);
206ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe	} else if (td->o.create_fsync) {
20798e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe		if (fsync(f->fd) < 0) {
20898e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe			td_verror(td, errno, "fsync");
20998e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe			goto err;
21098e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe		}
21198e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe	}
2120d1cd207e409a36313784cb9596990c819775f77Jens Axboe	if (td->o.fill_device && !td_write(td)) {
213d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe		fio_file_clear_size_known(f);
2145e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe		if (td_io_get_file_size(td, f))
2155e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			goto err;
2165e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe		if (f->io_size > f->real_file_size)
2175e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			f->io_size = f->real_file_size;
2185e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	}
21953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
22053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	free(b);
221507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboedone:
22253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
22353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboeerr:
22453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	close(f->fd);
22553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	f->fd = -1;
226f3e1eb23a6c900921caa58c6cad66d3b60b0b6d7Jens Axboe	if (b)
227f3e1eb23a6c900921caa58c6cad66d3b60b0b6d7Jens Axboe		free(b);
22853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 1;
22953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
23053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
231afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanminstatic int pre_read_file(struct thread_data *td, struct fio_file *f)
232afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin{
233ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe	int ret = 0, r, did_open = 0, old_runstate;
234afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	unsigned long long left;
235afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	unsigned int bs;
236afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	char *b;
237afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
238eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	if (td_ioengine_flagged(td, FIO_PIPEIO) ||
239eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	    td_ioengine_flagged(td, FIO_NOIO))
240eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		return 0;
241eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
242eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	if (f->filetype == FIO_TYPE_CHAR)
2439c0d224129b0c59698e4c77e7fed00dc8cbb50e1Jens Axboe		return 0;
2449c0d224129b0c59698e4c77e7fed00dc8cbb50e1Jens Axboe
245d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe	if (!fio_file_open(f)) {
246b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe		if (td->io_ops->open_file(td, f)) {
247b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe			log_err("fio: cannot pre-read, failed to open file\n");
248b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe			return 1;
249b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe		}
250b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe		did_open = 1;
251b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe	}
252b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe
2538edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe	old_runstate = td_bump_runstate(td, TD_PRE_READING);
254b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe
255eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	left = f->io_size;
256afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	bs = td->o.max_bs[DDIR_READ];
257eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	if (bs > left)
258eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		bs = left;
259eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
260afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	b = malloc(bs);
261eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	if (!b) {
262eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		td_verror(td, errno, "malloc");
263eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		ret = 1;
264eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		goto error;
265eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	}
266afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	memset(b, 0, bs);
267afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
268ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe	if (lseek(f->fd, f->file_offset, SEEK_SET) < 0) {
269ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe		td_verror(td, errno, "lseek");
270ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe		log_err("fio: failed to lseek pre-read file\n");
271ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe		ret = 1;
272ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe		goto error;
273ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe	}
274ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe
275afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	while (left && !td->terminate) {
276afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin		if (bs > left)
277afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin			bs = left;
278afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
279afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin		r = read(f->fd, b, bs);
280afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
281afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin		if (r == (int) bs) {
282afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin			left -= bs;
283afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin			continue;
284afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin		} else {
285afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin			td_verror(td, EIO, "pre_read");
286afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin			break;
287afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin		}
288afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	}
289afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
290ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboeerror:
2918edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe	td_restore_runstate(td, old_runstate);
292b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe
293b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe	if (did_open)
294b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe		td->io_ops->close_file(td, f);
295ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe
296afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	free(b);
297ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe	return ret;
298afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin}
299afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
300eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughesunsigned long long get_rand_file_size(struct thread_data *td)
3019c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe{
302dc873b6f4a536c332b72cce268d5a7ccd356a891Jens Axboe	unsigned long long ret, sized;
303eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	uint64_t frand_max;
3041294c3ec7a02d20a98b105c1c41b23358afc67e4Jens Axboe	unsigned long r;
3059c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe
306eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	frand_max = rand_max(&td->file_size_state);
307f678701783f1c200ce574215feeb7ff801c4ff72Jens Axboe	r = __rand(&td->file_size_state);
308559073f664a872f32632892c560667097b29e963Jens Axboe	sized = td->o.file_size_high - td->o.file_size_low;
309eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	ret = (unsigned long long) ((double) sized * (r / (frand_max + 1.0)));
3105ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe	ret += td->o.file_size_low;
3112dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	ret -= (ret % td->o.rw_min_bs);
3129c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe	return ret;
3139c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe}
3149c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe
31553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int file_size(struct thread_data *td, struct fio_file *f)
31653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
31753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	struct stat st;
31853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
319df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe	if (stat(f->file_name, &st) == -1) {
3207bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		td_verror(td, errno, "fstat");
3217bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		return 1;
3227bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
32353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
3247bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	f->real_file_size = st.st_size;
32553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
32653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
32753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
32853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int bdev_size(struct thread_data *td, struct fio_file *f)
32953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
3309b8365618309572d8fd2579c8ea3132db89f843fBruce Cran	unsigned long long bytes = 0;
33153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	int r;
33253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
333df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe	if (td->io_ops->open_file(td, f)) {
334df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe		log_err("fio: failed opening blockdev %s for size check\n",
335df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe			f->file_name);
336df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe		return 1;
337df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe	}
338df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe
339ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran	r = blockdev_size(f, &bytes);
34053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (r) {
341e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, r, "blockdev_size");
342df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe		goto err;
34353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
34453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
3457ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe	if (!bytes) {
3467ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe		log_err("%s: zero sized block device?\n", f->file_name);
347df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe		goto err;
3487ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe	}
3497ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe
35053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	f->real_file_size = bytes;
35122a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe	td->io_ops->close_file(td, f);
35253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
353df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboeerr:
354df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe	td->io_ops->close_file(td, f);
355df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe	return 1;
35653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
35753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
3584ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboestatic int char_size(struct thread_data *td, struct fio_file *f)
3594ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe{
3604ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe#ifdef FIO_HAVE_CHARDEV_SIZE
3619b8365618309572d8fd2579c8ea3132db89f843fBruce Cran	unsigned long long bytes = 0;
3624ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	int r;
3634ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe
3644ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	if (td->io_ops->open_file(td, f)) {
365eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		log_err("fio: failed opening chardev %s for size check\n",
3664ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe			f->file_name);
3674ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		return 1;
3684ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	}
3694ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe
370ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran	r = chardev_size(f, &bytes);
3714ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	if (r) {
3724ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		td_verror(td, r, "chardev_size");
3734ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		goto err;
3744ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	}
3754ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe
3764ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	if (!bytes) {
3774ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		log_err("%s: zero sized char device?\n", f->file_name);
3784ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		goto err;
3794ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	}
3804ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe
3814ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	f->real_file_size = bytes;
3824ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	td->io_ops->close_file(td, f);
3834ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	return 0;
3844ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboeerr:
3854ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	td->io_ops->close_file(td, f);
3864ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	return 1;
3874ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe#else
3884ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	f->real_file_size = -1ULL;
3894ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	return 0;
3904ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe#endif
3914ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe}
3924ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe
39353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int get_file_size(struct thread_data *td, struct fio_file *f)
39453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
39553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	int ret = 0;
39653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
397d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe	if (fio_file_size_known(f))
398409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe		return 0;
399409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe
4007bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (f->filetype == FIO_TYPE_FILE)
4017bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		ret = file_size(td, f);
402eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	else if (f->filetype == FIO_TYPE_BLOCK)
40353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		ret = bdev_size(td, f);
4044ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	else if (f->filetype == FIO_TYPE_CHAR)
4054ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		ret = char_size(td, f);
40653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	else
407eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		f->real_file_size = -1ULL;
40853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
409eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	/*
410eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	 * Leave ->real_file_size with 0 since it could be expectation
411eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	 * of initial setup for regular files.
412eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	 */
41353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (ret)
41453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return ret;
41553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
416eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	/*
417eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	 * If ->real_file_size is -1, a conditional for the message
418eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	 * "offset extends end" is always true, but it makes no sense,
419eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	 * so just return the same value here.
420eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	 */
421eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	if (f->real_file_size == -1ULL) {
422eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		log_info("%s: failed to get file size of %s\n", td->o.name,
423eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes					f->file_name);
424eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		return 1;
425eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	}
426eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
427eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	if (td->o.start_offset && f->file_offset == 0)
428eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		dprint(FD_FILE, "offset of file %s not initialized yet\n",
429eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes					f->file_name);
430eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	/*
431eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	 * ->file_offset normally hasn't been initialized yet, so this
432eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	 * is basically always false.
433eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	 */
43453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (f->file_offset > f->real_file_size) {
4350f2152c19ed12fc2280c3d475973112f18e48cd5Bruce Cran		log_err("%s: offset extends end (%llu > %llu)\n", td->o.name,
4364e0a8fa2593006505b7f4e18931a201d221b49e9Jens Axboe					(unsigned long long) f->file_offset,
4374e0a8fa2593006505b7f4e18931a201d221b49e9Jens Axboe					(unsigned long long) f->real_file_size);
43853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return 1;
43953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
44053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
441d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe	fio_file_set_size_known(f);
44253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
44353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
44453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
4453baddf2450d811be658fb47ef883ee84478dc352Jens Axboestatic int __file_invalidate_cache(struct thread_data *td, struct fio_file *f,
4463baddf2450d811be658fb47ef883ee84478dc352Jens Axboe				   unsigned long long off,
4473baddf2450d811be658fb47ef883ee84478dc352Jens Axboe				   unsigned long long len)
448e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe{
449eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	int errval = 0, ret = 0;
450e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
451ef7035a9b2c7af1e745b7cd2448685527ef7eeb0Jens Axboe#ifdef CONFIG_ESX
452ef7035a9b2c7af1e745b7cd2448685527ef7eeb0Jens Axboe	return 0;
453ef7035a9b2c7af1e745b7cd2448685527ef7eeb0Jens Axboe#endif
454ef7035a9b2c7af1e745b7cd2448685527ef7eeb0Jens Axboe
4555e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	if (len == -1ULL)
4563baddf2450d811be658fb47ef883ee84478dc352Jens Axboe		len = f->io_size;
4573baddf2450d811be658fb47ef883ee84478dc352Jens Axboe	if (off == -1ULL)
4583baddf2450d811be658fb47ef883ee84478dc352Jens Axboe		off = f->file_offset;
459ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
4600d1cd207e409a36313784cb9596990c819775f77Jens Axboe	if (len == -1ULL || off == -1ULL)
4610d1cd207e409a36313784cb9596990c819775f77Jens Axboe		return 0;
4620d1cd207e409a36313784cb9596990c819775f77Jens Axboe
463eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	if (td->io_ops->invalidate) {
464eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		dprint(FD_IO, "invalidate %s cache %s\n", td->io_ops->name,
465eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			f->file_name);
4661be9f219c5f7d218a6c5cced3ee93c7174a032daJens Axboe		ret = td->io_ops->invalidate(td, f);
467eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		if (ret < 0)
468eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			errval = -ret;
469eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	} else if (f->filetype == FIO_TYPE_FILE) {
470eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		dprint(FD_IO, "declare unneeded cache %s: %llu/%llu\n",
471eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			f->file_name, off, len);
472ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran		ret = posix_fadvise(f->fd, off, len, POSIX_FADV_DONTNEED);
473eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		if (ret)
474eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			errval = ret;
475eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	} else if (f->filetype == FIO_TYPE_BLOCK) {
476eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		int retry_count = 0;
477eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
478eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		dprint(FD_IO, "drop page cache %s\n", f->file_name);
479ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran		ret = blockdev_invalidate_cache(f);
480eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		while (ret < 0 && errno == EAGAIN && retry_count++ < 25) {
481eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			/*
482eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			 * Linux multipath devices reject ioctl while
483eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			 * the maps are being updated. That window can
484eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			 * last tens of milliseconds; we'll try up to
485eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			 * a quarter of a second.
486eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			 */
487eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			usleep(10000);
488eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			ret = blockdev_invalidate_cache(f);
489eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		}
4907e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe		if (ret < 0 && errno == EACCES && geteuid()) {
4917172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe			if (!root_warn) {
4925ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				log_err("fio: only root may flush block "
4935ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe					"devices. Cache flush bypassed!\n");
4947172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe				root_warn = 1;
4957172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe			}
4967e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe			ret = 0;
4977e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe		}
498eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		if (ret < 0)
499eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			errval = errno;
500eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		else if (ret) /* probably not supported */
501eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			errval = ret;
502eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	} else if (f->filetype == FIO_TYPE_CHAR ||
503eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		   f->filetype == FIO_TYPE_PIPE) {
504eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		dprint(FD_IO, "invalidate not supported %s\n", f->file_name);
505e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe		ret = 0;
506eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	}
507e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
508dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe	/*
509dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe	 * Cache flushing isn't a fatal condition, and we know it will
510dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe	 * happen on some platforms where we don't have the proper
511dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe	 * function to flush eg block device caches. So just warn and
512dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe	 * continue on our way.
513dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe	 */
514eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	if (errval)
515eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		log_info("fio: cache invalidation of %s failed: %s\n",
516eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			 f->file_name, strerror(errval));
517e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
518dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe	return 0;
5193baddf2450d811be658fb47ef883ee84478dc352Jens Axboe
5203baddf2450d811be658fb47ef883ee84478dc352Jens Axboe}
5213baddf2450d811be658fb47ef883ee84478dc352Jens Axboe
5223baddf2450d811be658fb47ef883ee84478dc352Jens Axboeint file_invalidate_cache(struct thread_data *td, struct fio_file *f)
5233baddf2450d811be658fb47ef883ee84478dc352Jens Axboe{
524d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe	if (!fio_file_open(f))
525a5fb461fdff86c442daeebbd28e07984be9f3807Jens Axboe		return 0;
526a5fb461fdff86c442daeebbd28e07984be9f3807Jens Axboe
5275e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	return __file_invalidate_cache(td, f, -1ULL, -1ULL);
528e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe}
529e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
5306977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboeint generic_close_file(struct thread_data fio_unused *td, struct fio_file *f)
53153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
5326977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe	int ret = 0;
5336977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe
534ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "fd close %s\n", f->file_name);
5354906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe
5364906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe	remove_file_hash(f);
5374906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe
5386977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe	if (close(f->fd) < 0)
5396977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe		ret = errno;
5406977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe
541b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe	f->fd = -1;
542e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe
543e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe	if (f->shadow_fd != -1) {
544e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe		close(f->shadow_fd);
545e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe		f->shadow_fd = -1;
546e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe	}
547e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe
548eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	f->engine_pos = 0;
5496977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe	return ret;
55053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
55153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
5521ccc6dc75b28ef70cd7a8c39ac8c1cb68c720a65Dmitry Monakhovint file_lookup_open(struct fio_file *f, int flags)
55353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
55429c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe	struct fio_file *__f;
5554d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	int from_hash;
5564d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
5574d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	__f = lookup_file_hash(f->file_name);
5584d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (__f) {
5599efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe		dprint(FD_FILE, "found file in hash %s\n", f->file_name);
5604d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		f->lock = __f->lock;
5614d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		from_hash = 1;
5624d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	} else {
5639efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe		dprint(FD_FILE, "file not found in hash %s\n", f->file_name);
5644d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		from_hash = 0;
5654d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	}
5664d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
5679c0f3f3279985b724c2f1358bb05cc2c795f2265Bruce Cran#ifdef WIN32
5689c0f3f3279985b724c2f1358bb05cc2c795f2265Bruce Cran	flags |= _O_BINARY;
5699c0f3f3279985b724c2f1358bb05cc2c795f2265Bruce Cran#endif
5709c0f3f3279985b724c2f1358bb05cc2c795f2265Bruce Cran
571e8670ef8b26039573fbf835b4b95ba45a1039d83Jens Axboe	f->fd = open(f->file_name, flags, 0600);
5724d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	return from_hash;
5734d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe}
5744d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
575e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboestatic int file_close_shadow_fds(struct thread_data *td)
576e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe{
577e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe	struct fio_file *f;
578e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe	int num_closed = 0;
579e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe	unsigned int i;
580e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe
581e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe	for_each_file(td, f, i) {
582e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe		if (f->shadow_fd == -1)
583e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe			continue;
584e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe
585e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe		close(f->shadow_fd);
586e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe		f->shadow_fd = -1;
587e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe		num_closed++;
588e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe	}
589e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe
590e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe	return num_closed;
591e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe}
592e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe
5934d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboeint generic_open_file(struct thread_data *td, struct fio_file *f)
5944d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe{
595661598287ecc3b8987f312cf8403936552ce686aJens Axboe	int is_std = 0;
59653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	int flags = 0;
59729c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe	int from_hash = 0;
59853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
599ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "fd open %s\n", f->file_name);
600ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
601661598287ecc3b8987f312cf8403936552ce686aJens Axboe	if (!strcmp(f->file_name, "-")) {
602661598287ecc3b8987f312cf8403936552ce686aJens Axboe		if (td_rw(td)) {
603661598287ecc3b8987f312cf8403936552ce686aJens Axboe			log_err("fio: can't read/write to stdin/out\n");
604661598287ecc3b8987f312cf8403936552ce686aJens Axboe			return 1;
605661598287ecc3b8987f312cf8403936552ce686aJens Axboe		}
606661598287ecc3b8987f312cf8403936552ce686aJens Axboe		is_std = 1;
607ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe
608ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe		/*
609ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe		 * move output logging to stderr, if we are writing to stdout
610ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe		 */
611ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe		if (td_write(td))
612ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe			f_out = stderr;
613661598287ecc3b8987f312cf8403936552ce686aJens Axboe	}
614661598287ecc3b8987f312cf8403936552ce686aJens Axboe
6156eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	if (td_trim(td))
6166eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li		goto skip_flags;
6172dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	if (td->o.odirect)
6182fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe		flags |= OS_O_DIRECT;
619d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason	if (td->o.oatomic) {
620d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason		if (!FIO_O_ATOMIC) {
621d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason			td_verror(td, EINVAL, "OS does not support atomic IO");
622d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason			return 1;
623d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason		}
624d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason		flags |= OS_O_DIRECT | FIO_O_ATOMIC;
625d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason	}
6262dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	if (td->o.sync_io)
6272fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe		flags |= O_SYNC;
628eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	if (td->o.create_on_open && td->o.allow_create)
629814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe		flags |= O_CREAT;
6306eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Liskip_flags:
6316eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	if (f->filetype != FIO_TYPE_FILE)
6326eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li		flags |= FIO_O_NOATIME;
63353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
634056f3459149a7670257350d84b49858718e4a0e6Aaron Carrollopen_again:
635660a1cb5fb9843ec09a04337714e78d63cd557e7Jens Axboe	if (td_write(td)) {
636173081581f94dc4f9f203eb7a7922fc843bfafdeJens Axboe		if (!read_only)
637173081581f94dc4f9f203eb7a7922fc843bfafdeJens Axboe			flags |= O_RDWR;
63853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
639eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		if (f->filetype == FIO_TYPE_FILE && td->o.allow_create)
6402fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe			flags |= O_CREAT;
6412fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe
642661598287ecc3b8987f312cf8403936552ce686aJens Axboe		if (is_std)
643661598287ecc3b8987f312cf8403936552ce686aJens Axboe			f->fd = dup(STDOUT_FILENO);
6444d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		else
6454d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe			from_hash = file_lookup_open(f, flags);
6466eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	} else if (td_read(td)) {
6474241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe		if (f->filetype == FIO_TYPE_CHAR && !read_only)
6482fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe			flags |= O_RDWR;
6492fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe		else
6502fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe			flags |= O_RDONLY;
6512fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe
652661598287ecc3b8987f312cf8403936552ce686aJens Axboe		if (is_std)
653661598287ecc3b8987f312cf8403936552ce686aJens Axboe			f->fd = dup(STDIN_FILENO);
6544d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		else
6554d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe			from_hash = file_lookup_open(f, flags);
656eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	} else if (td_trim(td)) {
657eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		assert(!td_rw(td)); /* should have matched above */
6586eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li		flags |= O_RDWR;
6596eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li		from_hash = file_lookup_open(f, flags);
66053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
66153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
66253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (f->fd == -1) {
663e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe		char buf[FIO_VERROR_SIZE];
664e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		int __e = errno;
665e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe
666835d9b9ed0e5c2591b8a3eacbd5f4ab6bdab466cJens Axboe		if (__e == EPERM && (flags & FIO_O_NOATIME)) {
6675921e80c5dfc9f96d2f21da6ae58f2b5d3a0b373Jens Axboe			flags &= ~FIO_O_NOATIME;
668056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll			goto open_again;
669056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll		}
670e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe		if (__e == EMFILE && file_close_shadow_fds(td))
671e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe			goto open_again;
672056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll
67398ffb8f3ecebed9984d1744f142eb8be10c14dbdKen Raeburn		snprintf(buf, sizeof(buf), "open(%s)", f->file_name);
674e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe
675a93c5f049da63a60f9962177d8ada50094d234deJens Axboe		if (__e == EINVAL && (flags & OS_O_DIRECT)) {
676a93c5f049da63a60f9962177d8ada50094d234deJens Axboe			log_err("fio: looks like your file system does not " \
677a93c5f049da63a60f9962177d8ada50094d234deJens Axboe				"support direct=1/buffered=0\n");
678a93c5f049da63a60f9962177d8ada50094d234deJens Axboe		}
679a93c5f049da63a60f9962177d8ada50094d234deJens Axboe
680e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe		td_verror(td, __e, buf);
68134329ca61aaf3be246a4a9d69412a1f3cdccee42Andreas Gruenbacher		return 1;
68253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
68353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
68429c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe	if (!from_hash && f->fd != -1) {
68529c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe		if (add_file_hash(f)) {
6863f0ca9b914e6d0db8c5c457713c277ce458cbc02Jens Axboe			int fio_unused ret;
68729c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe
68829c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe			/*
689e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe			 * Stash away descriptor for later close. This is to
690e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe			 * work-around a "feature" on Linux, where a close of
691e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe			 * an fd that has been opened for write will trigger
692e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe			 * udev to call blkid to check partitions, fs id, etc.
693de8f6de97438d5664cd8765e60102b9109a273e2Anatol Pomozov			 * That pollutes the device cache, which can slow down
694e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe			 * unbuffered accesses.
69529c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe			 */
696e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe			if (f->shadow_fd == -1)
697e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe				f->shadow_fd = f->fd;
698e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe			else {
699e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe				/*
700e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe			 	 * OK to ignore, we haven't done anything
701e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe				 * with it
702e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe				 */
703e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe				ret = generic_close_file(td, f);
704e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe			}
70529c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe			goto open_again;
70629c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe		}
70729c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe	}
7084906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe
70953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
710b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe}
711b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe
712eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes/*
713eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * This function i.e. get_file_size() is the default .get_file_size
714eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * implementation of majority of I/O engines.
715eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes */
716df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboeint generic_get_file_size(struct thread_data *td, struct fio_file *f)
71721972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe{
718df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe	return get_file_size(td, f);
71921972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe}
72021972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe
7217bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe/*
7227bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * open/close all files, so that ->real_file_size gets set
7237bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */
724bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboestatic int get_file_sizes(struct thread_data *td)
7257bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe{
7267bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	struct fio_file *f;
7277bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	unsigned int i;
728bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe	int err = 0;
7297bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
7307bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	for_each_file(td, f, i) {
731eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		dprint(FD_FILE, "get file size for %p/%d/%s\n", f, i,
7325ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe								f->file_name);
7339efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe
73499a47c6905731e53dd4d8f7ea6501f36d9329e7bJens Axboe		if (td_io_get_file_size(td, f)) {
73540b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe			if (td->error != ENOENT) {
73640b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe				log_err("%s\n", td->verror);
73740b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe				err = 1;
73834329ca61aaf3be246a4a9d69412a1f3cdccee42Andreas Gruenbacher				break;
73940b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe			}
740541d66d70b8fbe9860b31307c0760e6d5f4c78a8Jens Axboe			clear_error(td);
74107eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe		}
742409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe
743eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		/*
744eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		 * There are corner cases where we end up with -1 for
745eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		 * ->real_file_size due to unsupported file type, etc.
746eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		 * We then just set to size option value divided by number
747eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		 * of files, similar to the way file ->io_size is set.
748eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		 * stat(2) failure doesn't set ->real_file_size to -1.
749eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		 */
750409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe		if (f->real_file_size == -1ULL && td->o.size)
751409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe			f->real_file_size = td->o.size / td->o.nr_files;
7527bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
753bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe
754bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe	return err;
7557bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe}
7567bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
7572e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboestruct fio_mount {
7582e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	struct flist_head list;
7592e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	const char *base;
7602e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	char __base[256];
7612e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	unsigned int key;
7622e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe};
7632e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
7642e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe/*
7652e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe * Get free number of bytes for each file on each unique mount.
7662e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe */
7672e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboestatic unsigned long long get_fs_free_counts(struct thread_data *td)
7682e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe{
7692e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	struct flist_head *n, *tmp;
77068b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe	unsigned long long ret = 0;
7712e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	struct fio_mount *fm;
7722e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	FLIST_HEAD(list);
7732e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	struct fio_file *f;
7742e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	unsigned int i;
7752e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
7762e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	for_each_file(td, f, i) {
7772e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		struct stat sb;
7782e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		char buf[256];
7792e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
780eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		if (f->filetype == FIO_TYPE_BLOCK || f->filetype == FIO_TYPE_CHAR) {
7814ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe			if (f->real_file_size != -1ULL)
7824ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe				ret += f->real_file_size;
78368b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe			continue;
78468b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe		} else if (f->filetype != FIO_TYPE_FILE)
78568b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe			continue;
78668b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe
787da27a4bf0f9753fcc9da7b63f1be482fc0349907Jens Axboe		buf[255] = '\0';
788da27a4bf0f9753fcc9da7b63f1be482fc0349907Jens Axboe		strncpy(buf, f->file_name, 255);
7892e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
7902e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		if (stat(buf, &sb) < 0) {
7912e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			if (errno != ENOENT)
7922e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe				break;
7932e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			strcpy(buf, ".");
7942e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			if (stat(buf, &sb) < 0)
7952e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe				break;
7962e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		}
7972e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
7982e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		fm = NULL;
7992e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		flist_for_each(n, &list) {
8002e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			fm = flist_entry(n, struct fio_mount, list);
8012e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			if (fm->key == sb.st_dev)
8022e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe				break;
8032e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
8042e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			fm = NULL;
8052e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		}
8062e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
8072e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		if (fm)
8082e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			continue;
8092e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
8103660ceae229f08b4086279be7c82e86926f0304bJens Axboe		fm = calloc(1, sizeof(*fm));
8113660ceae229f08b4086279be7c82e86926f0304bJens Axboe		strncpy(fm->__base, buf, sizeof(fm->__base) - 1);
8122e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		fm->base = basename(fm->__base);
8132e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		fm->key = sb.st_dev;
8142e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		flist_add(&fm->list, &list);
8152e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	}
8162e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
8172e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	flist_for_each_safe(n, tmp, &list) {
8182e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		unsigned long long sz;
8192e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
8202e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		fm = flist_entry(n, struct fio_mount, list);
8212e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		flist_del(&fm->list);
8222e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
823eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		sz = get_fs_free_size(fm->base);
8242e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		if (sz && sz != -1ULL)
8252e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			ret += sz;
8262e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
8272e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		free(fm);
8282e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	}
8292e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
8302e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	return ret;
8312e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe}
8322e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
833bedc9dc24223bb33be4120f4a57718bc54888ca5Jens Axboeuint64_t get_start_offset(struct thread_data *td, struct fio_file *f)
834ce95d651568bd5494e4c4ddc95832715c6760d56Dan Ehrenberg{
835bedc9dc24223bb33be4120f4a57718bc54888ca5Jens Axboe	struct thread_options *o = &td->o;
836bedc9dc24223bb33be4120f4a57718bc54888ca5Jens Axboe
837bedc9dc24223bb33be4120f4a57718bc54888ca5Jens Axboe	if (o->file_append && f->filetype == FIO_TYPE_FILE)
838bedc9dc24223bb33be4120f4a57718bc54888ca5Jens Axboe		return f->real_file_size;
839bedc9dc24223bb33be4120f4a57718bc54888ca5Jens Axboe
840ce95d651568bd5494e4c4ddc95832715c6760d56Dan Ehrenberg	return td->o.start_offset +
8415a65b4e4ce51be2144abaf47635e20a0ebf684ecJiri Horky		td->subjob_number * td->o.offset_increment;
842ce95d651568bd5494e4c4ddc95832715c6760d56Dan Ehrenberg}
843ce95d651568bd5494e4c4ddc95832715c6760d56Dan Ehrenberg
8447bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe/*
8457bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * Open the files and setup files sizes, creating files if necessary.
8467bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */
84753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboeint setup_files(struct thread_data *td)
84853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
8497bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	unsigned long long total_size, extend_size;
850de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe	struct thread_options *o = &td->o;
85153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	struct fio_file *f;
852002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe	unsigned int i, nr_fs_extra = 0;
853000b080395e45cbe0ce54e75f0e993addbdc8676Jens Axboe	int err = 0, need_extend;
854e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe	int old_state;
855002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe	const unsigned int bs = td_min_bs(td);
856002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe	uint64_t fs = 0;
85753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
858ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "setup files\n");
859ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
8608edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe	old_state = td_bump_runstate(td, TD_SETTING_UP);
861e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe
862de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe	if (o->read_iolog_file)
86325460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboe		goto done;
864691c8fb014da9dd82e999a90b5511423f4eee188Jens Axboe
86553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	/*
866eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	 * Find out physical size of files or devices for this thread,
867eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	 * before we determine I/O size and range of our targets.
868eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	 * If ioengine defines a setup() method, it's responsible for
8697bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * opening the files and setting f->real_file_size to indicate
8707bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * the valid range for that file.
87153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	 */
87253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (td->io_ops->setup)
8737bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		err = td->io_ops->setup(td);
8747bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	else
875bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe		err = get_file_sizes(td);
87653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
877f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe	if (err)
878e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe		goto err_out;
879f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe
8800a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe	/*
8817bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * check sizes. if the files/devices do not exist and the size
8827bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * isn't passed to fio, abort.
8830a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe	 */
8847bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	total_size = 0;
8857bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	for_each_file(td, f, i) {
886eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		f->fileno = i;
8877bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		if (f->real_file_size == -1ULL)
8887bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			total_size = -1ULL;
8897bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		else
8907bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			total_size += f->real_file_size;
8917bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
8920a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe
893de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe	if (o->fill_device)
8942e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		td->fill_device_size = get_fs_free_counts(td);
8952e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
8967bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	/*
8977bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * device/file sizes are zero and no size given, punt
8987bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 */
899de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe	if ((!total_size || total_size == -1ULL) && !o->size &&
900eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	    !td_ioengine_flagged(td, FIO_NOIO) && !o->fill_device &&
901de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe	    !(o->nr_files && (o->file_size_low || o->file_size_high))) {
902de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe		log_err("%s: you need to specify size=\n", o->name);
903e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, EINVAL, "total_file_size");
904e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe		goto err_out;
90553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
90653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
9077bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	/*
908002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe	 * Calculate per-file size and potential extra size for the
909eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	 * first files, if needed (i.e. if we don't have a fixed size).
910002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe	 */
911d1e78e6b0429bac92794fb6f1c24b5078c68da6dJens Axboe	if (!o->file_size_low && o->nr_files) {
912002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe		uint64_t all_fs;
913002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe
914002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe		fs = o->size / o->nr_files;
915002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe		all_fs = fs * o->nr_files;
916002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe
917002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe		if (all_fs < o->size)
918002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe			nr_fs_extra = (o->size - all_fs) / bs;
919002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe	}
920002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe
921002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe	/*
9227bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * now file sizes are known, so we can set ->io_size. if size= is
9237bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * not given, ->io_size is just equal to ->real_file_size. if size
9247bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * is given, ->io_size is size / nr_files.
9257bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 */
9267bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	extend_size = total_size = 0;
9277bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	need_extend = 0;
9287bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	for_each_file(td, f, i) {
929bedc9dc24223bb33be4120f4a57718bc54888ca5Jens Axboe		f->file_offset = get_start_offset(td, f);
930bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang
931eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		/*
932eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		 * Update ->io_size depending on options specified.
933eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		 * ->file_size_low being 0 means filesize option isn't set.
934eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		 * Non zero ->file_size_low equals ->file_size_high means
935eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		 * filesize option is set in a fixed size format.
936eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		 * Non zero ->file_size_low not equals ->file_size_high means
937eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		 * filesize option is set in a range format.
938eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		 */
939de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe		if (!o->file_size_low) {
9407bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			/*
941eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			 * no file size or range given, file size is equal to
942eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			 * total size divided by number of files. If the size
943002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe			 * doesn't divide nicely with the min blocksize,
944002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe			 * make the first files bigger.
9457bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 */
946002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe			f->io_size = fs;
947002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe			if (nr_fs_extra) {
948002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe				nr_fs_extra--;
949002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe				f->io_size += bs;
950002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe			}
951002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe
952eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			/*
953eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			 * We normally don't come here for regular files, but
954eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			 * if the result is 0 for a regular file, set it to the
955eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			 * real file size. This could be size of the existing
956eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			 * one if it already exists, but otherwise will be set
957eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			 * to 0. A new file won't be created because
958eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			 * ->io_size + ->file_offset equals ->real_file_size.
959eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			 */
960eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			if (!f->io_size) {
961eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes				if (f->file_offset > f->real_file_size)
962eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes					goto err_offset;
963273f8c912d981439049d9b21aa048aaeaa323c5dJens Axboe				f->io_size = f->real_file_size - f->file_offset;
964eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes				if (!f->io_size)
965eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes					log_info("fio: file %s may be ignored\n",
966eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes						f->file_name);
967eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			}
968de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe		} else if (f->real_file_size < o->file_size_low ||
969de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe			   f->real_file_size > o->file_size_high) {
970de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe			if (f->file_offset > o->file_size_low)
971bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang				goto err_offset;
9727bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			/*
9737bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * file size given. if it's fixed, use that. if it's a
9747bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * range, generate a random size in-between.
9757bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 */
976de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe			if (o->file_size_low == o->file_size_high)
977de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe				f->io_size = o->file_size_low - f->file_offset;
978de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe			else {
9795ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				f->io_size = get_rand_file_size(td)
9805ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe						- f->file_offset;
9815ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			}
98265bdb10a09222d8b5d213de74824be775772ea8fJens Axboe		} else
983bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang			f->io_size = f->real_file_size - f->file_offset;
98453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
9857bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		if (f->io_size == -1ULL)
9867bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			total_size = -1ULL;
9874d002569dc503474a53e824e3f72b10a09c9a2b5Shaohua Li		else {
988eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes                        if (o->size_percent) {
989eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes				f->io_size = (f->io_size * o->size_percent) / 100;
990eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes				f->io_size -= (f->io_size % td_min_bs(td));
991eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			}
9927bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			total_size += f->io_size;
9934d002569dc503474a53e824e3f72b10a09c9a2b5Shaohua Li		}
9947bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
9957bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		if (f->filetype == FIO_TYPE_FILE &&
996bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang		    (f->io_size + f->file_offset) > f->real_file_size &&
997eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		    !td_ioengine_flagged(td, FIO_DISKLESSIO)) {
998de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe			if (!o->create_on_open) {
999814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe				need_extend++;
1000814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe				extend_size += (f->io_size + f->file_offset);
1001eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes				fio_file_set_extend(f);
1002814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe			} else
1003814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe				f->real_file_size = f->io_size + f->file_offset;
10045ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		}
10057bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
100653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
1007eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	if (td->o.block_error_hist) {
1008eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		int len;
1009eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
1010eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		assert(td->o.nr_files == 1);	/* checked in fixup_options */
1011eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		f = td->files[0];
1012eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		len = f->io_size / td->o.bs[DDIR_TRIM];
1013eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		if (len > MAX_NR_BLOCK_INFOS || len <= 0) {
1014eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			log_err("fio: cannot calculate block histogram with "
1015eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes				"%d trim blocks, maximum %d\n",
1016eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes				len, MAX_NR_BLOCK_INFOS);
1017eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			td_verror(td, EINVAL, "block_error_hist");
1018eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			goto err_out;
1019eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		}
1020eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
1021eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		td->ts.nr_block_infos = len;
1022eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		for (i = 0; i < len; i++)
1023eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			td->ts.block_infos[i] =
1024eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes				BLOCK_INFO(0, BLOCK_STATE_UNINIT);
1025eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	} else
1026eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		td->ts.nr_block_infos = 0;
1027eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
1028a85066dcaf01cd3611b4c7c987357650cd7f08a6Jens Axboe	if (!o->size || (total_size && o->size > total_size))
1029de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe		o->size = total_size;
103021972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe
1031d1faa06dc74fcdcae02e70260c90121502ef01cfJens Axboe	if (o->size < td_min_bs(td)) {
1032d1faa06dc74fcdcae02e70260c90121502ef01cfJens Axboe		log_err("fio: blocksize too large for data set\n");
1033d1faa06dc74fcdcae02e70260c90121502ef01cfJens Axboe		goto err_out;
1034d1faa06dc74fcdcae02e70260c90121502ef01cfJens Axboe	}
1035d1faa06dc74fcdcae02e70260c90121502ef01cfJens Axboe
10367bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	/*
1037eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	 * See if we need to extend some files, typically needed when our
1038eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	 * target regular files don't exist yet, but our jobs require them
1039eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	 * initially due to read I/Os.
10407bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 */
10417bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (need_extend) {
10427bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		temp_stall_ts = 1;
1043eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		if (output_format & FIO_OUTPUT_NORMAL) {
1044eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			log_info("%s: Laying out IO file%s (%u file%s / %s%lluMiB)\n",
1045eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes				 o->name,
1046eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes				 need_extend > 1 ? "s" : "",
1047eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes				 need_extend,
1048eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes				 need_extend > 1 ? "s" : "",
1049eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes				 need_extend > 1 ? "total " : "",
1050eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes				 extend_size >> 20);
1051eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		}
10527bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
10537bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		for_each_file(td, f, i) {
10545e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			unsigned long long old_len = -1ULL, extend_len = -1ULL;
10553baddf2450d811be658fb47ef883ee84478dc352Jens Axboe
1056d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe			if (!fio_file_extend(f))
10577bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe				continue;
10587bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
1059409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe			assert(f->filetype == FIO_TYPE_FILE);
1060d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe			fio_file_clear_extend(f);
1061de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe			if (!o->fill_device) {
10625e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe				old_len = f->real_file_size;
10630b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe				extend_len = f->io_size + f->file_offset -
10640b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe						old_len;
10655e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			}
1066bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang			f->real_file_size = (f->io_size + f->file_offset);
10677bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			err = extend_file(td, f);
10687bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			if (err)
10693baddf2450d811be658fb47ef883ee84478dc352Jens Axboe				break;
10705e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe
10713baddf2450d811be658fb47ef883ee84478dc352Jens Axboe			err = __file_invalidate_cache(td, f, old_len,
10723baddf2450d811be658fb47ef883ee84478dc352Jens Axboe								extend_len);
10739824f73be5a03e683a236eb1ebe18f4656ac06b8Jens Axboe
10749824f73be5a03e683a236eb1ebe18f4656ac06b8Jens Axboe			/*
10759824f73be5a03e683a236eb1ebe18f4656ac06b8Jens Axboe			 * Shut up static checker
10769824f73be5a03e683a236eb1ebe18f4656ac06b8Jens Axboe			 */
10779824f73be5a03e683a236eb1ebe18f4656ac06b8Jens Axboe			if (f->fd != -1)
10789824f73be5a03e683a236eb1ebe18f4656ac06b8Jens Axboe				close(f->fd);
10799824f73be5a03e683a236eb1ebe18f4656ac06b8Jens Axboe
10803baddf2450d811be658fb47ef883ee84478dc352Jens Axboe			f->fd = -1;
10813baddf2450d811be658fb47ef883ee84478dc352Jens Axboe			if (err)
10827bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe				break;
10837bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		}
10847bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		temp_stall_ts = 0;
10857bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
10867bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
10877bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (err)
1088e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe		goto err_out;
10897bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
1090de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe	if (!o->zone_size)
1091de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe		o->zone_size = o->size;
10927bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
1093ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe	/*
1094ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe	 * iolog already set the total io size, if we read back
1095ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe	 * stored entries.
1096ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe	 */
109777731b29c35286a43ca6109ebf13389169ec20e9Jens Axboe	if (!o->read_iolog_file) {
1098eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		if (o->io_size)
1099eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			td->total_io_size = o->io_size * o->loops;
110077731b29c35286a43ca6109ebf13389169ec20e9Jens Axboe		else
110177731b29c35286a43ca6109ebf13389169ec20e9Jens Axboe			td->total_io_size = o->size * o->loops;
110277731b29c35286a43ca6109ebf13389169ec20e9Jens Axboe	}
110325460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboe
110425460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboedone:
1105de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe	if (o->create_only)
110625460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboe		td->done = 1;
110725460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboe
11088edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe	td_restore_runstate(td, old_state);
11097bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	return 0;
1110bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tangerr_offset:
1111de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe	log_err("%s: you need to specify valid offset=\n", o->name);
1112e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboeerr_out:
11138edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe	td_restore_runstate(td, old_state);
1114bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang	return 1;
111553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
111653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
1117afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanminint pre_read_files(struct thread_data *td)
1118afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin{
1119afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	struct fio_file *f;
1120afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	unsigned int i;
1121afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
1122afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	dprint(FD_FILE, "pre_read files\n");
1123afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
1124afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	for_each_file(td, f, i) {
1125eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		if (pre_read_file(td, f))
1126eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			return -1;
1127afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	}
1128afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
1129eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	return 0;
1130afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin}
1131afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
11329c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboestatic int __init_rand_distribution(struct thread_data *td, struct fio_file *f)
11339c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe{
11342316296a514711bb388d87b34742c04bb561d986Jens Axboe	unsigned int range_size, seed;
11359c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	unsigned long nranges;
11364d6922b77db7109369f0499506cf2cf7a62aba45Jens Axboe	uint64_t fsize;
11379c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe
11389c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	range_size = min(td->o.min_bs[DDIR_READ], td->o.min_bs[DDIR_WRITE]);
11394d6922b77db7109369f0499506cf2cf7a62aba45Jens Axboe	fsize = min(f->real_file_size, f->io_size);
11409c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe
11414d6922b77db7109369f0499506cf2cf7a62aba45Jens Axboe	nranges = (fsize + range_size - 1) / range_size;
11429c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe
11432316296a514711bb388d87b34742c04bb561d986Jens Axboe	seed = jhash(f->file_name, strlen(f->file_name), 0) * td->thread_number;
11448425687edef1b2961a17bd58341686f7b598cf28Jens Axboe	if (!td->o.rand_repeatable)
11458425687edef1b2961a17bd58341686f7b598cf28Jens Axboe		seed = td->rand_seeds[4];
11468425687edef1b2961a17bd58341686f7b598cf28Jens Axboe
11479c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	if (td->o.random_distribution == FIO_RAND_DIST_ZIPF)
1148888677a428eb6ae6b54195e99734d6d6b3ee55e7Jens Axboe		zipf_init(&f->zipf, nranges, td->o.zipf_theta.u.f, seed);
1149eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	else if (td->o.random_distribution == FIO_RAND_DIST_PARETO)
1150888677a428eb6ae6b54195e99734d6d6b3ee55e7Jens Axboe		pareto_init(&f->zipf, nranges, td->o.pareto_h.u.f, seed);
1151eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	else if (td->o.random_distribution == FIO_RAND_DIST_GAUSS)
1152eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		gauss_init(&f->gauss, nranges, td->o.gauss_dev.u.f, seed);
11539c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe
11549c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	return 1;
11559c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe}
11569c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe
11579c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboestatic int init_rand_distribution(struct thread_data *td)
11589c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe{
11599c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	struct fio_file *f;
11609c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	unsigned int i;
11619c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	int state;
11629c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe
11639c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	if (td->o.random_distribution == FIO_RAND_DIST_RANDOM)
11649c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe		return 0;
11659c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe
11668edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe	state = td_bump_runstate(td, TD_SETTING_UP);
11678edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe
11689c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	for_each_file(td, f, i)
11699c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe		__init_rand_distribution(td, f);
11708edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe
11718edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe	td_restore_runstate(td, state);
11729c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe
11739c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	return 1;
11749c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe}
11759c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe
1176eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes/*
1177eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * Check if the number of blocks exceeds the randomness capability of
1178eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * the selected generator. Tausworthe is 32-bit, the others are fullly
1179eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes * 64-bit capable.
1180eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes */
1181eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughesstatic int check_rand_gen_limits(struct thread_data *td, struct fio_file *f,
1182eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes				 uint64_t blocks)
1183eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes{
1184eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	if (blocks <= FRAND32_MAX)
1185eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		return 0;
1186eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	if (td->o.random_generator != FIO_RAND_GEN_TAUSWORTHE)
1187eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		return 0;
1188eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
1189eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	/*
1190eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	 * If the user hasn't specified a random generator, switch
1191eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	 * to tausworthe64 with informational warning. If the user did
1192eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	 * specify one, just warn.
1193eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	 */
1194eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	log_info("fio: file %s exceeds 32-bit tausworthe random generator.\n",
1195eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			f->file_name);
1196eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
1197eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	if (!fio_option_is_set(&td->o, random_generator)) {
1198eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		log_info("fio: Switching to tausworthe64. Use the "
1199eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			 "random_generator= option to get rid of this "
1200eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			 "warning.\n");
1201eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		td->o.random_generator = FIO_RAND_GEN_TAUSWORTHE64;
1202eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		return 0;
1203eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	}
1204eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
1205eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	/*
1206eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	 * Just make this information to avoid breaking scripts.
1207eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	 */
1208eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	log_info("fio: Use the random_generator= option to switch to lfsr or "
1209eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			 "tausworthe64.\n");
1210eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	return 0;
1211eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes}
1212eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
1213687270767de17dbad53c50e03e5d73d52505405cJens Axboeint init_random_map(struct thread_data *td)
1214687270767de17dbad53c50e03e5d73d52505405cJens Axboe{
121551ede0b1e9c9b570b942b50b44d0455183a0d5ecJens Axboe	unsigned long long blocks;
1216687270767de17dbad53c50e03e5d73d52505405cJens Axboe	struct fio_file *f;
1217687270767de17dbad53c50e03e5d73d52505405cJens Axboe	unsigned int i;
1218687270767de17dbad53c50e03e5d73d52505405cJens Axboe
12199c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	if (init_rand_distribution(td))
12209c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe		return 0;
12213831a843c289ab6a42a19752733d0fca4250882aJens Axboe	if (!td_random(td))
1222687270767de17dbad53c50e03e5d73d52505405cJens Axboe		return 0;
1223687270767de17dbad53c50e03e5d73d52505405cJens Axboe
1224687270767de17dbad53c50e03e5d73d52505405cJens Axboe	for_each_file(td, f, i) {
12254d6922b77db7109369f0499506cf2cf7a62aba45Jens Axboe		uint64_t fsize = min(f->real_file_size, f->io_size);
122638f30c81d8d194da047950cbbda3896bd35cd98cJens Axboe
12274d6922b77db7109369f0499506cf2cf7a62aba45Jens Axboe		blocks = fsize / (unsigned long long) td->o.rw_min_bs;
122853737ae01ca65f88089d3b8639df7be5b2f7ef0eJens Axboe
1229eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		if (check_rand_gen_limits(td, f, blocks))
1230eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			return 1;
1231eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
12328055e41d0ecc54770a2653427532b3e2c5fabdadJens Axboe		if (td->o.random_generator == FIO_RAND_GEN_LFSR) {
123382af46be1fa0c0e188bbb6723008fa33a510606fJens Axboe			unsigned long seed;
123482af46be1fa0c0e188bbb6723008fa33a510606fJens Axboe
123582af46be1fa0c0e188bbb6723008fa33a510606fJens Axboe			seed = td->rand_seeds[FIO_RAND_BLOCK_OFF];
12369c0f3f3279985b724c2f1358bb05cc2c795f2265Bruce Cran
1237d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe			if (!lfsr_init(&f->lfsr, blocks, seed, 0)) {
1238d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe				fio_file_set_lfsr(f);
12398055e41d0ecc54770a2653427532b3e2c5fabdadJens Axboe				continue;
1240d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe			}
12413831a843c289ab6a42a19752733d0fca4250882aJens Axboe		} else if (!td->o.norandommap) {
12427ebd796f4e50c21d652e62bf1e112755b0f338a8Jens Axboe			f->io_axmap = axmap_new(blocks);
1243d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe			if (f->io_axmap) {
1244d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe				fio_file_set_axmap(f);
12458055e41d0ecc54770a2653427532b3e2c5fabdadJens Axboe				continue;
1246d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe			}
12471cad7121e8e6c59440ae43545be05fa302e4110dJens Axboe		} else if (td->o.norandommap)
12481cad7121e8e6c59440ae43545be05fa302e4110dJens Axboe			continue;
1249ceadd59ef93421001530aa765d928e9e8c26b32eJens Axboe
12502b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe		if (!td->o.softrandommap) {
12515ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			log_err("fio: failed allocating random map. If running"
12525ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				" a large number of jobs, try the 'norandommap'"
12532b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe				" option or set 'softrandommap'. Or give"
12542b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe				" a larger --alloc-size to fio.\n");
1255687270767de17dbad53c50e03e5d73d52505405cJens Axboe			return 1;
1256687270767de17dbad53c50e03e5d73d52505405cJens Axboe		}
1257303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe
1258303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe		log_info("fio: file %s failed allocating random map. Running "
1259303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe			 "job without.\n", f->file_name);
1260687270767de17dbad53c50e03e5d73d52505405cJens Axboe	}
1261687270767de17dbad53c50e03e5d73d52505405cJens Axboe
1262687270767de17dbad53c50e03e5d73d52505405cJens Axboe	return 0;
1263687270767de17dbad53c50e03e5d73d52505405cJens Axboe}
1264687270767de17dbad53c50e03e5d73d52505405cJens Axboe
126553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboevoid close_files(struct thread_data *td)
126653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
12670ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe	struct fio_file *f;
1268af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	unsigned int i;
126953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
12702be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe	for_each_file(td, f, i) {
12712be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe		if (fio_file_open(f))
12722be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe			td_io_close_file(td, f);
12732be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe	}
127424ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe}
127524ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe
127624ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboevoid close_and_free_files(struct thread_data *td)
127724ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe{
127824ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe	struct fio_file *f;
127924ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe	unsigned int i;
128024ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe
1281ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "close files\n");
1282ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
12830ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe	for_each_file(td, f, i) {
12849187a269bf4539fa4b5b97a9b7439ba408d6b872Castor Fu		if (td->o.unlink && f->filetype == FIO_TYPE_FILE) {
12859187a269bf4539fa4b5b97a9b7439ba408d6b872Castor Fu			dprint(FD_FILE, "free unlink %s\n", f->file_name);
12869187a269bf4539fa4b5b97a9b7439ba408d6b872Castor Fu			td_io_unlink_file(td, f);
12879187a269bf4539fa4b5b97a9b7439ba408d6b872Castor Fu		}
12889187a269bf4539fa4b5b97a9b7439ba408d6b872Castor Fu
128922a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe		if (fio_file_open(f))
129022a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe			td_io_close_file(td, f);
129122a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe
1292b9fbcf2104ab79127825e0c23ba0a147ec076087Shaozhi Shawn Ye		remove_file_hash(f);
1293b3dc7f075b85e004f8c681ebb8566475017696f3Jens Axboe
1294b5f4d8baefc6eb3e13235b7d9042b7ffecdb23ddJens Axboe		if (td->o.unlink && f->filetype == FIO_TYPE_FILE) {
1295b5f4d8baefc6eb3e13235b7d9042b7ffecdb23ddJens Axboe			dprint(FD_FILE, "free unlink %s\n", f->file_name);
12969187a269bf4539fa4b5b97a9b7439ba408d6b872Castor Fu			td_io_unlink_file(td, f);
1297b5f4d8baefc6eb3e13235b7d9042b7ffecdb23ddJens Axboe		}
1298b5f4d8baefc6eb3e13235b7d9042b7ffecdb23ddJens Axboe
1299f17c43928c202e557f2f325272c60d9050ee528eJens Axboe		sfree(f->file_name);
1300fa1da8653e2177b3cc31a91e963c389f079d4172Jens Axboe		f->file_name = NULL;
1301d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe		if (fio_file_axmap(f)) {
1302d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe			axmap_free(f->io_axmap);
1303d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe			f->io_axmap = NULL;
1304d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe		}
130578d99e6a2695d3a7936c5dd02f996f13a30309b1Jens Axboe		sfree(f);
130653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
1307b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe
13082dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	td->o.filename = NULL;
1309cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	free(td->files);
1310d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe	free(td->file_locks);
13119efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe	td->files_index = 0;
1312b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe	td->files = NULL;
1313d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe	td->file_locks = NULL;
131427ddbfa09b22911d5cefb42a44f894e6eb48216eJens Axboe	td->o.file_lock_mode = FILE_LOCK_NONE;
13152dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	td->o.nr_files = 0;
131653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
1317af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
1318e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboestatic void get_file_type(struct fio_file *f)
1319af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe{
1320af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	struct stat sb;
1321af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
1322661598287ecc3b8987f312cf8403936552ce686aJens Axboe	if (!strcmp(f->file_name, "-"))
1323661598287ecc3b8987f312cf8403936552ce686aJens Axboe		f->filetype = FIO_TYPE_PIPE;
1324661598287ecc3b8987f312cf8403936552ce686aJens Axboe	else
1325661598287ecc3b8987f312cf8403936552ce686aJens Axboe		f->filetype = FIO_TYPE_FILE;
1326af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
1327eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes#ifdef WIN32
13283892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran	/* \\.\ is the device namespace in Windows, where every file is
13293892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran	 * a block device */
13303892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran	if (strncmp(f->file_name, "\\\\.\\", 4) == 0)
1331eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		f->filetype = FIO_TYPE_BLOCK;
1332eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes#endif
13333892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran
1334b30d395ec288508f9c787af11d0f52e9df26e39fJens Axboe	if (!stat(f->file_name, &sb)) {
13353892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran		if (S_ISBLK(sb.st_mode))
1336eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			f->filetype = FIO_TYPE_BLOCK;
1337af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe		else if (S_ISCHR(sb.st_mode))
1338af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe			f->filetype = FIO_TYPE_CHAR;
1339b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe		else if (S_ISFIFO(sb.st_mode))
1340b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe			f->filetype = FIO_TYPE_PIPE;
1341af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	}
1342af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe}
1343af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
1344eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughesstatic bool __is_already_allocated(const char *fname, bool set)
1345190b8f0c9c1c1a99ed26fd953f7af9023f9533eeCastor Fu{
134690426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	struct flist_head *entry;
1347eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	bool ret;
1348bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt
1349eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	ret = file_bloom_exists(fname, set);
1350eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	if (!ret)
1351eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		return ret;
135290426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe
135390426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	flist_for_each(entry, &filename_list) {
1354eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		struct file_name *fn;
135590426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe
1356eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		fn = flist_entry(entry, struct file_name, list);
1357eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
1358eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		if (!strcmp(fn->filename, fname))
1359eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			return true;
136090426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	}
136190426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe
1362eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	return false;
1363bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt}
1364bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt
1365eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughesstatic bool is_already_allocated(const char *fname)
1366bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt{
1367eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	bool ret;
1368bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt
136990426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	fio_file_hash_lock();
1370eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	ret = __is_already_allocated(fname, false);
137190426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	fio_file_hash_unlock();
1372eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
137390426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	return ret;
137490426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe}
1375bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt
137690426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboestatic void set_already_allocated(const char *fname)
137790426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe{
137890426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	struct file_name *fn;
137990426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe
138090426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	fn = malloc(sizeof(struct file_name));
138190426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	fn->filename = strdup(fname);
138290426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe
138390426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	fio_file_hash_lock();
1384eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	if (!__is_already_allocated(fname, true)) {
138590426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe		flist_add_tail(&fn->list, &filename_list);
138690426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe		fn = NULL;
1387bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt	}
138890426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	fio_file_hash_unlock();
1389bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt
139090426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	if (fn) {
139190426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe		free(fn->filename);
139290426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe		free(fn);
139390426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	}
1394bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt}
1395bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt
1396190b8f0c9c1c1a99ed26fd953f7af9023f9533eeCastor Fustatic void free_already_allocated(void)
1397190b8f0c9c1c1a99ed26fd953f7af9023f9533eeCastor Fu{
1398bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt	struct flist_head *entry, *tmp;
1399bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt	struct file_name *fn;
1400bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt
140190426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	if (flist_empty(&filename_list))
140290426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe		return;
140390426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe
140490426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	fio_file_hash_lock();
140590426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	flist_for_each_safe(entry, tmp, &filename_list) {
140690426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe		fn = flist_entry(entry, struct file_name, list);
140790426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe		free(fn->filename);
140890426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe		flist_del(&fn->list);
140990426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe		free(fn);
1410bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt	}
141190426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe
141290426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	fio_file_hash_unlock();
1413bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt}
1414bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt
14157b5cb700485518c2e7f2f49548319c89ba907195Jens Axboestatic struct fio_file *alloc_new_file(struct thread_data *td)
14167b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe{
14177b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe	struct fio_file *f;
14187b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe
14197b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe	f = smalloc(sizeof(*f));
14207b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe	if (!f) {
14217b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe		assert(0);
14227b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe		return NULL;
14237b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe	}
14247b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe
14257b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe	f->fd = -1;
14267b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe	f->shadow_fd = -1;
14277b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe	fio_file_reset(td, f);
14287b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe	return f;
14297b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe}
14307b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe
1431eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughesbool exists_and_not_regfile(const char *filename)
1432eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes{
1433eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	struct stat sb;
1434eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
1435eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	if (lstat(filename, &sb) == -1)
1436eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		return false;
1437eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
1438eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes#ifndef WIN32 /* NOT Windows */
1439eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	if (S_ISREG(sb.st_mode))
1440eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		return false;
1441eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes#else
1442eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	/* \\.\ is the device namespace in Windows, where every file
1443eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	 * is a device node */
1444eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	if (S_ISREG(sb.st_mode) && strncmp(filename, "\\\\.\\", 4) != 0)
1445eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		return false;
1446eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes#endif
1447eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
1448eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	return true;
1449eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes}
1450eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
14515903e7b7907854014478b6febfc5645a203ff59eJens Axboeint add_file(struct thread_data *td, const char *fname, int numjob, int inc)
1452af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe{
14537b4e4fe5e6fa26f82f9169c18ec70c08d0805ca9Jens Axboe	int cur_files = td->files_index;
1454bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe	char file_name[PATH_MAX];
1455af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	struct fio_file *f;
1456bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe	int len = 0;
1457af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
1458ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "add file %s\n", fname);
1459ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
1460bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt	if (td->o.directory)
1461eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		len = set_name_idx(file_name, PATH_MAX, td->o.directory, numjob,
1462eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes					td->o.unique_filename);
1463bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt
1464bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt	sprintf(file_name + len, "%s", fname);
1465bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt
1466bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt	/* clean cloned siblings using existing files */
1467eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	if (numjob && is_already_allocated(file_name) &&
1468eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	    !exists_and_not_regfile(fname))
1469bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt		return 0;
1470bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt
14717b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe	f = alloc_new_file(td);
1472bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe
1473fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe	if (td->files_size <= td->files_index) {
14741983e3271c20a5dca84ac1ad872e44dd9e62e6b8Jianpeng Ma		unsigned int new_size = td->o.nr_files + 1;
1475126d65c6fc97d6acdc568aa5a969c012018daf15Jens Axboe
1476fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe		dprint(FD_FILE, "resize file array to %d files\n", new_size);
1477fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe
1478fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe		td->files = realloc(td->files, new_size * sizeof(f));
1479d537c08b0eacdeb05835ee8c5f269b872239713aJianpeng Ma		if (td->files == NULL) {
1480d537c08b0eacdeb05835ee8c5f269b872239713aJianpeng Ma			log_err("fio: realloc OOM\n");
1481d537c08b0eacdeb05835ee8c5f269b872239713aJianpeng Ma			assert(0);
1482d537c08b0eacdeb05835ee8c5f269b872239713aJianpeng Ma		}
1483d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe		if (td->o.file_lock_mode != FILE_LOCK_NONE) {
1484d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe			td->file_locks = realloc(td->file_locks, new_size);
1485d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe			if (!td->file_locks) {
1486d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe				log_err("fio: realloc OOM\n");
1487d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe				assert(0);
1488d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe			}
1489d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe			td->file_locks[cur_files] = FILE_LOCK_NONE;
1490d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe		}
1491fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe		td->files_size = new_size;
1492fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe	}
14938bb7679e73d3086a01b9d21a650b0d7a859412b6Jens Axboe	td->files[cur_files] = f;
149489ac1d48971578ccb0645c292d4a058340aeb909Shaohua Li	f->fileno = cur_files;
1495126d65c6fc97d6acdc568aa5a969c012018daf15Jens Axboe
149607eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe	/*
149707eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe	 * init function, io engine may not be loaded yet
149807eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe	 */
1499eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	if (td->io_ops && td_ioengine_flagged(td, FIO_DISKLESSIO))
150007eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe		f->real_file_size = -1ULL;
150107eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe
1502f17c43928c202e557f2f325272c60d9050ee528eJens Axboe	f->file_name = smalloc_strdup(file_name);
1503eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	if (!f->file_name)
1504c48c0be79173897824d8f439c39374f2588931dcJens Axboe		assert(0);
15050b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe
1506e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboe	get_file_type(f);
1507af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
15084d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	switch (td->o.file_lock_mode) {
15094d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	case FILE_LOCK_NONE:
15104d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		break;
15114d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	case FILE_LOCK_READWRITE:
1512d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe		f->rwlock = fio_rwlock_init();
15134d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		break;
15144d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	case FILE_LOCK_EXCLUSIVE:
1515521da527743088a9bd2ab882f8b64799d49d5848Jens Axboe		f->lock = fio_mutex_init(FIO_MUTEX_UNLOCKED);
15164d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		break;
15174d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	default:
15184d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		log_err("fio: unknown lock mode: %d\n", td->o.file_lock_mode);
15194d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		assert(0);
15204d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	}
152129c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe
15227b4e4fe5e6fa26f82f9169c18ec70c08d0805ca9Jens Axboe	td->files_index++;
15231549441cdfecb2c1a4a8b8d494253859d67b4344Jens Axboe	if (f->filetype == FIO_TYPE_FILE)
15241549441cdfecb2c1a4a8b8d494253859d67b4344Jens Axboe		td->nr_normal_files++;
1525f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
1526bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt	set_already_allocated(file_name);
1527bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt
15285903e7b7907854014478b6febfc5645a203ff59eJens Axboe	if (inc)
15295903e7b7907854014478b6febfc5645a203ff59eJens Axboe		td->o.nr_files++;
15305903e7b7907854014478b6febfc5645a203ff59eJens Axboe
15315ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe	dprint(FD_FILE, "file %p \"%s\" added at %d\n", f, f->file_name,
15325ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe							cur_files);
15339efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe
1534f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	return cur_files;
1535af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe}
15360ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe
153749ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboeint add_file_exclusive(struct thread_data *td, const char *fname)
153849ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe{
153949ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe	struct fio_file *f;
154049ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe	unsigned int i;
154149ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe
154249ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe	for_each_file(td, f, i) {
154349ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe		if (!strcmp(f->file_name, fname))
154449ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe			return i;
154549ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe	}
154649ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe
15475903e7b7907854014478b6febfc5645a203ff59eJens Axboe	return add_file(td, fname, 0, 1);
154849ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe}
154949ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe
15500ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboevoid get_file(struct fio_file *f)
15510ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe{
15528172fe972f3a79d42f34d7f6e259ed3f7f800316Jens Axboe	dprint(FD_FILE, "get file %s, ref=%d\n", f->file_name, f->references);
1553d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe	assert(fio_file_open(f));
15540ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	f->references++;
15550ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe}
15560ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe
15576977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboeint put_file(struct thread_data *td, struct fio_file *f)
15580ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe{
155998e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe	int f_ret = 0, ret = 0;
15606977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe
15618172fe972f3a79d42f34d7f6e259ed3f7f800316Jens Axboe	dprint(FD_FILE, "put file %s, ref=%d\n", f->file_name, f->references);
1562ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
156322a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe	if (!fio_file_open(f)) {
156422a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe		assert(f->fd == -1);
15656977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe		return 0;
156622a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe	}
15670ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe
15680ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	assert(f->references);
15690ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	if (--f->references)
15706977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe		return 0;
15710ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe
157271b84caab6ef5ddbc7893e3268887b8ff0516f75Jens Axboe	if (should_fsync(td) && td->o.fsync_on_close) {
157398e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe		f_ret = fsync(f->fd);
157471b84caab6ef5ddbc7893e3268887b8ff0516f75Jens Axboe		if (f_ret < 0)
157571b84caab6ef5ddbc7893e3268887b8ff0516f75Jens Axboe			f_ret = errno;
157671b84caab6ef5ddbc7893e3268887b8ff0516f75Jens Axboe	}
1577ebb1415f729c123b8a13bcbd667bf4b4cc95b4d4Jens Axboe
15780ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	if (td->io_ops->close_file)
15796977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe		ret = td->io_ops->close_file(td, f);
15801020a139beff50faf1bb18f761b024b664a09e14Jens Axboe
158198e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe	if (!ret)
1582a5fb461fdff86c442daeebbd28e07984be9f3807Jens Axboe		ret = f_ret;
158398e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe
15840ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	td->nr_open_files--;
1585d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe	fio_file_clear_open(f);
158622a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe	assert(f->fd == -1);
15876977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe	return ret;
15880ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe}
1589bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
15904d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid lock_file(struct thread_data *td, struct fio_file *f, enum fio_ddir ddir)
1591b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe{
15924d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (!f->lock || td->o.file_lock_mode == FILE_LOCK_NONE)
15934d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		return;
159429c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe
15954d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (td->o.file_lock_mode == FILE_LOCK_READWRITE) {
15964d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		if (ddir == DDIR_READ)
1597d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe			fio_rwlock_read(f->rwlock);
15984d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		else
1599d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe			fio_rwlock_write(f->rwlock);
16004d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	} else if (td->o.file_lock_mode == FILE_LOCK_EXCLUSIVE)
16014d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		fio_mutex_down(f->lock);
16024d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
1603d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe	td->file_locks[f->fileno] = td->o.file_lock_mode;
1604b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe}
1605b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe
16064d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid unlock_file(struct thread_data *td, struct fio_file *f)
1607b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe{
16084d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (!f->lock || td->o.file_lock_mode == FILE_LOCK_NONE)
16094d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		return;
16104d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
1611d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe	if (td->o.file_lock_mode == FILE_LOCK_READWRITE)
1612d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe		fio_rwlock_unlock(f->rwlock);
1613d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe	else if (td->o.file_lock_mode == FILE_LOCK_EXCLUSIVE)
16144d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		fio_mutex_up(f->lock);
1615d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe
1616d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe	td->file_locks[f->fileno] = FILE_LOCK_NONE;
1617b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe}
1618b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe
16194d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid unlock_file_all(struct thread_data *td, struct fio_file *f)
16204d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe{
1621f2a2803a4982a1516eb75d9f98de68cf21d1ae7dJens Axboe	if (td->o.file_lock_mode == FILE_LOCK_NONE || !td->file_locks)
162227ddbfa09b22911d5cefb42a44f894e6eb48216eJens Axboe		return;
1623d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe	if (td->file_locks[f->fileno] != FILE_LOCK_NONE)
1624d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe		unlock_file(td, f);
16254d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe}
16264d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
1627bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboestatic int recurse_dir(struct thread_data *td, const char *dirname)
1628bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe{
1629bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	struct dirent *dir;
1630bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	int ret = 0;
1631bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	DIR *D;
1632bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1633bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	D = opendir(dirname);
1634bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	if (!D) {
16350ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		char buf[FIO_VERROR_SIZE];
16360ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe
163798ffb8f3ecebed9984d1744f142eb8be10c14dbdKen Raeburn		snprintf(buf, FIO_VERROR_SIZE, "opendir(%s)", dirname);
16380ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		td_verror(td, errno, buf);
1639bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		return 1;
1640bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	}
1641bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1642bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	while ((dir = readdir(D)) != NULL) {
1643bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		char full_path[PATH_MAX];
1644bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		struct stat sb;
1645bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1646e85b2b83e39b64ba5cb73fbfddbf3902b6e84925Jens Axboe		if (!strcmp(dir->d_name, ".") || !strcmp(dir->d_name, ".."))
1647e85b2b83e39b64ba5cb73fbfddbf3902b6e84925Jens Axboe			continue;
164896d32d518a0743a6c050057bc1562e4883e51c5dJens Axboe
1649b9fd788f0e8adacc33316107594e9eb0463743d7Bruce Cran		sprintf(full_path, "%s%s%s", dirname, FIO_OS_PATH_SEPARATOR, dir->d_name);
1650bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1651bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		if (lstat(full_path, &sb) == -1) {
1652bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			if (errno != ENOENT) {
1653bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe				td_verror(td, errno, "stat");
165468ace9e00ca481d101f9937461402b83e8895ba2Jens Axboe				ret = 1;
165568ace9e00ca481d101f9937461402b83e8895ba2Jens Axboe				break;
1656bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			}
1657bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		}
1658bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1659bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		if (S_ISREG(sb.st_mode)) {
16605903e7b7907854014478b6febfc5645a203ff59eJens Axboe			add_file(td, full_path, 0, 1);
1661bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			continue;
1662bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		}
16630ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		if (!S_ISDIR(sb.st_mode))
16640ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe			continue;
1665bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
16665ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		ret = recurse_dir(td, full_path);
16675ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		if (ret)
1668bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			break;
1669bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	}
1670bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1671bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	closedir(D);
1672bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	return ret;
1673bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe}
1674bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1675bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboeint add_dir_files(struct thread_data *td, const char *path)
1676bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe{
16770ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe	int ret = recurse_dir(td, path);
16780ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe
16790ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe	if (!ret)
16800ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		log_info("fio: opendir added %d files\n", td->o.nr_files);
16810ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe
16820ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe	return ret;
1683bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe}
1684cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe
1685cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboevoid dup_files(struct thread_data *td, struct thread_data *org)
1686cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe{
1687cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	struct fio_file *f;
1688cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	unsigned int i;
16899efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe
16909efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe	dprint(FD_FILE, "dup files: %d\n", org->files_index);
1691cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe
1692cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	if (!org->files)
1693cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe		return;
1694cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe
16959efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe	td->files = malloc(org->files_index * sizeof(f));
1696cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe
1697d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe	if (td->o.file_lock_mode != FILE_LOCK_NONE)
1698d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe		td->file_locks = malloc(org->files_index);
1699d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe
17009efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe	for_each_file(org, f, i) {
1701b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe		struct fio_file *__f;
1702b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe
17037b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe		__f = alloc_new_file(td);
17040b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe
1705bc3456fa06cc7777c4764da8c7b1c0fd0a3c3772Aaron Carroll		if (f->file_name) {
1706f17c43928c202e557f2f325272c60d9050ee528eJens Axboe			__f->file_name = smalloc_strdup(f->file_name);
1707eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			if (!__f->file_name)
1708c48c0be79173897824d8f439c39374f2588931dcJens Axboe				assert(0);
17090b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe
1710bc3456fa06cc7777c4764da8c7b1c0fd0a3c3772Aaron Carroll			__f->filetype = f->filetype;
1711bc3456fa06cc7777c4764da8c7b1c0fd0a3c3772Aaron Carroll		}
1712b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe
171367ad92428bb19008354ca20e614050241e9f17e7Jens Axboe		if (td->o.file_lock_mode == FILE_LOCK_EXCLUSIVE)
171467ad92428bb19008354ca20e614050241e9f17e7Jens Axboe			__f->lock = f->lock;
171567ad92428bb19008354ca20e614050241e9f17e7Jens Axboe		else if (td->o.file_lock_mode == FILE_LOCK_READWRITE)
171667ad92428bb19008354ca20e614050241e9f17e7Jens Axboe			__f->rwlock = f->rwlock;
171767ad92428bb19008354ca20e614050241e9f17e7Jens Axboe
1718b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe		td->files[i] = __f;
1719cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	}
1720cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe}
1721f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
1722f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe/*
1723f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe * Returns the index that matches the filename, or -1 if not there
1724f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe */
1725f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboeint get_fileno(struct thread_data *td, const char *fname)
1726f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe{
1727f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	struct fio_file *f;
1728f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	unsigned int i;
1729f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
1730f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	for_each_file(td, f, i)
1731f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe		if (!strcmp(f->file_name, fname))
1732f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe			return i;
1733f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
1734f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	return -1;
1735f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe}
1736f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
1737f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe/*
1738f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe * For log usage, where we add/open/close files automatically
1739f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe */
1740f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboevoid free_release_files(struct thread_data *td)
1741f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe{
1742f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	close_files(td);
17434c8e9f3a32ad0a1bc8bbc85b0cfe43e73a120753Jens Axboe	td->o.nr_files = 0;
17444c8e9f3a32ad0a1bc8bbc85b0cfe43e73a120753Jens Axboe	td->o.open_files = 0;
1745f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	td->files_index = 0;
1746f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	td->nr_normal_files = 0;
1747f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe}
174833c48814e08cf961801bf37f759da2748eb3431bJens Axboe
174933c48814e08cf961801bf37f759da2748eb3431bJens Axboevoid fio_file_reset(struct thread_data *td, struct fio_file *f)
175033c48814e08cf961801bf37f759da2748eb3431bJens Axboe{
175108a99bed133fdd5dd6ef87c8638b45b135b10a8eJens Axboe	int i;
175208a99bed133fdd5dd6ef87c8638b45b135b10a8eJens Axboe
175308a99bed133fdd5dd6ef87c8638b45b135b10a8eJens Axboe	for (i = 0; i < DDIR_RWDIR_CNT; i++) {
175408a99bed133fdd5dd6ef87c8638b45b135b10a8eJens Axboe		f->last_pos[i] = f->file_offset;
175508a99bed133fdd5dd6ef87c8638b45b135b10a8eJens Axboe		f->last_start[i] = -1ULL;
175608a99bed133fdd5dd6ef87c8638b45b135b10a8eJens Axboe	}
175708a99bed133fdd5dd6ef87c8638b45b135b10a8eJens Axboe
1758d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe	if (fio_file_axmap(f))
175933c48814e08cf961801bf37f759da2748eb3431bJens Axboe		axmap_reset(f->io_axmap);
1760d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe	else if (fio_file_lfsr(f))
176133c48814e08cf961801bf37f759da2748eb3431bJens Axboe		lfsr_reset(&f->lfsr, td->rand_seeds[FIO_RAND_BLOCK_OFF]);
176233c48814e08cf961801bf37f759da2748eb3431bJens Axboe}
1763002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe
1764eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughesbool fio_files_done(struct thread_data *td)
1765002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe{
1766002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe	struct fio_file *f;
1767002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe	unsigned int i;
1768002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe
1769002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe	for_each_file(td, f, i)
1770002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe		if (!fio_file_done(f))
1771eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			return false;
1772002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe
1773eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	return true;
1774002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe}
1775bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt
1776bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt/* free memory used in initialization phase only */
1777190b8f0c9c1c1a99ed26fd953f7af9023f9533eeCastor Fuvoid filesetup_mem_free(void)
1778190b8f0c9c1c1a99ed26fd953f7af9023f9533eeCastor Fu{
1779bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt	free_already_allocated();
1780bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt}
1781