filesetup.c revision 4ccdccd149d82c94ec6ccdb4118d9e27479b8516
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"
1453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
157172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboestatic int root_warn;
167172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe
17c592b9fe12d4739d99d5bece517e304804876df6Jens Axboestatic inline void clear_error(struct thread_data *td)
18c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe{
19c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe	td->error = 0;
20c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe	td->verror[0] = '\0';
21c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe}
22c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe
233baddf2450d811be658fb47ef883ee84478dc352Jens Axboe/*
243baddf2450d811be658fb47ef883ee84478dc352Jens Axboe * Leaves f->fd open on success, caller must close
253baddf2450d811be658fb47ef883ee84478dc352Jens Axboe */
267bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboestatic int extend_file(struct thread_data *td, struct fio_file *f)
2725205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe{
28ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe	int r, new_layout = 0, unlink_file = 0, flags;
2925205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe	unsigned long long left;
3025205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe	unsigned int bs;
3125205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe	char *b;
32b2a151925a91f38aeb298d693687a47269ad4e94Jens Axboe
334241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe	if (read_only) {
344241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe		log_err("fio: refusing extend of file due to read-only\n");
354241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe		return 0;
364241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe	}
374241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe
38507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	/*
39507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	 * check if we need to lay the file out complete again. fio
40507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	 * does that for operations involving reads, or for writes
41507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	 * where overwrite is set
42507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	 */
43ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe	if (td_read(td) || (td_write(td) && td->o.overwrite) ||
44ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe	    (td_write(td) && td->io_ops->flags & FIO_NOEXTEND))
45507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe		new_layout = 1;
46ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe	if (td_write(td) && !td->o.overwrite)
47ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe		unlink_file = 1;
48507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe
496ae1f57f2cb8661b97b770372eeb3694f6d5a744Jens Axboe	if (unlink_file || new_layout) {
50bd199f2b98eeb9101795e40fdef5889c630178c1Jens Axboe		dprint(FD_FILE, "layout unlink %s\n", f->file_name);
51982016d689dc7fedbb09646ba0df7e72a781b164Zhang, Yanmin		if ((unlink(f->file_name) < 0) && (errno != ENOENT)) {
527bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			td_verror(td, errno, "unlink");
537bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			return 1;
547bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		}
557bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
567bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
57507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	flags = O_WRONLY | O_CREAT;
58507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	if (new_layout)
59507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe		flags |= O_TRUNC;
60507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe
61ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "open file %s, flags %x\n", f->file_name, flags);
62507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	f->fd = open(f->file_name, flags, 0644);
6353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (f->fd < 0) {
64e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, errno, "open");
6553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return 1;
6653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
6753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
687bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe#ifdef FIO_HAVE_FALLOCATE
697bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe	if (td->o.fallocate && !td->o.fill_device) {
707bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe		dprint(FD_FILE, "fallocate file %s size %llu\n", f->file_name,
717bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe							f->real_file_size);
727bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe
737bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe		r = posix_fallocate(f->fd, 0, f->real_file_size);
747bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe		if (r < 0) {
757bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe			log_err("fio: posix_fallocate fails: %s\n",
767bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe					strerror(-r));
777bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe		}
787bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe	}
797bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe#endif
807bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe
81fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis	if (!new_layout)
82fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis		goto done;
83fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis
845e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	/*
855e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	 * The size will be -1ULL when fill_device is used, so don't truncate
865e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	 * or fallocate this file, just write it
875e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	 */
885e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	if (!td->o.fill_device) {
895e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe		dprint(FD_FILE, "truncate file %s, size %llu\n", f->file_name,
90ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe							f->real_file_size);
915e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe		if (ftruncate(f->fd, f->real_file_size) == -1) {
925e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			td_verror(td, errno, "ftruncate");
935e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			goto err;
945e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe		}
955e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	}
9640f8298cd252157fa15d93f8eb470116a94069a0Jens Axboe
972dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	b = malloc(td->o.max_bs[DDIR_WRITE]);
982dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	memset(b, 0, td->o.max_bs[DDIR_WRITE]);
9953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
1007bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	left = f->real_file_size;
10153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	while (left && !td->terminate) {
1022dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe		bs = td->o.max_bs[DDIR_WRITE];
10353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		if (bs > left)
10453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			bs = left;
10553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
10653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		r = write(f->fd, b, bs);
10753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
1085e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe		if (r > 0) {
1095e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			left -= r;
11053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			continue;
11153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		} else {
1125e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			if (r < 0) {
1135e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe				int __e = errno;
1145e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe
1155e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe				if (__e == ENOSPC) {
1165e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe					if (td->o.fill_device)
1175e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe						break;
1185e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe					log_info("fio: ENOSPC on laying out "
1195e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe						 "file, stopping\n");
1205e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe					break;
1215e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe				}
122e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe				td_verror(td, errno, "write");
1235e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			} else
124e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe				td_verror(td, EIO, "write");
12553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
12653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			break;
12753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		}
12853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
12953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
130ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe	if (td->terminate) {
131ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe		dprint(FD_FILE, "terminate unlink %s\n", f->file_name);
13253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		unlink(f->file_name);
133ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe	} else if (td->o.create_fsync) {
13498e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe		if (fsync(f->fd) < 0) {
13598e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe			td_verror(td, errno, "fsync");
13698e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe			goto err;
13798e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe		}
13898e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe	}
1390d1cd207e409a36313784cb9596990c819775f77Jens Axboe	if (td->o.fill_device && !td_write(td)) {
140d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe		fio_file_clear_size_known(f);
1415e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe		if (td_io_get_file_size(td, f))
1425e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			goto err;
1435e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe		if (f->io_size > f->real_file_size)
1445e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			f->io_size = f->real_file_size;
1455e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	}
14653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
14753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	free(b);
148507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboedone:
14953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
15053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboeerr:
15153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	close(f->fd);
15253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	f->fd = -1;
15353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 1;
15453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
15553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
156afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanminstatic int pre_read_file(struct thread_data *td, struct fio_file *f)
157afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin{
158b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe	int r, did_open = 0, old_runstate;
159afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	unsigned long long left;
160afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	unsigned int bs;
161afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	char *b;
162afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
1639c0d224129b0c59698e4c77e7fed00dc8cbb50e1Jens Axboe	if (td->io_ops->flags & FIO_PIPEIO)
1649c0d224129b0c59698e4c77e7fed00dc8cbb50e1Jens Axboe		return 0;
1659c0d224129b0c59698e4c77e7fed00dc8cbb50e1Jens Axboe
166d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe	if (!fio_file_open(f)) {
167b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe		if (td->io_ops->open_file(td, f)) {
168b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe			log_err("fio: cannot pre-read, failed to open file\n");
169b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe			return 1;
170b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe		}
171b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe		did_open = 1;
172b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe	}
173b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe
174b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe	old_runstate = td->runstate;
175b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe	td_set_runstate(td, TD_PRE_READING);
176b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe
177afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	bs = td->o.max_bs[DDIR_READ];
178afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	b = malloc(bs);
179afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	memset(b, 0, bs);
180afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
181afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	lseek(f->fd, f->file_offset, SEEK_SET);
182afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	left = f->io_size;
183afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
184afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	while (left && !td->terminate) {
185afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin		if (bs > left)
186afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin			bs = left;
187afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
188afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin		r = read(f->fd, b, bs);
189afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
190afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin		if (r == (int) bs) {
191afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin			left -= bs;
192afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin			continue;
193afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin		} else {
194afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin			td_verror(td, EIO, "pre_read");
195afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin			break;
196afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin		}
197afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	}
198afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
199b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe	td_set_runstate(td, old_runstate);
200b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe
201b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe	if (did_open)
202b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe		td->io_ops->close_file(td, f);
203afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	free(b);
204afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	return 0;
205afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin}
206afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
2077bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboestatic unsigned long long get_rand_file_size(struct thread_data *td)
2089c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe{
209dc873b6f4a536c332b72cce268d5a7ccd356a891Jens Axboe	unsigned long long ret, sized;
2109c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe	long r;
2119c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe
2129c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe	r = os_random_long(&td->file_size_state);
213dc873b6f4a536c332b72cce268d5a7ccd356a891Jens Axboe	sized = td->o.file_size_high - td->o.file_size_low;
214dc873b6f4a536c332b72cce268d5a7ccd356a891Jens Axboe	ret = (unsigned long long) ((double) sized * (r / (OS_RAND_MAX + 1.0)));
2155ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe	ret += td->o.file_size_low;
2162dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	ret -= (ret % td->o.rw_min_bs);
2179c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe	return ret;
2189c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe}
2199c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe
22053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int file_size(struct thread_data *td, struct fio_file *f)
22153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
22253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	struct stat st;
22353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
224df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe	if (stat(f->file_name, &st) == -1) {
2257bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		td_verror(td, errno, "fstat");
2267bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		return 1;
2277bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
22853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
2297bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	f->real_file_size = st.st_size;
23053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
23153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
23253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
23353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int bdev_size(struct thread_data *td, struct fio_file *f)
23453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
23553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	unsigned long long bytes;
23653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	int r;
23753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
238df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe	if (td->io_ops->open_file(td, f)) {
239df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe		log_err("fio: failed opening blockdev %s for size check\n",
240df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe			f->file_name);
241df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe		return 1;
242df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe	}
243df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe
24453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	r = blockdev_size(f->fd, &bytes);
24553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (r) {
246e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, r, "blockdev_size");
247df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe		goto err;
24853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
24953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
2507ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe	if (!bytes) {
2517ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe		log_err("%s: zero sized block device?\n", f->file_name);
252df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe		goto err;
2537ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe	}
2547ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe
25553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	f->real_file_size = bytes;
25622a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe	td->io_ops->close_file(td, f);
25753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
258df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboeerr:
259df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe	td->io_ops->close_file(td, f);
260df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe	return 1;
26153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
26253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
2634ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboestatic int char_size(struct thread_data *td, struct fio_file *f)
2644ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe{
2654ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe#ifdef FIO_HAVE_CHARDEV_SIZE
2664ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	unsigned long long bytes;
2674ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	int r;
2684ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe
2694ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	if (td->io_ops->open_file(td, f)) {
2704ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		log_err("fio: failed opening blockdev %s for size check\n",
2714ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe			f->file_name);
2724ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		return 1;
2734ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	}
2744ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe
2754ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	r = chardev_size(f->fd, &bytes);
2764ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	if (r) {
2774ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		td_verror(td, r, "chardev_size");
2784ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		goto err;
2794ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	}
2804ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe
2814ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	if (!bytes) {
2824ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		log_err("%s: zero sized char device?\n", f->file_name);
2834ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		goto err;
2844ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	}
2854ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe
2864ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	f->real_file_size = bytes;
2874ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	td->io_ops->close_file(td, f);
2884ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	return 0;
2894ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboeerr:
2904ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	td->io_ops->close_file(td, f);
2914ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	return 1;
2924ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe#else
2934ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	f->real_file_size = -1ULL;
2944ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	return 0;
2954ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe#endif
2964ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe}
2974ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe
29853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int get_file_size(struct thread_data *td, struct fio_file *f)
29953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
30053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	int ret = 0;
30153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
302d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe	if (fio_file_size_known(f))
303409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe		return 0;
304409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe
3057bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (f->filetype == FIO_TYPE_FILE)
3067bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		ret = file_size(td, f);
3077bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	else if (f->filetype == FIO_TYPE_BD)
30853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		ret = bdev_size(td, f);
3094ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	else if (f->filetype == FIO_TYPE_CHAR)
3104ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		ret = char_size(td, f);
31153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	else
31253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		f->real_file_size = -1;
31353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
31453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (ret)
31553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return ret;
31653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
31753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (f->file_offset > f->real_file_size) {
3185ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		log_err("%s: offset extends end (%Lu > %Lu)\n", td->o.name,
3195ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe					f->file_offset, f->real_file_size);
32053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return 1;
32153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
32253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
323d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe	fio_file_set_size_known(f);
32453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
32553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
32653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
3273baddf2450d811be658fb47ef883ee84478dc352Jens Axboestatic int __file_invalidate_cache(struct thread_data *td, struct fio_file *f,
3283baddf2450d811be658fb47ef883ee84478dc352Jens Axboe				   unsigned long long off,
3293baddf2450d811be658fb47ef883ee84478dc352Jens Axboe				   unsigned long long len)
330e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe{
331e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	int ret = 0;
332e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
3335e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	if (len == -1ULL)
3343baddf2450d811be658fb47ef883ee84478dc352Jens Axboe		len = f->io_size;
3353baddf2450d811be658fb47ef883ee84478dc352Jens Axboe	if (off == -1ULL)
3363baddf2450d811be658fb47ef883ee84478dc352Jens Axboe		off = f->file_offset;
337ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
3380d1cd207e409a36313784cb9596990c819775f77Jens Axboe	if (len == -1ULL || off == -1ULL)
3390d1cd207e409a36313784cb9596990c819775f77Jens Axboe		return 0;
3400d1cd207e409a36313784cb9596990c819775f77Jens Axboe
3413baddf2450d811be658fb47ef883ee84478dc352Jens Axboe	dprint(FD_IO, "invalidate cache %s: %llu/%llu\n", f->file_name, off,
3423baddf2450d811be658fb47ef883ee84478dc352Jens Axboe								len);
343b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe
344e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	/*
345e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	 * FIXME: add blockdev flushing too
346e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	 */
347a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe	if (f->mmap_ptr) {
348ac89311241264280574c81e6400c9a0c59615082Jens Axboe		ret = madvise(f->mmap_ptr, f->mmap_sz, MADV_DONTNEED);
349a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe#ifdef FIO_MADV_FREE
350a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe		(void) madvise(f->mmap_ptr, f->mmap_sz, FIO_MADV_FREE);
351a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe#endif
352a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe	} else if (f->filetype == FIO_TYPE_FILE) {
3533baddf2450d811be658fb47ef883ee84478dc352Jens Axboe		ret = fadvise(f->fd, off, len, POSIX_FADV_DONTNEED);
3545ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe	} else if (f->filetype == FIO_TYPE_BD) {
355b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe		ret = blockdev_invalidate_cache(f->fd);
3567e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe		if (ret < 0 && errno == EACCES && geteuid()) {
3577172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe			if (!root_warn) {
3585ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				log_err("fio: only root may flush block "
3595ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe					"devices. Cache flush bypassed!\n");
3607172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe				root_warn = 1;
3617172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe			}
3627e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe			ret = 0;
3637e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe		}
364b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe	} else if (f->filetype == FIO_TYPE_CHAR || f->filetype == FIO_TYPE_PIPE)
365e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe		ret = 0;
366e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
367e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	if (ret < 0) {
368e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, errno, "invalidate_cache");
369e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe		return 1;
3703baddf2450d811be658fb47ef883ee84478dc352Jens Axboe	} else if (ret > 0) {
3713baddf2450d811be658fb47ef883ee84478dc352Jens Axboe		td_verror(td, ret, "invalidate_cache");
3723baddf2450d811be658fb47ef883ee84478dc352Jens Axboe		return 1;
373e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	}
374e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
375ad2da605a62faf16887970618b434db19594e17bJens Axboe	return ret;
3763baddf2450d811be658fb47ef883ee84478dc352Jens Axboe
3773baddf2450d811be658fb47ef883ee84478dc352Jens Axboe}
3783baddf2450d811be658fb47ef883ee84478dc352Jens Axboe
3793baddf2450d811be658fb47ef883ee84478dc352Jens Axboeint file_invalidate_cache(struct thread_data *td, struct fio_file *f)
3803baddf2450d811be658fb47ef883ee84478dc352Jens Axboe{
381d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe	if (!fio_file_open(f))
382a5fb461fdff86c442daeebbd28e07984be9f3807Jens Axboe		return 0;
383a5fb461fdff86c442daeebbd28e07984be9f3807Jens Axboe
3845e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	return __file_invalidate_cache(td, f, -1ULL, -1ULL);
385e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe}
386e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
3876977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboeint generic_close_file(struct thread_data fio_unused *td, struct fio_file *f)
38853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
3896977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe	int ret = 0;
3906977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe
391ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "fd close %s\n", f->file_name);
3924906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe
3934906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe	remove_file_hash(f);
3944906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe
3956977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe	if (close(f->fd) < 0)
3966977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe		ret = errno;
3976977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe
398b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe	f->fd = -1;
3996977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe	return ret;
40053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
40153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
4024d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboestatic int file_lookup_open(struct fio_file *f, int flags)
40353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
40429c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe	struct fio_file *__f;
4054d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	int from_hash;
4064d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
4074d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	__f = lookup_file_hash(f->file_name);
4084d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (__f) {
4099efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe		dprint(FD_FILE, "found file in hash %s\n", f->file_name);
4104d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		/*
4114d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		 * racy, need the __f->lock locked
4124d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		 */
4134d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		f->lock = __f->lock;
4144d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		f->lock_owner = __f->lock_owner;
4154d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		f->lock_batch = __f->lock_batch;
4164d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		f->lock_ddir = __f->lock_ddir;
4174d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		from_hash = 1;
4184d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	} else {
4199efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe		dprint(FD_FILE, "file not found in hash %s\n", f->file_name);
4204d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		from_hash = 0;
4214d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	}
4224d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
423e8670ef8b26039573fbf835b4b95ba45a1039d83Jens Axboe	f->fd = open(f->file_name, flags, 0600);
4244d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	return from_hash;
4254d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe}
4264d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
4274d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboeint generic_open_file(struct thread_data *td, struct fio_file *f)
4284d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe{
429661598287ecc3b8987f312cf8403936552ce686aJens Axboe	int is_std = 0;
43053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	int flags = 0;
43129c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe	int from_hash = 0;
43253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
433ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "fd open %s\n", f->file_name);
434ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
435661598287ecc3b8987f312cf8403936552ce686aJens Axboe	if (!strcmp(f->file_name, "-")) {
436661598287ecc3b8987f312cf8403936552ce686aJens Axboe		if (td_rw(td)) {
437661598287ecc3b8987f312cf8403936552ce686aJens Axboe			log_err("fio: can't read/write to stdin/out\n");
438661598287ecc3b8987f312cf8403936552ce686aJens Axboe			return 1;
439661598287ecc3b8987f312cf8403936552ce686aJens Axboe		}
440661598287ecc3b8987f312cf8403936552ce686aJens Axboe		is_std = 1;
441ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe
442ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe		/*
443ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe		 * move output logging to stderr, if we are writing to stdout
444ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe		 */
445ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe		if (td_write(td))
446ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe			f_out = stderr;
447661598287ecc3b8987f312cf8403936552ce686aJens Axboe	}
448661598287ecc3b8987f312cf8403936552ce686aJens Axboe
4492dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	if (td->o.odirect)
4502fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe		flags |= OS_O_DIRECT;
4512dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	if (td->o.sync_io)
4522fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe		flags |= O_SYNC;
453ad92396cc21055cee93470dcf65e82ccde03aac5Jens Axboe	if (f->filetype != FIO_TYPE_FILE)
4545921e80c5dfc9f96d2f21da6ae58f2b5d3a0b373Jens Axboe		flags |= FIO_O_NOATIME;
455814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe	if (td->o.create_on_open)
456814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe		flags |= O_CREAT;
45753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
458056f3459149a7670257350d84b49858718e4a0e6Aaron Carrollopen_again:
459660a1cb5fb9843ec09a04337714e78d63cd557e7Jens Axboe	if (td_write(td)) {
460173081581f94dc4f9f203eb7a7922fc843bfafdeJens Axboe		if (!read_only)
461173081581f94dc4f9f203eb7a7922fc843bfafdeJens Axboe			flags |= O_RDWR;
46253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
463af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe		if (f->filetype == FIO_TYPE_FILE)
4642fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe			flags |= O_CREAT;
4652fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe
466661598287ecc3b8987f312cf8403936552ce686aJens Axboe		if (is_std)
467661598287ecc3b8987f312cf8403936552ce686aJens Axboe			f->fd = dup(STDOUT_FILENO);
4684d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		else
4694d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe			from_hash = file_lookup_open(f, flags);
4702fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe	} else {
4714241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe		if (f->filetype == FIO_TYPE_CHAR && !read_only)
4722fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe			flags |= O_RDWR;
4732fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe		else
4742fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe			flags |= O_RDONLY;
4752fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe
476661598287ecc3b8987f312cf8403936552ce686aJens Axboe		if (is_std)
477661598287ecc3b8987f312cf8403936552ce686aJens Axboe			f->fd = dup(STDIN_FILENO);
4784d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		else
4794d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe			from_hash = file_lookup_open(f, flags);
48053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
48153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
48253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (f->fd == -1) {
483e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe		char buf[FIO_VERROR_SIZE];
484e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		int __e = errno;
485e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe
486835d9b9ed0e5c2591b8a3eacbd5f4ab6bdab466cJens Axboe		if (__e == EPERM && (flags & FIO_O_NOATIME)) {
4875921e80c5dfc9f96d2f21da6ae58f2b5d3a0b373Jens Axboe			flags &= ~FIO_O_NOATIME;
488056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll			goto open_again;
489056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll		}
490056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll
491e8670ef8b26039573fbf835b4b95ba45a1039d83Jens Axboe		snprintf(buf, sizeof(buf) - 1, "open(%s)", f->file_name);
492e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe
493e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe		td_verror(td, __e, buf);
49453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
49553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
49629c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe	if (!from_hash && f->fd != -1) {
49729c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe		if (add_file_hash(f)) {
49829c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe			int ret;
49929c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe
50029c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe			/*
50129c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe			 * OK to ignore, we haven't done anything with it
50229c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe			 */
50329c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe			ret = generic_close_file(td, f);
50429c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe			goto open_again;
50529c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe		}
50629c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe	}
5074906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe
50853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
509b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe}
510b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe
511df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboeint generic_get_file_size(struct thread_data *td, struct fio_file *f)
51221972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe{
513df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe	return get_file_size(td, f);
51421972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe}
51521972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe
5167bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe/*
5177bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * open/close all files, so that ->real_file_size gets set
5187bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */
519bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboestatic int get_file_sizes(struct thread_data *td)
5207bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe{
5217bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	struct fio_file *f;
5227bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	unsigned int i;
523bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe	int err = 0;
5247bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
5257bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	for_each_file(td, f, i) {
5265ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		dprint(FD_FILE, "get file size for %p/%d/%p\n", f, i,
5275ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe								f->file_name);
5289efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe
52999a47c6905731e53dd4d8f7ea6501f36d9329e7bJens Axboe		if (td_io_get_file_size(td, f)) {
53040b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe			if (td->error != ENOENT) {
53140b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe				log_err("%s\n", td->verror);
53240b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe				err = 1;
53340b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe			}
534541d66d70b8fbe9860b31307c0760e6d5f4c78a8Jens Axboe			clear_error(td);
53507eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe		}
536409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe
537409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe		if (f->real_file_size == -1ULL && td->o.size)
538409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe			f->real_file_size = td->o.size / td->o.nr_files;
5397bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
540bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe
541bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe	return err;
5427bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe}
5437bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
5442e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboestruct fio_mount {
5452e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	struct flist_head list;
5462e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	const char *base;
5472e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	char __base[256];
5482e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	unsigned int key;
5492e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe};
5502e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
5512e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe/*
5522e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe * Get free number of bytes for each file on each unique mount.
5532e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe */
5542e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboestatic unsigned long long get_fs_free_counts(struct thread_data *td)
5552e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe{
5562e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	struct flist_head *n, *tmp;
55768b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe	unsigned long long ret = 0;
5582e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	struct fio_mount *fm;
5592e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	FLIST_HEAD(list);
5602e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	struct fio_file *f;
5612e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	unsigned int i;
5622e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
5632e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	for_each_file(td, f, i) {
5642e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		struct stat sb;
5652e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		char buf[256];
5662e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
5674ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		if (f->filetype == FIO_TYPE_BD || f->filetype == FIO_TYPE_CHAR) {
5684ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe			if (f->real_file_size != -1ULL)
5694ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe				ret += f->real_file_size;
57068b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe			continue;
57168b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe		} else if (f->filetype != FIO_TYPE_FILE)
57268b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe			continue;
57368b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe
5742e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		strcpy(buf, f->file_name);
5752e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
5762e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		if (stat(buf, &sb) < 0) {
5772e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			if (errno != ENOENT)
5782e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe				break;
5792e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			strcpy(buf, ".");
5802e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			if (stat(buf, &sb) < 0)
5812e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe				break;
5822e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		}
5832e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
5842e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		fm = NULL;
5852e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		flist_for_each(n, &list) {
5862e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			fm = flist_entry(n, struct fio_mount, list);
5872e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			if (fm->key == sb.st_dev)
5882e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe				break;
5892e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
5902e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			fm = NULL;
5912e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		}
5922e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
5932e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		if (fm)
5942e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			continue;
5952e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
5962e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		fm = malloc(sizeof(*fm));
5972e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		strcpy(fm->__base, buf);
5982e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		fm->base = basename(fm->__base);
5992e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		fm->key = sb.st_dev;
6002e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		flist_add(&fm->list, &list);
6012e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	}
6022e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
6032e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	flist_for_each_safe(n, tmp, &list) {
6042e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		unsigned long long sz;
6052e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
6062e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		fm = flist_entry(n, struct fio_mount, list);
6072e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		flist_del(&fm->list);
6082e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
6092e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		sz = get_fs_size(fm->base);
6102e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		if (sz && sz != -1ULL)
6112e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			ret += sz;
6122e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
6132e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		free(fm);
6142e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	}
6152e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
6162e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	return ret;
6172e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe}
6182e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
6197bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe/*
6207bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * Open the files and setup files sizes, creating files if necessary.
6217bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */
62253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboeint setup_files(struct thread_data *td)
62353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
6247bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	unsigned long long total_size, extend_size;
62553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	struct fio_file *f;
626af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	unsigned int i;
627000b080395e45cbe0ce54e75f0e993addbdc8676Jens Axboe	int err = 0, need_extend;
62853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
629ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "setup files\n");
630ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
631691c8fb014da9dd82e999a90b5511423f4eee188Jens Axboe	if (td->o.read_iolog_file)
632691c8fb014da9dd82e999a90b5511423f4eee188Jens Axboe		return 0;
633691c8fb014da9dd82e999a90b5511423f4eee188Jens Axboe
63453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	/*
63553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	 * if ioengine defines a setup() method, it's responsible for
6367bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * opening the files and setting f->real_file_size to indicate
6377bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * the valid range for that file.
63853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	 */
63953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (td->io_ops->setup)
6407bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		err = td->io_ops->setup(td);
6417bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	else
642bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe		err = get_file_sizes(td);
64353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
644f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe	if (err)
645f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe		return err;
646f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe
6470a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe	/*
6487bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * check sizes. if the files/devices do not exist and the size
6497bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * isn't passed to fio, abort.
6500a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe	 */
6517bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	total_size = 0;
6527bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	for_each_file(td, f, i) {
6537bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		if (f->real_file_size == -1ULL)
6547bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			total_size = -1ULL;
6557bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		else
6567bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			total_size += f->real_file_size;
6577bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
6580a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe
6592e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	if (td->o.fill_device)
6602e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		td->fill_device_size = get_fs_free_counts(td);
6612e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
6627bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	/*
6637bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * device/file sizes are zero and no size given, punt
6647bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 */
6651f809d151ddc4a4c348c2e4f6007db510e3e08a2Jens Axboe	if ((!total_size || total_size == -1ULL) && !td->o.size &&
666aa31f1f108348ba2a8749c73fa8c25f3d4630a7cShawn Lewis	    !(td->io_ops->flags & FIO_NOIO) && !td->o.fill_device) {
6677bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		log_err("%s: you need to specify size=\n", td->o.name);
668e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, EINVAL, "total_file_size");
66953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return 1;
67053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
67153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
6727bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	/*
6737bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * now file sizes are known, so we can set ->io_size. if size= is
6747bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * not given, ->io_size is just equal to ->real_file_size. if size
6757bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * is given, ->io_size is size / nr_files.
6767bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 */
6777bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	extend_size = total_size = 0;
6787bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	need_extend = 0;
6797bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	for_each_file(td, f, i) {
680bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang		f->file_offset = td->o.start_offset;
681bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang
6827bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		if (!td->o.file_size_low) {
6837bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			/*
6847bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * no file size range given, file size is equal to
6857bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * total size divided by number of files. if that is
6867bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * zero, set it to the real file size.
6877bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 */
6887bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			f->io_size = td->o.size / td->o.nr_files;
68965bdb10a09222d8b5d213de74824be775772ea8fJens Axboe			if (!f->io_size)
690273f8c912d981439049d9b21aa048aaeaa323c5dJens Axboe				f->io_size = f->real_file_size - f->file_offset;
6917bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		} else if (f->real_file_size < td->o.file_size_low ||
6927bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			   f->real_file_size > td->o.file_size_high) {
6935ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			if (f->file_offset > td->o.file_size_low)
694bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang				goto err_offset;
6957bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			/*
6967bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * file size given. if it's fixed, use that. if it's a
6977bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * range, generate a random size in-between.
6987bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 */
6995ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			if (td->o.file_size_low == td->o.file_size_high) {
7005ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				f->io_size = td->o.file_size_low
7015ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe						- f->file_offset;
7025ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			} else {
7035ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				f->io_size = get_rand_file_size(td)
7045ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe						- f->file_offset;
7055ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			}
70665bdb10a09222d8b5d213de74824be775772ea8fJens Axboe		} else
707bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang			f->io_size = f->real_file_size - f->file_offset;
70853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
7097bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		if (f->io_size == -1ULL)
7107bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			total_size = -1ULL;
7117bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		else
7127bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			total_size += f->io_size;
7137bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
7147bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		if (f->filetype == FIO_TYPE_FILE &&
715bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang		    (f->io_size + f->file_offset) > f->real_file_size &&
7167bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		    !(td->io_ops->flags & FIO_DISKLESSIO)) {
717814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe			if (!td->o.create_on_open) {
718814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe				need_extend++;
719814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe				extend_size += (f->io_size + f->file_offset);
720814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe			} else
721814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe				f->real_file_size = f->io_size + f->file_offset;
722d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe			fio_file_set_extend(f);
7235ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		}
7247bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
72553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
7262298290eabbe1017421a6ba0f5de93d8c2b048adljzhang,Yaxin Hu,Jianchao Tang	if (!td->o.size || td->o.size > total_size)
7277bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		td->o.size = total_size;
72821972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe
7297bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	/*
7307bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * See if we need to extend some files
7317bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 */
7327bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (need_extend) {
7337bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		temp_stall_ts = 1;
734a7ba8c5f4c0f9fe117d529c1ad6686b2070bae51Shaozhi Shawn Ye		if (!terse_output)
735a7ba8c5f4c0f9fe117d529c1ad6686b2070bae51Shaozhi Shawn Ye			log_info("%s: Laying out IO file(s) (%u file(s) /"
736b22989b9f9349b3c1d1c41846ab27ff0914bd6deJens Axboe				 " %LuMB)\n", td->o.name, need_extend,
737a7ba8c5f4c0f9fe117d529c1ad6686b2070bae51Shaozhi Shawn Ye					extend_size >> 20);
7387bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
7397bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		for_each_file(td, f, i) {
7405e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			unsigned long long old_len = -1ULL, extend_len = -1ULL;
7413baddf2450d811be658fb47ef883ee84478dc352Jens Axboe
742d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe			if (!fio_file_extend(f))
7437bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe				continue;
7447bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
745409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe			assert(f->filetype == FIO_TYPE_FILE);
746d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe			fio_file_clear_extend(f);
7475e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			if (!td->o.fill_device) {
7485e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe				old_len = f->real_file_size;
7490b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe				extend_len = f->io_size + f->file_offset -
7500b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe						old_len;
7515e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			}
752bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang			f->real_file_size = (f->io_size + f->file_offset);
7537bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			err = extend_file(td, f);
7547bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			if (err)
7553baddf2450d811be658fb47ef883ee84478dc352Jens Axboe				break;
7565e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe
7573baddf2450d811be658fb47ef883ee84478dc352Jens Axboe			err = __file_invalidate_cache(td, f, old_len,
7583baddf2450d811be658fb47ef883ee84478dc352Jens Axboe								extend_len);
7593baddf2450d811be658fb47ef883ee84478dc352Jens Axboe			close(f->fd);
7603baddf2450d811be658fb47ef883ee84478dc352Jens Axboe			f->fd = -1;
7613baddf2450d811be658fb47ef883ee84478dc352Jens Axboe			if (err)
7627bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe				break;
7637bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		}
7647bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		temp_stall_ts = 0;
7657bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
7667bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
7677bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (err)
7687bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		return err;
7697bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
7707bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (!td->o.zone_size)
7717bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		td->o.zone_size = td->o.size;
7727bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
773ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe	/*
774ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe	 * iolog already set the total io size, if we read back
775ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe	 * stored entries.
776ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe	 */
777ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe	if (!td->o.read_iolog_file)
778ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe		td->total_io_size = td->o.size * td->o.loops;
7797bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	return 0;
780bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tangerr_offset:
781bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang	log_err("%s: you need to specify valid offset=\n", td->o.name);
782bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang	return 1;
78353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
78453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
785afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanminint pre_read_files(struct thread_data *td)
786afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin{
787afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	struct fio_file *f;
788afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	unsigned int i;
789afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
790afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	dprint(FD_FILE, "pre_read files\n");
791afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
792afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	for_each_file(td, f, i) {
793afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin		pre_read_file(td, f);
794afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	}
795afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
796afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	return 1;
797afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin}
798afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
799687270767de17dbad53c50e03e5d73d52505405cJens Axboeint init_random_map(struct thread_data *td)
800687270767de17dbad53c50e03e5d73d52505405cJens Axboe{
801509eab12448823a8eefbe925804b5308ee63bf5eJens Axboe	unsigned long long blocks, num_maps;
802687270767de17dbad53c50e03e5d73d52505405cJens Axboe	struct fio_file *f;
803687270767de17dbad53c50e03e5d73d52505405cJens Axboe	unsigned int i;
804687270767de17dbad53c50e03e5d73d52505405cJens Axboe
805de8dd119d7d869dd9c90c6d62bf4bededd10642eJens Axboe	if (td->o.norandommap || !td_random(td))
806687270767de17dbad53c50e03e5d73d52505405cJens Axboe		return 0;
807687270767de17dbad53c50e03e5d73d52505405cJens Axboe
808687270767de17dbad53c50e03e5d73d52505405cJens Axboe	for_each_file(td, f, i) {
8095ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		blocks = (f->real_file_size + td->o.rw_min_bs - 1) /
8105ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				(unsigned long long) td->o.rw_min_bs;
8115ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		num_maps = (blocks + BLOCKS_PER_MAP - 1) /
8125ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				(unsigned long long) BLOCKS_PER_MAP;
813de605666880852ba9d1a0469723126b09782c520Jens Axboe		f->file_map = smalloc(num_maps * sizeof(int));
814303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe		if (f->file_map) {
815303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe			f->num_maps = num_maps;
816303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe			continue;
817687270767de17dbad53c50e03e5d73d52505405cJens Axboe		}
8182b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe		if (!td->o.softrandommap) {
8195ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			log_err("fio: failed allocating random map. If running"
8205ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				" a large number of jobs, try the 'norandommap'"
8212b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe				" option or set 'softrandommap'. Or give"
8222b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe				" a larger --alloc-size to fio.\n");
823687270767de17dbad53c50e03e5d73d52505405cJens Axboe			return 1;
824687270767de17dbad53c50e03e5d73d52505405cJens Axboe		}
825303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe
826303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe		log_info("fio: file %s failed allocating random map. Running "
827303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe			 "job without.\n", f->file_name);
828303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe		f->num_maps = 0;
829687270767de17dbad53c50e03e5d73d52505405cJens Axboe	}
830687270767de17dbad53c50e03e5d73d52505405cJens Axboe
831687270767de17dbad53c50e03e5d73d52505405cJens Axboe	return 0;
832687270767de17dbad53c50e03e5d73d52505405cJens Axboe}
833687270767de17dbad53c50e03e5d73d52505405cJens Axboe
83453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboevoid close_files(struct thread_data *td)
83553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
8360ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe	struct fio_file *f;
837af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	unsigned int i;
83853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
8392be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe	for_each_file(td, f, i) {
8402be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe		if (fio_file_open(f))
8412be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe			td_io_close_file(td, f);
8422be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe	}
84324ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe}
84424ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe
84524ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboevoid close_and_free_files(struct thread_data *td)
84624ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe{
84724ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe	struct fio_file *f;
84824ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe	unsigned int i;
84924ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe
850ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "close files\n");
851ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
8520ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe	for_each_file(td, f, i) {
853ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe		if (td->o.unlink && f->filetype == FIO_TYPE_FILE) {
854ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe			dprint(FD_FILE, "free unlink %s\n", f->file_name);
855132ad46d22bcf12da95ad69e03c1b6f23f5e60a9Jens Axboe			unlink(f->file_name);
856ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe		}
857bdb4e2e99d4a87e5d3677cc09aa1ce92135125a9Jens Axboe
85822a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe		if (fio_file_open(f))
85922a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe			td_io_close_file(td, f);
86022a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe
861b9fbcf2104ab79127825e0c23ba0a147ec076087Shaozhi Shawn Ye		remove_file_hash(f);
862b3dc7f075b85e004f8c681ebb8566475017696f3Jens Axboe
863f17c43928c202e557f2f325272c60d9050ee528eJens Axboe		sfree(f->file_name);
864fa1da8653e2177b3cc31a91e963c389f079d4172Jens Axboe		f->file_name = NULL;
86561eb313e28c0f0ba8eb144c5b5f331b6b74c4fc8Jens Axboe		sfree(f->file_map);
86661eb313e28c0f0ba8eb144c5b5f331b6b74c4fc8Jens Axboe		f->file_map = NULL;
86778d99e6a2695d3a7936c5dd02f996f13a30309b1Jens Axboe		sfree(f);
86853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
869b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe
8702dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	td->o.filename = NULL;
871cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	free(td->files);
8729efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe	td->files_index = 0;
873b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe	td->files = NULL;
8742dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	td->o.nr_files = 0;
87553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
876af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
877e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboestatic void get_file_type(struct fio_file *f)
878af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe{
879af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	struct stat sb;
880af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
881661598287ecc3b8987f312cf8403936552ce686aJens Axboe	if (!strcmp(f->file_name, "-"))
882661598287ecc3b8987f312cf8403936552ce686aJens Axboe		f->filetype = FIO_TYPE_PIPE;
883661598287ecc3b8987f312cf8403936552ce686aJens Axboe	else
884661598287ecc3b8987f312cf8403936552ce686aJens Axboe		f->filetype = FIO_TYPE_FILE;
885af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
886b30d395ec288508f9c787af11d0f52e9df26e39fJens Axboe	if (!stat(f->file_name, &sb)) {
887af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe		if (S_ISBLK(sb.st_mode))
888af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe			f->filetype = FIO_TYPE_BD;
889af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe		else if (S_ISCHR(sb.st_mode))
890af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe			f->filetype = FIO_TYPE_CHAR;
891b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe		else if (S_ISFIFO(sb.st_mode))
892b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe			f->filetype = FIO_TYPE_PIPE;
893af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	}
894af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe}
895af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
896f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboeint add_file(struct thread_data *td, const char *fname)
897af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe{
8987b4e4fe5e6fa26f82f9169c18ec70c08d0805ca9Jens Axboe	int cur_files = td->files_index;
899bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe	char file_name[PATH_MAX];
900af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	struct fio_file *f;
901bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe	int len = 0;
902af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
903ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "add file %s\n", fname);
904ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
905f17c43928c202e557f2f325272c60d9050ee528eJens Axboe	f = smalloc(sizeof(*f));
906c48c0be79173897824d8f439c39374f2588931dcJens Axboe	if (!f) {
907c48c0be79173897824d8f439c39374f2588931dcJens Axboe		log_err("fio: smalloc OOM\n");
908c48c0be79173897824d8f439c39374f2588931dcJens Axboe		assert(0);
909c48c0be79173897824d8f439c39374f2588931dcJens Axboe	}
9100b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe
911af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	f->fd = -1;
912bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe
913fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe	if (td->files_size <= td->files_index) {
9144b341fca0dab0caa41d000e8db36f1530c26616fCarl Henrik Lunde		int new_size = td->o.nr_files + 1;
915126d65c6fc97d6acdc568aa5a969c012018daf15Jens Axboe
916fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe		dprint(FD_FILE, "resize file array to %d files\n", new_size);
917fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe
918fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe		td->files = realloc(td->files, new_size * sizeof(f));
919fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe		td->files_size = new_size;
920fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe	}
9218bb7679e73d3086a01b9d21a650b0d7a859412b6Jens Axboe	td->files[cur_files] = f;
922126d65c6fc97d6acdc568aa5a969c012018daf15Jens Axboe
92307eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe	/*
92407eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe	 * init function, io engine may not be loaded yet
92507eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe	 */
92607eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe	if (td->io_ops && (td->io_ops->flags & FIO_DISKLESSIO))
92707eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe		f->real_file_size = -1ULL;
92807eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe
929bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe	if (td->o.directory)
930bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe		len = sprintf(file_name, "%s/", td->o.directory);
931bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe
932bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe	sprintf(file_name + len, "%s", fname);
933f17c43928c202e557f2f325272c60d9050ee528eJens Axboe	f->file_name = smalloc_strdup(file_name);
934c48c0be79173897824d8f439c39374f2588931dcJens Axboe	if (!f->file_name) {
935c48c0be79173897824d8f439c39374f2588931dcJens Axboe		log_err("fio: smalloc OOM\n");
936c48c0be79173897824d8f439c39374f2588931dcJens Axboe		assert(0);
937c48c0be79173897824d8f439c39374f2588931dcJens Axboe	}
9380b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe
939e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboe	get_file_type(f);
940af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
9414d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	switch (td->o.file_lock_mode) {
9424d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	case FILE_LOCK_NONE:
9434d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		break;
9444d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	case FILE_LOCK_READWRITE:
9454d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		f->lock = fio_mutex_rw_init();
9464d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		break;
9474d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	case FILE_LOCK_EXCLUSIVE:
9484d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		f->lock = fio_mutex_init(1);
9494d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		break;
9504d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	default:
9514d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		log_err("fio: unknown lock mode: %d\n", td->o.file_lock_mode);
9524d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		assert(0);
9534d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	}
95429c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe
9557b4e4fe5e6fa26f82f9169c18ec70c08d0805ca9Jens Axboe	td->files_index++;
9561549441cdfecb2c1a4a8b8d494253859d67b4344Jens Axboe	if (f->filetype == FIO_TYPE_FILE)
9571549441cdfecb2c1a4a8b8d494253859d67b4344Jens Axboe		td->nr_normal_files++;
958f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
9595ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe	dprint(FD_FILE, "file %p \"%s\" added at %d\n", f, f->file_name,
9605ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe							cur_files);
9619efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe
962f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	return cur_files;
963af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe}
9640ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe
9650ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboevoid get_file(struct fio_file *f)
9660ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe{
9678172fe972f3a79d42f34d7f6e259ed3f7f800316Jens Axboe	dprint(FD_FILE, "get file %s, ref=%d\n", f->file_name, f->references);
968d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe	assert(fio_file_open(f));
9690ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	f->references++;
9700ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe}
9710ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe
9726977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboeint put_file(struct thread_data *td, struct fio_file *f)
9730ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe{
97498e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe	int f_ret = 0, ret = 0;
9756977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe
9768172fe972f3a79d42f34d7f6e259ed3f7f800316Jens Axboe	dprint(FD_FILE, "put file %s, ref=%d\n", f->file_name, f->references);
977ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
97822a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe	if (!fio_file_open(f)) {
97922a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe		assert(f->fd == -1);
9806977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe		return 0;
98122a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe	}
9820ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe
9830ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	assert(f->references);
9840ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	if (--f->references)
9856977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe		return 0;
9860ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe
987d424d4dd657eaf4aeb8ffb07a550a5f64940f41aJens Axboe	if (should_fsync(td) && td->o.fsync_on_close)
98898e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe		f_ret = fsync(f->fd);
989ebb1415f729c123b8a13bcbd667bf4b4cc95b4d4Jens Axboe
9900ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	if (td->io_ops->close_file)
9916977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe		ret = td->io_ops->close_file(td, f);
9921020a139beff50faf1bb18f761b024b664a09e14Jens Axboe
99398e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe	if (!ret)
994a5fb461fdff86c442daeebbd28e07984be9f3807Jens Axboe		ret = f_ret;
99598e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe
9960ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	td->nr_open_files--;
997d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe	fio_file_clear_open(f);
99822a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe	assert(f->fd == -1);
9996977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe	return ret;
10000ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe}
1001bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
10024d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid lock_file(struct thread_data *td, struct fio_file *f, enum fio_ddir ddir)
1003b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe{
10044d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (!f->lock || td->o.file_lock_mode == FILE_LOCK_NONE)
10054d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		return;
100629c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe
10074d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (f->lock_owner == td && f->lock_batch--)
10084d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		return;
10094d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
10104d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (td->o.file_lock_mode == FILE_LOCK_READWRITE) {
10114d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		if (ddir == DDIR_READ)
10124d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe			fio_mutex_down_read(f->lock);
10134d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		else
10144d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe			fio_mutex_down_write(f->lock);
10154d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	} else if (td->o.file_lock_mode == FILE_LOCK_EXCLUSIVE)
10164d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		fio_mutex_down(f->lock);
10174d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
10184d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	f->lock_owner = td;
10194d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	f->lock_batch = td->o.lockfile_batch;
10204d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	f->lock_ddir = ddir;
1021b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe}
1022b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe
10234d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid unlock_file(struct thread_data *td, struct fio_file *f)
1024b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe{
10254d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (!f->lock || td->o.file_lock_mode == FILE_LOCK_NONE)
10264d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		return;
10274d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (f->lock_batch)
10284d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		return;
10294d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
10304d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (td->o.file_lock_mode == FILE_LOCK_READWRITE) {
10314d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		const int is_read = f->lock_ddir == DDIR_READ;
10324d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		int val = fio_mutex_getval(f->lock);
103329c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe
10344d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		if ((is_read && val == 1) || (!is_read && val == -1))
10354d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe			f->lock_owner = NULL;
103629c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe
10374d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		if (is_read)
10384d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe			fio_mutex_up_read(f->lock);
10394d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		else
10404d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe			fio_mutex_up_write(f->lock);
10414d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	} else if (td->o.file_lock_mode == FILE_LOCK_EXCLUSIVE) {
10424d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		int val = fio_mutex_getval(f->lock);
10434d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
10444d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		if (val == 0)
10454d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe			f->lock_owner = NULL;
10464d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
10474d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		fio_mutex_up(f->lock);
104829c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe	}
1049b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe}
1050b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe
10514d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid unlock_file_all(struct thread_data *td, struct fio_file *f)
10524d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe{
10534d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (f->lock_owner != td)
10544d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		return;
10554d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
10564d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	f->lock_batch = 0;
10574d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	unlock_file(td, f);
10584d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe}
10594d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
1060bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboestatic int recurse_dir(struct thread_data *td, const char *dirname)
1061bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe{
1062bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	struct dirent *dir;
1063bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	int ret = 0;
1064bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	DIR *D;
1065bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1066bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	D = opendir(dirname);
1067bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	if (!D) {
10680ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		char buf[FIO_VERROR_SIZE];
10690ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe
10700ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		snprintf(buf, FIO_VERROR_SIZE - 1, "opendir(%s)", dirname);
10710ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		td_verror(td, errno, buf);
1072bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		return 1;
1073bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	}
1074bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1075bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	while ((dir = readdir(D)) != NULL) {
1076bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		char full_path[PATH_MAX];
1077bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		struct stat sb;
1078bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1079e85b2b83e39b64ba5cb73fbfddbf3902b6e84925Jens Axboe		if (!strcmp(dir->d_name, ".") || !strcmp(dir->d_name, ".."))
1080e85b2b83e39b64ba5cb73fbfddbf3902b6e84925Jens Axboe			continue;
108196d32d518a0743a6c050057bc1562e4883e51c5dJens Axboe
1082bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		sprintf(full_path, "%s/%s", dirname, dir->d_name);
1083bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1084bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		if (lstat(full_path, &sb) == -1) {
1085bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			if (errno != ENOENT) {
1086bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe				td_verror(td, errno, "stat");
1087bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe				return 1;
1088bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			}
1089bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		}
1090bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1091bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		if (S_ISREG(sb.st_mode)) {
1092bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			add_file(td, full_path);
10932dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe			td->o.nr_files++;
1094bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			continue;
1095bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		}
10960ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		if (!S_ISDIR(sb.st_mode))
10970ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe			continue;
1098bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
10995ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		ret = recurse_dir(td, full_path);
11005ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		if (ret)
1101bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			break;
1102bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	}
1103bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1104bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	closedir(D);
1105bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	return ret;
1106bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe}
1107bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1108bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboeint add_dir_files(struct thread_data *td, const char *path)
1109bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe{
11100ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe	int ret = recurse_dir(td, path);
11110ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe
11120ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe	if (!ret)
11130ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		log_info("fio: opendir added %d files\n", td->o.nr_files);
11140ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe
11150ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe	return ret;
1116bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe}
1117cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe
1118cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboevoid dup_files(struct thread_data *td, struct thread_data *org)
1119cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe{
1120cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	struct fio_file *f;
1121cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	unsigned int i;
11229efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe
11239efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe	dprint(FD_FILE, "dup files: %d\n", org->files_index);
1124cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe
1125cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	if (!org->files)
1126cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe		return;
1127cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe
11289efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe	td->files = malloc(org->files_index * sizeof(f));
1129cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe
11309efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe	for_each_file(org, f, i) {
1131b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe		struct fio_file *__f;
1132b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe
1133f17c43928c202e557f2f325272c60d9050ee528eJens Axboe		__f = smalloc(sizeof(*__f));
1134c48c0be79173897824d8f439c39374f2588931dcJens Axboe		if (!__f) {
1135c48c0be79173897824d8f439c39374f2588931dcJens Axboe			log_err("fio: smalloc OOM\n");
1136c48c0be79173897824d8f439c39374f2588931dcJens Axboe			assert(0);
1137c48c0be79173897824d8f439c39374f2588931dcJens Axboe		}
113822a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe		__f->fd = -1;
11390b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe
1140bc3456fa06cc7777c4764da8c7b1c0fd0a3c3772Aaron Carroll		if (f->file_name) {
1141f17c43928c202e557f2f325272c60d9050ee528eJens Axboe			__f->file_name = smalloc_strdup(f->file_name);
1142c48c0be79173897824d8f439c39374f2588931dcJens Axboe			if (!__f->file_name) {
1143c48c0be79173897824d8f439c39374f2588931dcJens Axboe				log_err("fio: smalloc OOM\n");
1144c48c0be79173897824d8f439c39374f2588931dcJens Axboe				assert(0);
1145c48c0be79173897824d8f439c39374f2588931dcJens Axboe			}
11460b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe
1147bc3456fa06cc7777c4764da8c7b1c0fd0a3c3772Aaron Carroll			__f->filetype = f->filetype;
1148bc3456fa06cc7777c4764da8c7b1c0fd0a3c3772Aaron Carroll		}
1149b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe
1150b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe		td->files[i] = __f;
1151cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	}
1152cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe}
1153f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
1154f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe/*
1155f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe * Returns the index that matches the filename, or -1 if not there
1156f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe */
1157f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboeint get_fileno(struct thread_data *td, const char *fname)
1158f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe{
1159f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	struct fio_file *f;
1160f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	unsigned int i;
1161f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
1162f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	for_each_file(td, f, i)
1163f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe		if (!strcmp(f->file_name, fname))
1164f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe			return i;
1165f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
1166f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	return -1;
1167f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe}
1168f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
1169f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe/*
1170f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe * For log usage, where we add/open/close files automatically
1171f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe */
1172f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboevoid free_release_files(struct thread_data *td)
1173f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe{
1174f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	close_files(td);
1175f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	td->files_index = 0;
1176f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	td->nr_normal_files = 0;
1177f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe}
1178