filesetup.c revision 3e10fb832645e3ab3ef006f589f0459dc567cb53
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"
14ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran#include "os/os.h"
152316296a514711bb388d87b34742c04bb561d986Jens Axboe#include "hash.h"
167ebd796f4e50c21d652e62bf1e112755b0f338a8Jens Axboe#include "lib/axmap.h"
1753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
1897ac992c99d89eed8cdf9249bb038ac4d7b709b9Jens Axboe#ifdef CONFIG_LINUX_FALLOCATE
19a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou#include <linux/falloc.h>
20a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou#endif
21a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou
227172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboestatic int root_warn;
237172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe
24c592b9fe12d4739d99d5bece517e304804876df6Jens Axboestatic inline void clear_error(struct thread_data *td)
25c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe{
26c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe	td->error = 0;
27c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe	td->verror[0] = '\0';
28c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe}
29c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe
303baddf2450d811be658fb47ef883ee84478dc352Jens Axboe/*
313baddf2450d811be658fb47ef883ee84478dc352Jens Axboe * Leaves f->fd open on success, caller must close
323baddf2450d811be658fb47ef883ee84478dc352Jens Axboe */
337bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboestatic int extend_file(struct thread_data *td, struct fio_file *f)
3425205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe{
35ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe	int r, new_layout = 0, unlink_file = 0, flags;
3625205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe	unsigned long long left;
3725205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe	unsigned int bs;
3825205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe	char *b;
39b2a151925a91f38aeb298d693687a47269ad4e94Jens Axboe
404241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe	if (read_only) {
414241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe		log_err("fio: refusing extend of file due to read-only\n");
424241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe		return 0;
434241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe	}
444241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe
45507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	/*
46507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	 * check if we need to lay the file out complete again. fio
47507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	 * does that for operations involving reads, or for writes
48507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	 * where overwrite is set
49507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	 */
50ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe	if (td_read(td) || (td_write(td) && td->o.overwrite) ||
51ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe	    (td_write(td) && td->io_ops->flags & FIO_NOEXTEND))
52507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe		new_layout = 1;
53ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe	if (td_write(td) && !td->o.overwrite)
54ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe		unlink_file = 1;
55507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe
566ae1f57f2cb8661b97b770372eeb3694f6d5a744Jens Axboe	if (unlink_file || new_layout) {
57bd199f2b98eeb9101795e40fdef5889c630178c1Jens Axboe		dprint(FD_FILE, "layout unlink %s\n", f->file_name);
58982016d689dc7fedbb09646ba0df7e72a781b164Zhang, Yanmin		if ((unlink(f->file_name) < 0) && (errno != ENOENT)) {
597bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			td_verror(td, errno, "unlink");
607bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			return 1;
617bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		}
627bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
637bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
64507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	flags = O_WRONLY | O_CREAT;
65507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	if (new_layout)
66507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe		flags |= O_TRUNC;
67507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe
68ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "open file %s, flags %x\n", f->file_name, flags);
69507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	f->fd = open(f->file_name, flags, 0644);
7053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (f->fd < 0) {
71e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, errno, "open");
7253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return 1;
7353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
7453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
7597ac992c99d89eed8cdf9249bb038ac4d7b709b9Jens Axboe#ifdef CONFIG_POSIX_FALLOCATE
76a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou	if (!td->o.fill_device) {
77a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou		switch (td->o.fallocate_mode) {
78a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou		case FIO_FALLOCATE_NONE:
79a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			break;
80a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou		case FIO_FALLOCATE_POSIX:
81a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			dprint(FD_FILE, "posix_fallocate file %s size %llu\n",
824b91ee8fd12c72bd76ce9f5ff9116626b48566a0Jens Axboe				 f->file_name,
834b91ee8fd12c72bd76ce9f5ff9116626b48566a0Jens Axboe				 (unsigned long long) f->real_file_size);
84a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou
85a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			r = posix_fallocate(f->fd, 0, f->real_file_size);
86a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			if (r > 0) {
87a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou				log_err("fio: posix_fallocate fails: %s\n",
88a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou						strerror(r));
89a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			}
90a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			break;
9197ac992c99d89eed8cdf9249bb038ac4d7b709b9Jens Axboe#ifdef CONFIG_LINUX_FALLOCATE
92a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou		case FIO_FALLOCATE_KEEP_SIZE:
93a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			dprint(FD_FILE,
94a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou				"fallocate(FALLOC_FL_KEEP_SIZE) "
954b91ee8fd12c72bd76ce9f5ff9116626b48566a0Jens Axboe				"file %s size %llu\n", f->file_name,
964b91ee8fd12c72bd76ce9f5ff9116626b48566a0Jens Axboe				(unsigned long long) f->real_file_size);
977bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe
98a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			r = fallocate(f->fd, FALLOC_FL_KEEP_SIZE, 0,
99a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou					f->real_file_size);
100888677a428eb6ae6b54195e99734d6d6b3ee55e7Jens Axboe			if (r != 0)
101a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou				td_verror(td, errno, "fallocate");
102888677a428eb6ae6b54195e99734d6d6b3ee55e7Jens Axboe
103a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			break;
10497ac992c99d89eed8cdf9249bb038ac4d7b709b9Jens Axboe#endif /* CONFIG_LINUX_FALLOCATE */
105a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou		default:
106a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			log_err("fio: unknown fallocate mode: %d\n",
107a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou				td->o.fallocate_mode);
108a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			assert(0);
1097bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe		}
1107bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe	}
11197ac992c99d89eed8cdf9249bb038ac4d7b709b9Jens Axboe#endif /* CONFIG_POSIX_FALLOCATE */
1129b8365618309572d8fd2579c8ea3132db89f843fBruce Cran
113fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis	if (!new_layout)
114fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis		goto done;
115fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis
1165e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	/*
1175e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	 * The size will be -1ULL when fill_device is used, so don't truncate
1185e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	 * or fallocate this file, just write it
1195e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	 */
1205e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	if (!td->o.fill_device) {
1215e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe		dprint(FD_FILE, "truncate file %s, size %llu\n", f->file_name,
1224b91ee8fd12c72bd76ce9f5ff9116626b48566a0Jens Axboe					(unsigned long long) f->real_file_size);
1235e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe		if (ftruncate(f->fd, f->real_file_size) == -1) {
1245e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			td_verror(td, errno, "ftruncate");
1255e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			goto err;
1265e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe		}
1275e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	}
12840f8298cd252157fa15d93f8eb470116a94069a0Jens Axboe
1292dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	b = malloc(td->o.max_bs[DDIR_WRITE]);
13053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
1317bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	left = f->real_file_size;
13253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	while (left && !td->terminate) {
1332dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe		bs = td->o.max_bs[DDIR_WRITE];
13453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		if (bs > left)
13553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			bs = left;
13653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
137cc86c395fd9dd2002ec1edc0967b7c9453debdfbJens Axboe		fill_io_buffer(td, b, bs, bs);
138cc86c395fd9dd2002ec1edc0967b7c9453debdfbJens Axboe
13953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		r = write(f->fd, b, bs);
14053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
1415e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe		if (r > 0) {
1425e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			left -= r;
14353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			continue;
14453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		} else {
1455e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			if (r < 0) {
1465e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe				int __e = errno;
1475e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe
1485e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe				if (__e == ENOSPC) {
1495e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe					if (td->o.fill_device)
1505e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe						break;
1515e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe					log_info("fio: ENOSPC on laying out "
1525e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe						 "file, stopping\n");
1535e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe					break;
1545e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe				}
155e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe				td_verror(td, errno, "write");
1565e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			} else
157e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe				td_verror(td, EIO, "write");
15853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
15953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			break;
16053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		}
16153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
16253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
163ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe	if (td->terminate) {
164ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe		dprint(FD_FILE, "terminate unlink %s\n", f->file_name);
16553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		unlink(f->file_name);
166ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe	} else if (td->o.create_fsync) {
16798e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe		if (fsync(f->fd) < 0) {
16898e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe			td_verror(td, errno, "fsync");
16998e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe			goto err;
17098e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe		}
17198e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe	}
1720d1cd207e409a36313784cb9596990c819775f77Jens Axboe	if (td->o.fill_device && !td_write(td)) {
173d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe		fio_file_clear_size_known(f);
1745e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe		if (td_io_get_file_size(td, f))
1755e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			goto err;
1765e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe		if (f->io_size > f->real_file_size)
1775e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			f->io_size = f->real_file_size;
1785e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	}
17953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
18053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	free(b);
181507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboedone:
18253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
18353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboeerr:
18453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	close(f->fd);
18553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	f->fd = -1;
18653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 1;
18753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
18853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
189afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanminstatic int pre_read_file(struct thread_data *td, struct fio_file *f)
190afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin{
191b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe	int r, did_open = 0, old_runstate;
192afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	unsigned long long left;
193afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	unsigned int bs;
194afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	char *b;
195afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
1969c0d224129b0c59698e4c77e7fed00dc8cbb50e1Jens Axboe	if (td->io_ops->flags & FIO_PIPEIO)
1979c0d224129b0c59698e4c77e7fed00dc8cbb50e1Jens Axboe		return 0;
1989c0d224129b0c59698e4c77e7fed00dc8cbb50e1Jens Axboe
199d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe	if (!fio_file_open(f)) {
200b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe		if (td->io_ops->open_file(td, f)) {
201b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe			log_err("fio: cannot pre-read, failed to open file\n");
202b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe			return 1;
203b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe		}
204b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe		did_open = 1;
205b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe	}
206b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe
207b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe	old_runstate = td->runstate;
208b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe	td_set_runstate(td, TD_PRE_READING);
209b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe
210afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	bs = td->o.max_bs[DDIR_READ];
211afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	b = malloc(bs);
212afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	memset(b, 0, bs);
213afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
214afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	lseek(f->fd, f->file_offset, SEEK_SET);
215afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	left = f->io_size;
216afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
217afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	while (left && !td->terminate) {
218afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin		if (bs > left)
219afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin			bs = left;
220afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
221afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin		r = read(f->fd, b, bs);
222afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
223afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin		if (r == (int) bs) {
224afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin			left -= bs;
225afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin			continue;
226afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin		} else {
227afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin			td_verror(td, EIO, "pre_read");
228afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin			break;
229afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin		}
230afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	}
231afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
232b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe	td_set_runstate(td, old_runstate);
233b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe
234b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe	if (did_open)
235b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe		td->io_ops->close_file(td, f);
236afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	free(b);
237afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	return 0;
238afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin}
239afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
2407bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboestatic unsigned long long get_rand_file_size(struct thread_data *td)
2419c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe{
242dc873b6f4a536c332b72cce268d5a7ccd356a891Jens Axboe	unsigned long long ret, sized;
2431294c3ec7a02d20a98b105c1c41b23358afc67e4Jens Axboe	unsigned long r;
2449c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe
2454c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe	if (td->o.use_os_rand) {
2464c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe		r = os_random_long(&td->file_size_state);
2474c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe		sized = td->o.file_size_high - td->o.file_size_low;
2484c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe		ret = (unsigned long long) ((double) sized * (r / (OS_RAND_MAX + 1.0)));
2494c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe	} else {
2504c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe		r = __rand(&td->__file_size_state);
2514c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe		sized = td->o.file_size_high - td->o.file_size_low;
2524c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe		ret = (unsigned long long) ((double) sized * (r / (FRAND_MAX + 1.0)));
2534c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe	}
2544c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe
2555ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe	ret += td->o.file_size_low;
2562dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	ret -= (ret % td->o.rw_min_bs);
2579c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe	return ret;
2589c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe}
2599c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe
26053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int file_size(struct thread_data *td, struct fio_file *f)
26153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
26253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	struct stat st;
26353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
264df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe	if (stat(f->file_name, &st) == -1) {
2657bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		td_verror(td, errno, "fstat");
2667bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		return 1;
2677bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
26853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
2697bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	f->real_file_size = st.st_size;
27053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
27153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
27253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
27353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int bdev_size(struct thread_data *td, struct fio_file *f)
27453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
2759b8365618309572d8fd2579c8ea3132db89f843fBruce Cran	unsigned long long bytes = 0;
27653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	int r;
27753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
278df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe	if (td->io_ops->open_file(td, f)) {
279df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe		log_err("fio: failed opening blockdev %s for size check\n",
280df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe			f->file_name);
281df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe		return 1;
282df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe	}
283df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe
284ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran	r = blockdev_size(f, &bytes);
28553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (r) {
286e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, r, "blockdev_size");
287df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe		goto err;
28853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
28953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
2907ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe	if (!bytes) {
2917ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe		log_err("%s: zero sized block device?\n", f->file_name);
292df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe		goto err;
2937ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe	}
2947ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe
29553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	f->real_file_size = bytes;
29622a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe	td->io_ops->close_file(td, f);
29753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
298df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboeerr:
299df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe	td->io_ops->close_file(td, f);
300df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe	return 1;
30153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
30253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
3034ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboestatic int char_size(struct thread_data *td, struct fio_file *f)
3044ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe{
3054ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe#ifdef FIO_HAVE_CHARDEV_SIZE
3069b8365618309572d8fd2579c8ea3132db89f843fBruce Cran	unsigned long long bytes = 0;
3074ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	int r;
3084ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe
3094ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	if (td->io_ops->open_file(td, f)) {
3104ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		log_err("fio: failed opening blockdev %s for size check\n",
3114ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe			f->file_name);
3124ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		return 1;
3134ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	}
3144ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe
315ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran	r = chardev_size(f, &bytes);
3164ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	if (r) {
3174ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		td_verror(td, r, "chardev_size");
3184ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		goto err;
3194ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	}
3204ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe
3214ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	if (!bytes) {
3224ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		log_err("%s: zero sized char device?\n", f->file_name);
3234ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		goto err;
3244ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	}
3254ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe
3264ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	f->real_file_size = bytes;
3274ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	td->io_ops->close_file(td, f);
3284ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	return 0;
3294ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboeerr:
3304ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	td->io_ops->close_file(td, f);
3314ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	return 1;
3324ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe#else
3334ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	f->real_file_size = -1ULL;
3344ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	return 0;
3354ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe#endif
3364ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe}
3374ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe
33853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int get_file_size(struct thread_data *td, struct fio_file *f)
33953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
34053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	int ret = 0;
34153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
342d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe	if (fio_file_size_known(f))
343409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe		return 0;
344409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe
3457bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (f->filetype == FIO_TYPE_FILE)
3467bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		ret = file_size(td, f);
3477bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	else if (f->filetype == FIO_TYPE_BD)
34853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		ret = bdev_size(td, f);
3494ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	else if (f->filetype == FIO_TYPE_CHAR)
3504ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		ret = char_size(td, f);
35153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	else
35253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		f->real_file_size = -1;
35353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
35453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (ret)
35553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return ret;
35653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
35753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (f->file_offset > f->real_file_size) {
3580f2152c19ed12fc2280c3d475973112f18e48cd5Bruce Cran		log_err("%s: offset extends end (%llu > %llu)\n", td->o.name,
3594e0a8fa2593006505b7f4e18931a201d221b49e9Jens Axboe					(unsigned long long) f->file_offset,
3604e0a8fa2593006505b7f4e18931a201d221b49e9Jens Axboe					(unsigned long long) f->real_file_size);
36153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return 1;
36253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
36353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
364d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe	fio_file_set_size_known(f);
36553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
36653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
36753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
3683baddf2450d811be658fb47ef883ee84478dc352Jens Axboestatic int __file_invalidate_cache(struct thread_data *td, struct fio_file *f,
3693baddf2450d811be658fb47ef883ee84478dc352Jens Axboe				   unsigned long long off,
3703baddf2450d811be658fb47ef883ee84478dc352Jens Axboe				   unsigned long long len)
371e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe{
372e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	int ret = 0;
373e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
3745e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	if (len == -1ULL)
3753baddf2450d811be658fb47ef883ee84478dc352Jens Axboe		len = f->io_size;
3763baddf2450d811be658fb47ef883ee84478dc352Jens Axboe	if (off == -1ULL)
3773baddf2450d811be658fb47ef883ee84478dc352Jens Axboe		off = f->file_offset;
378ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
3790d1cd207e409a36313784cb9596990c819775f77Jens Axboe	if (len == -1ULL || off == -1ULL)
3800d1cd207e409a36313784cb9596990c819775f77Jens Axboe		return 0;
3810d1cd207e409a36313784cb9596990c819775f77Jens Axboe
3823baddf2450d811be658fb47ef883ee84478dc352Jens Axboe	dprint(FD_IO, "invalidate cache %s: %llu/%llu\n", f->file_name, off,
3833baddf2450d811be658fb47ef883ee84478dc352Jens Axboe								len);
384b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe
385e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	/*
386e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	 * FIXME: add blockdev flushing too
387e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	 */
388a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe	if (f->mmap_ptr) {
38903e20d687566753b90383571e5e152c5142bdffdBruce Cran		ret = posix_madvise(f->mmap_ptr, f->mmap_sz, POSIX_MADV_DONTNEED);
390a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe#ifdef FIO_MADV_FREE
3913e10fb832645e3ab3ef006f589f0459dc567cb53Jens Axboe		if (f->filetype == FIO_TYPE_BD)
3923e10fb832645e3ab3ef006f589f0459dc567cb53Jens Axboe			(void) posix_madvise(f->mmap_ptr, f->mmap_sz, FIO_MADV_FREE);
393a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe#endif
394a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe	} else if (f->filetype == FIO_TYPE_FILE) {
395ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran		ret = posix_fadvise(f->fd, off, len, POSIX_FADV_DONTNEED);
3965ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe	} else if (f->filetype == FIO_TYPE_BD) {
397ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran		ret = blockdev_invalidate_cache(f);
3987e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe		if (ret < 0 && errno == EACCES && geteuid()) {
3997172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe			if (!root_warn) {
4005ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				log_err("fio: only root may flush block "
4015ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe					"devices. Cache flush bypassed!\n");
4027172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe				root_warn = 1;
4037172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe			}
4047e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe			ret = 0;
4057e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe		}
406b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe	} else if (f->filetype == FIO_TYPE_CHAR || f->filetype == FIO_TYPE_PIPE)
407e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe		ret = 0;
408e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
409e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	if (ret < 0) {
410e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, errno, "invalidate_cache");
411e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe		return 1;
4123baddf2450d811be658fb47ef883ee84478dc352Jens Axboe	} else if (ret > 0) {
4133baddf2450d811be658fb47ef883ee84478dc352Jens Axboe		td_verror(td, ret, "invalidate_cache");
4143baddf2450d811be658fb47ef883ee84478dc352Jens Axboe		return 1;
415e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	}
416e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
417ad2da605a62faf16887970618b434db19594e17bJens Axboe	return ret;
4183baddf2450d811be658fb47ef883ee84478dc352Jens Axboe
4193baddf2450d811be658fb47ef883ee84478dc352Jens Axboe}
4203baddf2450d811be658fb47ef883ee84478dc352Jens Axboe
4213baddf2450d811be658fb47ef883ee84478dc352Jens Axboeint file_invalidate_cache(struct thread_data *td, struct fio_file *f)
4223baddf2450d811be658fb47ef883ee84478dc352Jens Axboe{
423d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe	if (!fio_file_open(f))
424a5fb461fdff86c442daeebbd28e07984be9f3807Jens Axboe		return 0;
425a5fb461fdff86c442daeebbd28e07984be9f3807Jens Axboe
4265e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	return __file_invalidate_cache(td, f, -1ULL, -1ULL);
427e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe}
428e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
4296977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboeint generic_close_file(struct thread_data fio_unused *td, struct fio_file *f)
43053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
4316977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe	int ret = 0;
4326977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe
433ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "fd close %s\n", f->file_name);
4344906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe
4354906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe	remove_file_hash(f);
4364906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe
4376977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe	if (close(f->fd) < 0)
4386977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe		ret = errno;
4396977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe
440b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe	f->fd = -1;
441e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe
442e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe	if (f->shadow_fd != -1) {
443e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe		close(f->shadow_fd);
444e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe		f->shadow_fd = -1;
445e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe	}
446e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe
4476977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe	return ret;
44853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
44953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
4501ccc6dc75b28ef70cd7a8c39ac8c1cb68c720a65Dmitry Monakhovint file_lookup_open(struct fio_file *f, int flags)
45153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
45229c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe	struct fio_file *__f;
4534d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	int from_hash;
4544d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
4554d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	__f = lookup_file_hash(f->file_name);
4564d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (__f) {
4579efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe		dprint(FD_FILE, "found file in hash %s\n", f->file_name);
4584d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		/*
4594d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		 * racy, need the __f->lock locked
4604d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		 */
4614d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		f->lock = __f->lock;
4624d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		from_hash = 1;
4634d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	} else {
4649efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe		dprint(FD_FILE, "file not found in hash %s\n", f->file_name);
4654d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		from_hash = 0;
4664d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	}
4674d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
468e8670ef8b26039573fbf835b4b95ba45a1039d83Jens Axboe	f->fd = open(f->file_name, flags, 0600);
4694d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	return from_hash;
4704d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe}
4714d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
472e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboestatic int file_close_shadow_fds(struct thread_data *td)
473e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe{
474e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe	struct fio_file *f;
475e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe	int num_closed = 0;
476e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe	unsigned int i;
477e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe
478e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe	for_each_file(td, f, i) {
479e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe		if (f->shadow_fd == -1)
480e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe			continue;
481e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe
482e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe		close(f->shadow_fd);
483e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe		f->shadow_fd = -1;
484e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe		num_closed++;
485e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe	}
486e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe
487e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe	return num_closed;
488e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe}
489e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe
4904d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboeint generic_open_file(struct thread_data *td, struct fio_file *f)
4914d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe{
492661598287ecc3b8987f312cf8403936552ce686aJens Axboe	int is_std = 0;
49353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	int flags = 0;
49429c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe	int from_hash = 0;
49553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
496ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "fd open %s\n", f->file_name);
497ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
4986eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	if (td_trim(td) && f->filetype != FIO_TYPE_BD) {
4996eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li		log_err("fio: trim only applies to block device\n");
5006eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li		return 1;
5016eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	}
5026eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li
503661598287ecc3b8987f312cf8403936552ce686aJens Axboe	if (!strcmp(f->file_name, "-")) {
504661598287ecc3b8987f312cf8403936552ce686aJens Axboe		if (td_rw(td)) {
505661598287ecc3b8987f312cf8403936552ce686aJens Axboe			log_err("fio: can't read/write to stdin/out\n");
506661598287ecc3b8987f312cf8403936552ce686aJens Axboe			return 1;
507661598287ecc3b8987f312cf8403936552ce686aJens Axboe		}
508661598287ecc3b8987f312cf8403936552ce686aJens Axboe		is_std = 1;
509ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe
510ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe		/*
511ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe		 * move output logging to stderr, if we are writing to stdout
512ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe		 */
513ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe		if (td_write(td))
514ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe			f_out = stderr;
515661598287ecc3b8987f312cf8403936552ce686aJens Axboe	}
516661598287ecc3b8987f312cf8403936552ce686aJens Axboe
5176eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	if (td_trim(td))
5186eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li		goto skip_flags;
5192dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	if (td->o.odirect)
5202fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe		flags |= OS_O_DIRECT;
5212dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	if (td->o.sync_io)
5222fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe		flags |= O_SYNC;
523814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe	if (td->o.create_on_open)
524814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe		flags |= O_CREAT;
5256eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Liskip_flags:
5266eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	if (f->filetype != FIO_TYPE_FILE)
5276eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li		flags |= FIO_O_NOATIME;
52853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
529056f3459149a7670257350d84b49858718e4a0e6Aaron Carrollopen_again:
530660a1cb5fb9843ec09a04337714e78d63cd557e7Jens Axboe	if (td_write(td)) {
531173081581f94dc4f9f203eb7a7922fc843bfafdeJens Axboe		if (!read_only)
532173081581f94dc4f9f203eb7a7922fc843bfafdeJens Axboe			flags |= O_RDWR;
53353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
534af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe		if (f->filetype == FIO_TYPE_FILE)
5352fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe			flags |= O_CREAT;
5362fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe
537661598287ecc3b8987f312cf8403936552ce686aJens Axboe		if (is_std)
538661598287ecc3b8987f312cf8403936552ce686aJens Axboe			f->fd = dup(STDOUT_FILENO);
5394d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		else
5404d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe			from_hash = file_lookup_open(f, flags);
5416eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	} else if (td_read(td)) {
5424241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe		if (f->filetype == FIO_TYPE_CHAR && !read_only)
5432fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe			flags |= O_RDWR;
5442fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe		else
5452fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe			flags |= O_RDONLY;
5462fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe
547661598287ecc3b8987f312cf8403936552ce686aJens Axboe		if (is_std)
548661598287ecc3b8987f312cf8403936552ce686aJens Axboe			f->fd = dup(STDIN_FILENO);
5494d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		else
5504d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe			from_hash = file_lookup_open(f, flags);
5516eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	} else { //td trim
5526eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li		flags |= O_RDWR;
5536eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li		from_hash = file_lookup_open(f, flags);
55453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
55553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
55653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (f->fd == -1) {
557e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe		char buf[FIO_VERROR_SIZE];
558e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		int __e = errno;
559e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe
560835d9b9ed0e5c2591b8a3eacbd5f4ab6bdab466cJens Axboe		if (__e == EPERM && (flags & FIO_O_NOATIME)) {
5615921e80c5dfc9f96d2f21da6ae58f2b5d3a0b373Jens Axboe			flags &= ~FIO_O_NOATIME;
562056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll			goto open_again;
563056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll		}
564e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe		if (__e == EMFILE && file_close_shadow_fds(td))
565e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe			goto open_again;
566056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll
56798ffb8f3ecebed9984d1744f142eb8be10c14dbdKen Raeburn		snprintf(buf, sizeof(buf), "open(%s)", f->file_name);
568e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe
569a93c5f049da63a60f9962177d8ada50094d234deJens Axboe		if (__e == EINVAL && (flags & OS_O_DIRECT)) {
570a93c5f049da63a60f9962177d8ada50094d234deJens Axboe			log_err("fio: looks like your file system does not " \
571a93c5f049da63a60f9962177d8ada50094d234deJens Axboe				"support direct=1/buffered=0\n");
572a93c5f049da63a60f9962177d8ada50094d234deJens Axboe		}
573a93c5f049da63a60f9962177d8ada50094d234deJens Axboe
574e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe		td_verror(td, __e, buf);
57553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
57653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
57729c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe	if (!from_hash && f->fd != -1) {
57829c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe		if (add_file_hash(f)) {
5793f0ca9b914e6d0db8c5c457713c277ce458cbc02Jens Axboe			int fio_unused ret;
58029c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe
58129c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe			/*
582e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe			 * Stash away descriptor for later close. This is to
583e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe			 * work-around a "feature" on Linux, where a close of
584e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe			 * an fd that has been opened for write will trigger
585e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe			 * udev to call blkid to check partitions, fs id, etc.
586e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe			 * That polutes the device cache, which can slow down
587e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe			 * unbuffered accesses.
58829c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe			 */
589e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe			if (f->shadow_fd == -1)
590e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe				f->shadow_fd = f->fd;
591e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe			else {
592e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe				/*
593e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe			 	 * OK to ignore, we haven't done anything
594e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe				 * with it
595e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe				 */
596e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe				ret = generic_close_file(td, f);
597e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe			}
59829c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe			goto open_again;
59929c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe		}
60029c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe	}
6014906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe
60253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
603b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe}
604b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe
605df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboeint generic_get_file_size(struct thread_data *td, struct fio_file *f)
60621972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe{
607df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe	return get_file_size(td, f);
60821972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe}
60921972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe
6107bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe/*
6117bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * open/close all files, so that ->real_file_size gets set
6127bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */
613bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboestatic int get_file_sizes(struct thread_data *td)
6147bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe{
6157bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	struct fio_file *f;
6167bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	unsigned int i;
617bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe	int err = 0;
6187bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
6197bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	for_each_file(td, f, i) {
6205ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		dprint(FD_FILE, "get file size for %p/%d/%p\n", f, i,
6215ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe								f->file_name);
6229efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe
62399a47c6905731e53dd4d8f7ea6501f36d9329e7bJens Axboe		if (td_io_get_file_size(td, f)) {
62440b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe			if (td->error != ENOENT) {
62540b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe				log_err("%s\n", td->verror);
62640b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe				err = 1;
62740b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe			}
628541d66d70b8fbe9860b31307c0760e6d5f4c78a8Jens Axboe			clear_error(td);
62907eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe		}
630409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe
631409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe		if (f->real_file_size == -1ULL && td->o.size)
632409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe			f->real_file_size = td->o.size / td->o.nr_files;
6337bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
634bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe
635bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe	return err;
6367bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe}
6377bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
6382e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboestruct fio_mount {
6392e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	struct flist_head list;
6402e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	const char *base;
6412e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	char __base[256];
6422e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	unsigned int key;
6432e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe};
6442e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
6452e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe/*
6462e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe * Get free number of bytes for each file on each unique mount.
6472e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe */
6482e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboestatic unsigned long long get_fs_free_counts(struct thread_data *td)
6492e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe{
6502e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	struct flist_head *n, *tmp;
65168b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe	unsigned long long ret = 0;
6522e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	struct fio_mount *fm;
6532e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	FLIST_HEAD(list);
6542e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	struct fio_file *f;
6552e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	unsigned int i;
6562e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
6572e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	for_each_file(td, f, i) {
6582e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		struct stat sb;
6592e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		char buf[256];
6602e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
6614ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		if (f->filetype == FIO_TYPE_BD || f->filetype == FIO_TYPE_CHAR) {
6624ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe			if (f->real_file_size != -1ULL)
6634ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe				ret += f->real_file_size;
66468b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe			continue;
66568b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe		} else if (f->filetype != FIO_TYPE_FILE)
66668b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe			continue;
66768b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe
6682e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		strcpy(buf, f->file_name);
6692e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
6702e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		if (stat(buf, &sb) < 0) {
6712e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			if (errno != ENOENT)
6722e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe				break;
6732e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			strcpy(buf, ".");
6742e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			if (stat(buf, &sb) < 0)
6752e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe				break;
6762e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		}
6772e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
6782e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		fm = NULL;
6792e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		flist_for_each(n, &list) {
6802e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			fm = flist_entry(n, struct fio_mount, list);
6812e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			if (fm->key == sb.st_dev)
6822e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe				break;
6832e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
6842e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			fm = NULL;
6852e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		}
6862e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
6872e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		if (fm)
6882e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			continue;
6892e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
6902e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		fm = malloc(sizeof(*fm));
6912e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		strcpy(fm->__base, buf);
6922e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		fm->base = basename(fm->__base);
6932e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		fm->key = sb.st_dev;
6942e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		flist_add(&fm->list, &list);
6952e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	}
6962e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
6972e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	flist_for_each_safe(n, tmp, &list) {
6982e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		unsigned long long sz;
6992e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
7002e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		fm = flist_entry(n, struct fio_mount, list);
7012e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		flist_del(&fm->list);
7022e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
7032e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		sz = get_fs_size(fm->base);
7042e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		if (sz && sz != -1ULL)
7052e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			ret += sz;
7062e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
7072e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		free(fm);
7082e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	}
7092e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
7102e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	return ret;
7112e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe}
7122e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
713293b8c1f23bbe4c735cd00fbb7cca1121bf18016Jens Axboeuint64_t get_start_offset(struct thread_data *td)
714ce95d651568bd5494e4c4ddc95832715c6760d56Dan Ehrenberg{
715ce95d651568bd5494e4c4ddc95832715c6760d56Dan Ehrenberg	return td->o.start_offset +
716ce95d651568bd5494e4c4ddc95832715c6760d56Dan Ehrenberg		(td->thread_number - 1) * td->o.offset_increment;
717ce95d651568bd5494e4c4ddc95832715c6760d56Dan Ehrenberg}
718ce95d651568bd5494e4c4ddc95832715c6760d56Dan Ehrenberg
7197bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe/*
7207bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * Open the files and setup files sizes, creating files if necessary.
7217bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */
72253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboeint setup_files(struct thread_data *td)
72353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
7247bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	unsigned long long total_size, extend_size;
725de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe	struct thread_options *o = &td->o;
72653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	struct fio_file *f;
727af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	unsigned int i;
728000b080395e45cbe0ce54e75f0e993addbdc8676Jens Axboe	int err = 0, need_extend;
729e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe	int old_state;
73053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
731ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "setup files\n");
732ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
733e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe	old_state = td->runstate;
734e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe	td_set_runstate(td, TD_SETTING_UP);
735e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe
736de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe	if (o->read_iolog_file)
73725460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboe		goto done;
738691c8fb014da9dd82e999a90b5511423f4eee188Jens Axboe
73953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	/*
74053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	 * if ioengine defines a setup() method, it's responsible for
7417bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * opening the files and setting f->real_file_size to indicate
7427bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * the valid range for that file.
74353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	 */
74453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (td->io_ops->setup)
7457bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		err = td->io_ops->setup(td);
7467bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	else
747bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe		err = get_file_sizes(td);
74853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
749f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe	if (err)
750e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe		goto err_out;
751f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe
7520a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe	/*
7537bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * check sizes. if the files/devices do not exist and the size
7547bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * isn't passed to fio, abort.
7550a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe	 */
7567bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	total_size = 0;
7577bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	for_each_file(td, f, i) {
7587bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		if (f->real_file_size == -1ULL)
7597bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			total_size = -1ULL;
7607bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		else
7617bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			total_size += f->real_file_size;
7627bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
7630a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe
764de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe	if (o->fill_device)
7652e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		td->fill_device_size = get_fs_free_counts(td);
7662e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
7677bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	/*
7687bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * device/file sizes are zero and no size given, punt
7697bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 */
770de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe	if ((!total_size || total_size == -1ULL) && !o->size &&
771de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe	    !(td->io_ops->flags & FIO_NOIO) && !o->fill_device &&
772de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe	    !(o->nr_files && (o->file_size_low || o->file_size_high))) {
773de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe		log_err("%s: you need to specify size=\n", o->name);
774e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, EINVAL, "total_file_size");
775e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe		goto err_out;
77653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
77753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
7787bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	/*
7797bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * now file sizes are known, so we can set ->io_size. if size= is
7807bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * not given, ->io_size is just equal to ->real_file_size. if size
7817bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * is given, ->io_size is size / nr_files.
7827bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 */
7837bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	extend_size = total_size = 0;
7847bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	need_extend = 0;
7857bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	for_each_file(td, f, i) {
786ce95d651568bd5494e4c4ddc95832715c6760d56Dan Ehrenberg		f->file_offset = get_start_offset(td);
787bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang
788de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe		if (!o->file_size_low) {
7897bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			/*
7907bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * no file size range given, file size is equal to
7917bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * total size divided by number of files. if that is
7927bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * zero, set it to the real file size.
7937bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 */
794de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe			f->io_size = o->size / o->nr_files;
79565bdb10a09222d8b5d213de74824be775772ea8fJens Axboe			if (!f->io_size)
796273f8c912d981439049d9b21aa048aaeaa323c5dJens Axboe				f->io_size = f->real_file_size - f->file_offset;
797de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe		} else if (f->real_file_size < o->file_size_low ||
798de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe			   f->real_file_size > o->file_size_high) {
799de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe			if (f->file_offset > o->file_size_low)
800bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang				goto err_offset;
8017bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			/*
8027bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * file size given. if it's fixed, use that. if it's a
8037bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * range, generate a random size in-between.
8047bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 */
805de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe			if (o->file_size_low == o->file_size_high)
806de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe				f->io_size = o->file_size_low - f->file_offset;
807de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe			else {
8085ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				f->io_size = get_rand_file_size(td)
8095ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe						- f->file_offset;
8105ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			}
81165bdb10a09222d8b5d213de74824be775772ea8fJens Axboe		} else
812bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang			f->io_size = f->real_file_size - f->file_offset;
81353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
8147bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		if (f->io_size == -1ULL)
8157bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			total_size = -1ULL;
8164d002569dc503474a53e824e3f72b10a09c9a2b5Shaohua Li		else {
817de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe                        if (o->size_percent)
818de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe                                f->io_size = (f->io_size * o->size_percent) / 100;
8197bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			total_size += f->io_size;
8204d002569dc503474a53e824e3f72b10a09c9a2b5Shaohua Li		}
8217bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
8227bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		if (f->filetype == FIO_TYPE_FILE &&
823bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang		    (f->io_size + f->file_offset) > f->real_file_size &&
8247bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		    !(td->io_ops->flags & FIO_DISKLESSIO)) {
825de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe			if (!o->create_on_open) {
826814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe				need_extend++;
827814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe				extend_size += (f->io_size + f->file_offset);
828814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe			} else
829814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe				f->real_file_size = f->io_size + f->file_offset;
830d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe			fio_file_set_extend(f);
8315ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		}
8327bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
83353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
834de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe	if (!o->size || o->size > total_size)
835de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe		o->size = total_size;
83621972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe
8377bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	/*
8387bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * See if we need to extend some files
8397bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 */
8407bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (need_extend) {
8417bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		temp_stall_ts = 1;
842f3afa57e36550288340f1b6c694f354ae72654b9Jens Axboe		if (output_format == FIO_OUTPUT_NORMAL)
843a7ba8c5f4c0f9fe117d529c1ad6686b2070bae51Shaozhi Shawn Ye			log_info("%s: Laying out IO file(s) (%u file(s) /"
844de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe				 " %lluMB)\n", o->name, need_extend,
845a7ba8c5f4c0f9fe117d529c1ad6686b2070bae51Shaozhi Shawn Ye					extend_size >> 20);
8467bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
8477bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		for_each_file(td, f, i) {
8485e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			unsigned long long old_len = -1ULL, extend_len = -1ULL;
8493baddf2450d811be658fb47ef883ee84478dc352Jens Axboe
850d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe			if (!fio_file_extend(f))
8517bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe				continue;
8527bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
853409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe			assert(f->filetype == FIO_TYPE_FILE);
854d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe			fio_file_clear_extend(f);
855de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe			if (!o->fill_device) {
8565e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe				old_len = f->real_file_size;
8570b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe				extend_len = f->io_size + f->file_offset -
8580b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe						old_len;
8595e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			}
860bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang			f->real_file_size = (f->io_size + f->file_offset);
8617bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			err = extend_file(td, f);
8627bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			if (err)
8633baddf2450d811be658fb47ef883ee84478dc352Jens Axboe				break;
8645e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe
8653baddf2450d811be658fb47ef883ee84478dc352Jens Axboe			err = __file_invalidate_cache(td, f, old_len,
8663baddf2450d811be658fb47ef883ee84478dc352Jens Axboe								extend_len);
8673baddf2450d811be658fb47ef883ee84478dc352Jens Axboe			close(f->fd);
8683baddf2450d811be658fb47ef883ee84478dc352Jens Axboe			f->fd = -1;
8693baddf2450d811be658fb47ef883ee84478dc352Jens Axboe			if (err)
8707bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe				break;
8717bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		}
8727bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		temp_stall_ts = 0;
8737bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
8747bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
8757bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (err)
876e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe		goto err_out;
8777bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
878de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe	if (!o->zone_size)
879de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe		o->zone_size = o->size;
8807bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
881ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe	/*
882ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe	 * iolog already set the total io size, if we read back
883ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe	 * stored entries.
884ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe	 */
885de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe	if (!o->read_iolog_file)
886de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe		td->total_io_size = o->size * o->loops;
88725460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboe
88825460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboedone:
889de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe	if (o->create_only)
89025460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboe		td->done = 1;
89125460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboe
892e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe	td_set_runstate(td, old_state);
8937bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	return 0;
894bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tangerr_offset:
895de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe	log_err("%s: you need to specify valid offset=\n", o->name);
896e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboeerr_out:
897e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe	td_set_runstate(td, old_state);
898bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang	return 1;
89953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
90053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
901afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanminint pre_read_files(struct thread_data *td)
902afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin{
903afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	struct fio_file *f;
904afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	unsigned int i;
905afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
906afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	dprint(FD_FILE, "pre_read files\n");
907afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
908afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	for_each_file(td, f, i) {
909afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin		pre_read_file(td, f);
910afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	}
911afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
912afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	return 1;
913afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin}
914afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
9159c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboestatic int __init_rand_distribution(struct thread_data *td, struct fio_file *f)
9169c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe{
9172316296a514711bb388d87b34742c04bb561d986Jens Axboe	unsigned int range_size, seed;
9189c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	unsigned long nranges;
91921415db9f1689a5c47fda5e710879c4739707442Jens Axboe	uint64_t file_size;
9209c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe
9219c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	range_size = min(td->o.min_bs[DDIR_READ], td->o.min_bs[DDIR_WRITE]);
92221415db9f1689a5c47fda5e710879c4739707442Jens Axboe	file_size = min(f->real_file_size, f->io_size);
9239c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe
92421415db9f1689a5c47fda5e710879c4739707442Jens Axboe	nranges = (file_size + range_size - 1) / range_size;
9259c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe
9262316296a514711bb388d87b34742c04bb561d986Jens Axboe	seed = jhash(f->file_name, strlen(f->file_name), 0) * td->thread_number;
9278425687edef1b2961a17bd58341686f7b598cf28Jens Axboe	if (!td->o.rand_repeatable)
9288425687edef1b2961a17bd58341686f7b598cf28Jens Axboe		seed = td->rand_seeds[4];
9298425687edef1b2961a17bd58341686f7b598cf28Jens Axboe
9309c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	if (td->o.random_distribution == FIO_RAND_DIST_ZIPF)
931888677a428eb6ae6b54195e99734d6d6b3ee55e7Jens Axboe		zipf_init(&f->zipf, nranges, td->o.zipf_theta.u.f, seed);
9329c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	else
933888677a428eb6ae6b54195e99734d6d6b3ee55e7Jens Axboe		pareto_init(&f->zipf, nranges, td->o.pareto_h.u.f, seed);
9349c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe
9359c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	return 1;
9369c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe}
9379c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe
9389c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboestatic int init_rand_distribution(struct thread_data *td)
9399c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe{
9409c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	struct fio_file *f;
9419c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	unsigned int i;
9429c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	int state;
9439c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe
9449c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	if (td->o.random_distribution == FIO_RAND_DIST_RANDOM)
9459c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe		return 0;
9469c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe
9479c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	state = td->runstate;
9489c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	td_set_runstate(td, TD_SETTING_UP);
9499c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	for_each_file(td, f, i)
9509c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe		__init_rand_distribution(td, f);
9519c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	td_set_runstate(td, state);
9529c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe
9539c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	return 1;
9549c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe}
9559c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe
956687270767de17dbad53c50e03e5d73d52505405cJens Axboeint init_random_map(struct thread_data *td)
957687270767de17dbad53c50e03e5d73d52505405cJens Axboe{
95851ede0b1e9c9b570b942b50b44d0455183a0d5ecJens Axboe	unsigned long long blocks;
959687270767de17dbad53c50e03e5d73d52505405cJens Axboe	struct fio_file *f;
960687270767de17dbad53c50e03e5d73d52505405cJens Axboe	unsigned int i;
961687270767de17dbad53c50e03e5d73d52505405cJens Axboe
9629c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	if (init_rand_distribution(td))
9639c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe		return 0;
9643831a843c289ab6a42a19752733d0fca4250882aJens Axboe	if (!td_random(td))
965687270767de17dbad53c50e03e5d73d52505405cJens Axboe		return 0;
966687270767de17dbad53c50e03e5d73d52505405cJens Axboe
967687270767de17dbad53c50e03e5d73d52505405cJens Axboe	for_each_file(td, f, i) {
96838f30c81d8d194da047950cbbda3896bd35cd98cJens Axboe		uint64_t file_size = min(f->real_file_size, f->io_size);
96938f30c81d8d194da047950cbbda3896bd35cd98cJens Axboe
97053737ae01ca65f88089d3b8639df7be5b2f7ef0eJens Axboe		blocks = file_size / (unsigned long long) td->o.rw_min_bs;
97153737ae01ca65f88089d3b8639df7be5b2f7ef0eJens Axboe
9728055e41d0ecc54770a2653427532b3e2c5fabdadJens Axboe		if (td->o.random_generator == FIO_RAND_GEN_LFSR) {
97382af46be1fa0c0e188bbb6723008fa33a510606fJens Axboe			unsigned long seed;
97482af46be1fa0c0e188bbb6723008fa33a510606fJens Axboe
97582af46be1fa0c0e188bbb6723008fa33a510606fJens Axboe			seed = td->rand_seeds[FIO_RAND_BLOCK_OFF];
97682af46be1fa0c0e188bbb6723008fa33a510606fJens Axboe
977d474cbc9ba33448848b50cc697622a402e91e33eAlex Pyrgiotis			if (!lfsr_init(&f->lfsr, blocks, seed, seed & 0xF))
9788055e41d0ecc54770a2653427532b3e2c5fabdadJens Axboe				continue;
9793831a843c289ab6a42a19752733d0fca4250882aJens Axboe		} else if (!td->o.norandommap) {
9807ebd796f4e50c21d652e62bf1e112755b0f338a8Jens Axboe			f->io_axmap = axmap_new(blocks);
9817ebd796f4e50c21d652e62bf1e112755b0f338a8Jens Axboe			if (f->io_axmap)
9828055e41d0ecc54770a2653427532b3e2c5fabdadJens Axboe				continue;
9831cad7121e8e6c59440ae43545be05fa302e4110dJens Axboe		} else if (td->o.norandommap)
9841cad7121e8e6c59440ae43545be05fa302e4110dJens Axboe			continue;
985ceadd59ef93421001530aa765d928e9e8c26b32eJens Axboe
9862b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe		if (!td->o.softrandommap) {
9875ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			log_err("fio: failed allocating random map. If running"
9885ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				" a large number of jobs, try the 'norandommap'"
9892b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe				" option or set 'softrandommap'. Or give"
9902b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe				" a larger --alloc-size to fio.\n");
991687270767de17dbad53c50e03e5d73d52505405cJens Axboe			return 1;
992687270767de17dbad53c50e03e5d73d52505405cJens Axboe		}
993303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe
994303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe		log_info("fio: file %s failed allocating random map. Running "
995303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe			 "job without.\n", f->file_name);
996687270767de17dbad53c50e03e5d73d52505405cJens Axboe	}
997687270767de17dbad53c50e03e5d73d52505405cJens Axboe
998687270767de17dbad53c50e03e5d73d52505405cJens Axboe	return 0;
999687270767de17dbad53c50e03e5d73d52505405cJens Axboe}
1000687270767de17dbad53c50e03e5d73d52505405cJens Axboe
100153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboevoid close_files(struct thread_data *td)
100253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
10030ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe	struct fio_file *f;
1004af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	unsigned int i;
100553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
10062be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe	for_each_file(td, f, i) {
10072be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe		if (fio_file_open(f))
10082be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe			td_io_close_file(td, f);
10092be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe	}
101024ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe}
101124ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe
101224ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboevoid close_and_free_files(struct thread_data *td)
101324ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe{
101424ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe	struct fio_file *f;
101524ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe	unsigned int i;
101624ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe
1017ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "close files\n");
1018ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
10190ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe	for_each_file(td, f, i) {
1020ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe		if (td->o.unlink && f->filetype == FIO_TYPE_FILE) {
1021ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe			dprint(FD_FILE, "free unlink %s\n", f->file_name);
1022132ad46d22bcf12da95ad69e03c1b6f23f5e60a9Jens Axboe			unlink(f->file_name);
1023ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe		}
1024bdb4e2e99d4a87e5d3677cc09aa1ce92135125a9Jens Axboe
102522a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe		if (fio_file_open(f))
102622a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe			td_io_close_file(td, f);
102722a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe
1028b9fbcf2104ab79127825e0c23ba0a147ec076087Shaozhi Shawn Ye		remove_file_hash(f);
1029b3dc7f075b85e004f8c681ebb8566475017696f3Jens Axboe
1030f17c43928c202e557f2f325272c60d9050ee528eJens Axboe		sfree(f->file_name);
1031fa1da8653e2177b3cc31a91e963c389f079d4172Jens Axboe		f->file_name = NULL;
10327ebd796f4e50c21d652e62bf1e112755b0f338a8Jens Axboe		axmap_free(f->io_axmap);
10337ebd796f4e50c21d652e62bf1e112755b0f338a8Jens Axboe		f->io_axmap = NULL;
103478d99e6a2695d3a7936c5dd02f996f13a30309b1Jens Axboe		sfree(f);
103553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
1036b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe
10372dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	td->o.filename = NULL;
1038cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	free(td->files);
1039d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe	free(td->file_locks);
10409efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe	td->files_index = 0;
1041b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe	td->files = NULL;
1042d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe	td->file_locks = NULL;
10432dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	td->o.nr_files = 0;
104453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
1045af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
1046e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboestatic void get_file_type(struct fio_file *f)
1047af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe{
1048af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	struct stat sb;
1049af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
1050661598287ecc3b8987f312cf8403936552ce686aJens Axboe	if (!strcmp(f->file_name, "-"))
1051661598287ecc3b8987f312cf8403936552ce686aJens Axboe		f->filetype = FIO_TYPE_PIPE;
1052661598287ecc3b8987f312cf8403936552ce686aJens Axboe	else
1053661598287ecc3b8987f312cf8403936552ce686aJens Axboe		f->filetype = FIO_TYPE_FILE;
1054af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
10553892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran	/* \\.\ is the device namespace in Windows, where every file is
10563892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran	 * a block device */
10573892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran	if (strncmp(f->file_name, "\\\\.\\", 4) == 0)
10583892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran		f->filetype = FIO_TYPE_BD;
10593892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran
1060b30d395ec288508f9c787af11d0f52e9df26e39fJens Axboe	if (!stat(f->file_name, &sb)) {
10613892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran		if (S_ISBLK(sb.st_mode))
1062af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe			f->filetype = FIO_TYPE_BD;
1063af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe		else if (S_ISCHR(sb.st_mode))
1064af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe			f->filetype = FIO_TYPE_CHAR;
1065b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe		else if (S_ISFIFO(sb.st_mode))
1066b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe			f->filetype = FIO_TYPE_PIPE;
1067af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	}
1068af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe}
1069af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
1070f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboeint add_file(struct thread_data *td, const char *fname)
1071af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe{
10727b4e4fe5e6fa26f82f9169c18ec70c08d0805ca9Jens Axboe	int cur_files = td->files_index;
1073bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe	char file_name[PATH_MAX];
1074af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	struct fio_file *f;
1075bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe	int len = 0;
1076af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
1077ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "add file %s\n", fname);
1078ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
1079f17c43928c202e557f2f325272c60d9050ee528eJens Axboe	f = smalloc(sizeof(*f));
1080c48c0be79173897824d8f439c39374f2588931dcJens Axboe	if (!f) {
1081c48c0be79173897824d8f439c39374f2588931dcJens Axboe		log_err("fio: smalloc OOM\n");
1082c48c0be79173897824d8f439c39374f2588931dcJens Axboe		assert(0);
1083c48c0be79173897824d8f439c39374f2588931dcJens Axboe	}
10840b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe
1085af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	f->fd = -1;
1086e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe	f->shadow_fd = -1;
108733c48814e08cf961801bf37f759da2748eb3431bJens Axboe	fio_file_reset(td, f);
1088bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe
1089fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe	if (td->files_size <= td->files_index) {
10901983e3271c20a5dca84ac1ad872e44dd9e62e6b8Jianpeng Ma		unsigned int new_size = td->o.nr_files + 1;
1091126d65c6fc97d6acdc568aa5a969c012018daf15Jens Axboe
1092fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe		dprint(FD_FILE, "resize file array to %d files\n", new_size);
1093fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe
1094fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe		td->files = realloc(td->files, new_size * sizeof(f));
1095d537c08b0eacdeb05835ee8c5f269b872239713aJianpeng Ma		if (td->files == NULL) {
1096d537c08b0eacdeb05835ee8c5f269b872239713aJianpeng Ma			log_err("fio: realloc OOM\n");
1097d537c08b0eacdeb05835ee8c5f269b872239713aJianpeng Ma			assert(0);
1098d537c08b0eacdeb05835ee8c5f269b872239713aJianpeng Ma		}
1099d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe		if (td->o.file_lock_mode != FILE_LOCK_NONE) {
1100d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe			td->file_locks = realloc(td->file_locks, new_size);
1101d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe			if (!td->file_locks) {
1102d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe				log_err("fio: realloc OOM\n");
1103d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe				assert(0);
1104d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe			}
1105d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe			td->file_locks[cur_files] = FILE_LOCK_NONE;
1106d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe		}
1107fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe		td->files_size = new_size;
1108fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe	}
11098bb7679e73d3086a01b9d21a650b0d7a859412b6Jens Axboe	td->files[cur_files] = f;
111089ac1d48971578ccb0645c292d4a058340aeb909Shaohua Li	f->fileno = cur_files;
1111126d65c6fc97d6acdc568aa5a969c012018daf15Jens Axboe
111207eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe	/*
111307eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe	 * init function, io engine may not be loaded yet
111407eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe	 */
111507eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe	if (td->io_ops && (td->io_ops->flags & FIO_DISKLESSIO))
111607eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe		f->real_file_size = -1ULL;
111707eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe
1118bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe	if (td->o.directory)
1119bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe		len = sprintf(file_name, "%s/", td->o.directory);
1120bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe
1121bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe	sprintf(file_name + len, "%s", fname);
1122f17c43928c202e557f2f325272c60d9050ee528eJens Axboe	f->file_name = smalloc_strdup(file_name);
1123c48c0be79173897824d8f439c39374f2588931dcJens Axboe	if (!f->file_name) {
1124c48c0be79173897824d8f439c39374f2588931dcJens Axboe		log_err("fio: smalloc OOM\n");
1125c48c0be79173897824d8f439c39374f2588931dcJens Axboe		assert(0);
1126c48c0be79173897824d8f439c39374f2588931dcJens Axboe	}
11270b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe
1128e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboe	get_file_type(f);
1129af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
11304d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	switch (td->o.file_lock_mode) {
11314d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	case FILE_LOCK_NONE:
11324d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		break;
11334d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	case FILE_LOCK_READWRITE:
1134d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe		f->rwlock = fio_rwlock_init();
11354d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		break;
11364d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	case FILE_LOCK_EXCLUSIVE:
1137521da527743088a9bd2ab882f8b64799d49d5848Jens Axboe		f->lock = fio_mutex_init(FIO_MUTEX_UNLOCKED);
11384d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		break;
11394d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	default:
11404d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		log_err("fio: unknown lock mode: %d\n", td->o.file_lock_mode);
11414d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		assert(0);
11424d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	}
114329c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe
11447b4e4fe5e6fa26f82f9169c18ec70c08d0805ca9Jens Axboe	td->files_index++;
11451549441cdfecb2c1a4a8b8d494253859d67b4344Jens Axboe	if (f->filetype == FIO_TYPE_FILE)
11461549441cdfecb2c1a4a8b8d494253859d67b4344Jens Axboe		td->nr_normal_files++;
1147f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
11485ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe	dprint(FD_FILE, "file %p \"%s\" added at %d\n", f, f->file_name,
11495ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe							cur_files);
11509efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe
1151f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	return cur_files;
1152af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe}
11530ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe
115449ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboeint add_file_exclusive(struct thread_data *td, const char *fname)
115549ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe{
115649ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe	struct fio_file *f;
115749ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe	unsigned int i;
115849ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe
115949ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe	for_each_file(td, f, i) {
116049ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe		if (!strcmp(f->file_name, fname))
116149ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe			return i;
116249ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe	}
116349ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe
116449ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe	return add_file(td, fname);
116549ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe}
116649ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe
11670ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboevoid get_file(struct fio_file *f)
11680ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe{
11698172fe972f3a79d42f34d7f6e259ed3f7f800316Jens Axboe	dprint(FD_FILE, "get file %s, ref=%d\n", f->file_name, f->references);
1170d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe	assert(fio_file_open(f));
11710ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	f->references++;
11720ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe}
11730ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe
11746977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboeint put_file(struct thread_data *td, struct fio_file *f)
11750ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe{
117698e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe	int f_ret = 0, ret = 0;
11776977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe
11788172fe972f3a79d42f34d7f6e259ed3f7f800316Jens Axboe	dprint(FD_FILE, "put file %s, ref=%d\n", f->file_name, f->references);
1179ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
118022a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe	if (!fio_file_open(f)) {
118122a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe		assert(f->fd == -1);
11826977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe		return 0;
118322a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe	}
11840ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe
11850ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	assert(f->references);
11860ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	if (--f->references)
11876977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe		return 0;
11880ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe
1189d424d4dd657eaf4aeb8ffb07a550a5f64940f41aJens Axboe	if (should_fsync(td) && td->o.fsync_on_close)
119098e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe		f_ret = fsync(f->fd);
1191ebb1415f729c123b8a13bcbd667bf4b4cc95b4d4Jens Axboe
11920ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	if (td->io_ops->close_file)
11936977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe		ret = td->io_ops->close_file(td, f);
11941020a139beff50faf1bb18f761b024b664a09e14Jens Axboe
119598e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe	if (!ret)
1196a5fb461fdff86c442daeebbd28e07984be9f3807Jens Axboe		ret = f_ret;
119798e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe
11980ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	td->nr_open_files--;
1199d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe	fio_file_clear_open(f);
120022a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe	assert(f->fd == -1);
12016977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe	return ret;
12020ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe}
1203bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
12044d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid lock_file(struct thread_data *td, struct fio_file *f, enum fio_ddir ddir)
1205b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe{
12064d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (!f->lock || td->o.file_lock_mode == FILE_LOCK_NONE)
12074d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		return;
120829c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe
12094d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (td->o.file_lock_mode == FILE_LOCK_READWRITE) {
12104d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		if (ddir == DDIR_READ)
1211d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe			fio_rwlock_read(f->rwlock);
12124d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		else
1213d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe			fio_rwlock_write(f->rwlock);
12144d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	} else if (td->o.file_lock_mode == FILE_LOCK_EXCLUSIVE)
12154d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		fio_mutex_down(f->lock);
12164d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
1217d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe	td->file_locks[f->fileno] = td->o.file_lock_mode;
1218b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe}
1219b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe
12204d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid unlock_file(struct thread_data *td, struct fio_file *f)
1221b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe{
12224d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (!f->lock || td->o.file_lock_mode == FILE_LOCK_NONE)
12234d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		return;
12244d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
1225d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe	if (td->o.file_lock_mode == FILE_LOCK_READWRITE)
1226d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe		fio_rwlock_unlock(f->rwlock);
1227d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe	else if (td->o.file_lock_mode == FILE_LOCK_EXCLUSIVE)
12284d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		fio_mutex_up(f->lock);
1229d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe
1230d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe	td->file_locks[f->fileno] = FILE_LOCK_NONE;
1231b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe}
1232b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe
12334d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid unlock_file_all(struct thread_data *td, struct fio_file *f)
12344d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe{
1235d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe	if (td->file_locks[f->fileno] != FILE_LOCK_NONE)
1236d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe		unlock_file(td, f);
12374d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe}
12384d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
1239bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboestatic int recurse_dir(struct thread_data *td, const char *dirname)
1240bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe{
1241bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	struct dirent *dir;
1242bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	int ret = 0;
1243bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	DIR *D;
1244bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1245bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	D = opendir(dirname);
1246bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	if (!D) {
12470ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		char buf[FIO_VERROR_SIZE];
12480ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe
124998ffb8f3ecebed9984d1744f142eb8be10c14dbdKen Raeburn		snprintf(buf, FIO_VERROR_SIZE, "opendir(%s)", dirname);
12500ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		td_verror(td, errno, buf);
1251bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		return 1;
1252bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	}
1253bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1254bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	while ((dir = readdir(D)) != NULL) {
1255bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		char full_path[PATH_MAX];
1256bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		struct stat sb;
1257bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1258e85b2b83e39b64ba5cb73fbfddbf3902b6e84925Jens Axboe		if (!strcmp(dir->d_name, ".") || !strcmp(dir->d_name, ".."))
1259e85b2b83e39b64ba5cb73fbfddbf3902b6e84925Jens Axboe			continue;
126096d32d518a0743a6c050057bc1562e4883e51c5dJens Axboe
1261b9fd788f0e8adacc33316107594e9eb0463743d7Bruce Cran		sprintf(full_path, "%s%s%s", dirname, FIO_OS_PATH_SEPARATOR, dir->d_name);
1262bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1263bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		if (lstat(full_path, &sb) == -1) {
1264bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			if (errno != ENOENT) {
1265bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe				td_verror(td, errno, "stat");
1266bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe				return 1;
1267bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			}
1268bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		}
1269bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1270bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		if (S_ISREG(sb.st_mode)) {
1271bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			add_file(td, full_path);
12722dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe			td->o.nr_files++;
1273bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			continue;
1274bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		}
12750ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		if (!S_ISDIR(sb.st_mode))
12760ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe			continue;
1277bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
12785ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		ret = recurse_dir(td, full_path);
12795ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		if (ret)
1280bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			break;
1281bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	}
1282bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1283bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	closedir(D);
1284bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	return ret;
1285bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe}
1286bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1287bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboeint add_dir_files(struct thread_data *td, const char *path)
1288bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe{
12890ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe	int ret = recurse_dir(td, path);
12900ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe
12910ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe	if (!ret)
12920ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		log_info("fio: opendir added %d files\n", td->o.nr_files);
12930ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe
12940ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe	return ret;
1295bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe}
1296cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe
1297cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboevoid dup_files(struct thread_data *td, struct thread_data *org)
1298cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe{
1299cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	struct fio_file *f;
1300cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	unsigned int i;
13019efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe
13029efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe	dprint(FD_FILE, "dup files: %d\n", org->files_index);
1303cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe
1304cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	if (!org->files)
1305cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe		return;
1306cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe
13079efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe	td->files = malloc(org->files_index * sizeof(f));
1308cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe
1309d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe	if (td->o.file_lock_mode != FILE_LOCK_NONE)
1310d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe		td->file_locks = malloc(org->files_index);
1311d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe
13129efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe	for_each_file(org, f, i) {
1313b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe		struct fio_file *__f;
1314b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe
1315f17c43928c202e557f2f325272c60d9050ee528eJens Axboe		__f = smalloc(sizeof(*__f));
1316c48c0be79173897824d8f439c39374f2588931dcJens Axboe		if (!__f) {
1317c48c0be79173897824d8f439c39374f2588931dcJens Axboe			log_err("fio: smalloc OOM\n");
1318c48c0be79173897824d8f439c39374f2588931dcJens Axboe			assert(0);
1319c48c0be79173897824d8f439c39374f2588931dcJens Axboe		}
132022a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe		__f->fd = -1;
132133c48814e08cf961801bf37f759da2748eb3431bJens Axboe		fio_file_reset(td, __f);
13220b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe
1323bc3456fa06cc7777c4764da8c7b1c0fd0a3c3772Aaron Carroll		if (f->file_name) {
1324f17c43928c202e557f2f325272c60d9050ee528eJens Axboe			__f->file_name = smalloc_strdup(f->file_name);
1325c48c0be79173897824d8f439c39374f2588931dcJens Axboe			if (!__f->file_name) {
1326c48c0be79173897824d8f439c39374f2588931dcJens Axboe				log_err("fio: smalloc OOM\n");
1327c48c0be79173897824d8f439c39374f2588931dcJens Axboe				assert(0);
1328c48c0be79173897824d8f439c39374f2588931dcJens Axboe			}
13290b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe
1330bc3456fa06cc7777c4764da8c7b1c0fd0a3c3772Aaron Carroll			__f->filetype = f->filetype;
1331bc3456fa06cc7777c4764da8c7b1c0fd0a3c3772Aaron Carroll		}
1332b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe
1333b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe		td->files[i] = __f;
1334cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	}
1335cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe}
1336f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
1337f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe/*
1338f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe * Returns the index that matches the filename, or -1 if not there
1339f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe */
1340f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboeint get_fileno(struct thread_data *td, const char *fname)
1341f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe{
1342f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	struct fio_file *f;
1343f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	unsigned int i;
1344f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
1345f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	for_each_file(td, f, i)
1346f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe		if (!strcmp(f->file_name, fname))
1347f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe			return i;
1348f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
1349f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	return -1;
1350f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe}
1351f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
1352f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe/*
1353f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe * For log usage, where we add/open/close files automatically
1354f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe */
1355f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboevoid free_release_files(struct thread_data *td)
1356f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe{
1357f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	close_files(td);
1358f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	td->files_index = 0;
1359f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	td->nr_normal_files = 0;
1360f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe}
136133c48814e08cf961801bf37f759da2748eb3431bJens Axboe
136233c48814e08cf961801bf37f759da2748eb3431bJens Axboevoid fio_file_reset(struct thread_data *td, struct fio_file *f)
136333c48814e08cf961801bf37f759da2748eb3431bJens Axboe{
136433c48814e08cf961801bf37f759da2748eb3431bJens Axboe	f->last_pos = f->file_offset;
136533c48814e08cf961801bf37f759da2748eb3431bJens Axboe	f->last_start = -1ULL;
136633c48814e08cf961801bf37f759da2748eb3431bJens Axboe	if (f->io_axmap)
136733c48814e08cf961801bf37f759da2748eb3431bJens Axboe		axmap_reset(f->io_axmap);
136833c48814e08cf961801bf37f759da2748eb3431bJens Axboe	if (td->o.random_generator == FIO_RAND_GEN_LFSR)
136933c48814e08cf961801bf37f759da2748eb3431bJens Axboe		lfsr_reset(&f->lfsr, td->rand_seeds[FIO_RAND_BLOCK_OFF]);
137033c48814e08cf961801bf37f759da2748eb3431bJens Axboe}
1371