filesetup.c revision 1294c3ec7a02d20a98b105c1c41b23358afc67e4
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"
1553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
167172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboestatic int root_warn;
177172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe
18c592b9fe12d4739d99d5bece517e304804876df6Jens Axboestatic inline void clear_error(struct thread_data *td)
19c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe{
20c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe	td->error = 0;
21c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe	td->verror[0] = '\0';
22c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe}
23c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe
243baddf2450d811be658fb47ef883ee84478dc352Jens Axboe/*
253baddf2450d811be658fb47ef883ee84478dc352Jens Axboe * Leaves f->fd open on success, caller must close
263baddf2450d811be658fb47ef883ee84478dc352Jens Axboe */
277bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboestatic int extend_file(struct thread_data *td, struct fio_file *f)
2825205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe{
29ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe	int r, new_layout = 0, unlink_file = 0, flags;
3025205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe	unsigned long long left;
3125205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe	unsigned int bs;
3225205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe	char *b;
33b2a151925a91f38aeb298d693687a47269ad4e94Jens Axboe
344241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe	if (read_only) {
354241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe		log_err("fio: refusing extend of file due to read-only\n");
364241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe		return 0;
374241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe	}
384241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe
39507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	/*
40507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	 * check if we need to lay the file out complete again. fio
41507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	 * does that for operations involving reads, or for writes
42507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	 * where overwrite is set
43507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	 */
44ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe	if (td_read(td) || (td_write(td) && td->o.overwrite) ||
45ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe	    (td_write(td) && td->io_ops->flags & FIO_NOEXTEND))
46507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe		new_layout = 1;
47ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe	if (td_write(td) && !td->o.overwrite)
48ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe		unlink_file = 1;
49507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe
506ae1f57f2cb8661b97b770372eeb3694f6d5a744Jens Axboe	if (unlink_file || new_layout) {
51bd199f2b98eeb9101795e40fdef5889c630178c1Jens Axboe		dprint(FD_FILE, "layout unlink %s\n", f->file_name);
52982016d689dc7fedbb09646ba0df7e72a781b164Zhang, Yanmin		if ((unlink(f->file_name) < 0) && (errno != ENOENT)) {
537bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			td_verror(td, errno, "unlink");
547bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			return 1;
557bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		}
567bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
577bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
58507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	flags = O_WRONLY | O_CREAT;
59507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	if (new_layout)
60507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe		flags |= O_TRUNC;
61507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe
62ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "open file %s, flags %x\n", f->file_name, flags);
63507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	f->fd = open(f->file_name, flags, 0644);
6453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (f->fd < 0) {
65e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, errno, "open");
6653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return 1;
6753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
6853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
697bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe#ifdef FIO_HAVE_FALLOCATE
707bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe	if (td->o.fallocate && !td->o.fill_device) {
717bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe		dprint(FD_FILE, "fallocate file %s size %llu\n", f->file_name,
727bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe							f->real_file_size);
737bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe
747bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe		r = posix_fallocate(f->fd, 0, f->real_file_size);
7510accd7cf68af21ef4831528626a75ba7a06ce81Greg Edwards		if (r > 0) {
767bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe			log_err("fio: posix_fallocate fails: %s\n",
7710accd7cf68af21ef4831528626a75ba7a06ce81Greg Edwards					strerror(r));
787bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe		}
797bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe	}
807bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe#endif
819b8365618309572d8fd2579c8ea3132db89f843fBruce Cran
82fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis	if (!new_layout)
83fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis		goto done;
84fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis
855e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	/*
865e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	 * The size will be -1ULL when fill_device is used, so don't truncate
875e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	 * or fallocate this file, just write it
885e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	 */
895e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	if (!td->o.fill_device) {
905e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe		dprint(FD_FILE, "truncate file %s, size %llu\n", f->file_name,
91ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe							f->real_file_size);
925e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe		if (ftruncate(f->fd, f->real_file_size) == -1) {
935e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			td_verror(td, errno, "ftruncate");
945e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			goto err;
955e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe		}
965e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	}
9740f8298cd252157fa15d93f8eb470116a94069a0Jens Axboe
982dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	b = malloc(td->o.max_bs[DDIR_WRITE]);
992dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	memset(b, 0, td->o.max_bs[DDIR_WRITE]);
10053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
1017bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	left = f->real_file_size;
10253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	while (left && !td->terminate) {
1032dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe		bs = td->o.max_bs[DDIR_WRITE];
10453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		if (bs > left)
10553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			bs = left;
10653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
10753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		r = write(f->fd, b, bs);
10853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
1095e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe		if (r > 0) {
1105e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			left -= r;
11153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			continue;
11253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		} else {
1135e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			if (r < 0) {
1145e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe				int __e = errno;
1155e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe
1165e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe				if (__e == ENOSPC) {
1175e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe					if (td->o.fill_device)
1185e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe						break;
1195e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe					log_info("fio: ENOSPC on laying out "
1205e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe						 "file, stopping\n");
1215e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe					break;
1225e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe				}
123e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe				td_verror(td, errno, "write");
1245e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			} else
125e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe				td_verror(td, EIO, "write");
12653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
12753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			break;
12853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		}
12953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
13053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
131ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe	if (td->terminate) {
132ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe		dprint(FD_FILE, "terminate unlink %s\n", f->file_name);
13353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		unlink(f->file_name);
134ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe	} else if (td->o.create_fsync) {
13598e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe		if (fsync(f->fd) < 0) {
13698e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe			td_verror(td, errno, "fsync");
13798e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe			goto err;
13898e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe		}
13998e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe	}
1400d1cd207e409a36313784cb9596990c819775f77Jens Axboe	if (td->o.fill_device && !td_write(td)) {
141d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe		fio_file_clear_size_known(f);
1425e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe		if (td_io_get_file_size(td, f))
1435e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			goto err;
1445e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe		if (f->io_size > f->real_file_size)
1455e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			f->io_size = f->real_file_size;
1465e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	}
14753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
14853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	free(b);
149507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboedone:
15053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
15153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboeerr:
15253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	close(f->fd);
15353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	f->fd = -1;
15453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 1;
15553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
15653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
157afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanminstatic int pre_read_file(struct thread_data *td, struct fio_file *f)
158afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin{
159b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe	int r, did_open = 0, old_runstate;
160afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	unsigned long long left;
161afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	unsigned int bs;
162afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	char *b;
163afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
1649c0d224129b0c59698e4c77e7fed00dc8cbb50e1Jens Axboe	if (td->io_ops->flags & FIO_PIPEIO)
1659c0d224129b0c59698e4c77e7fed00dc8cbb50e1Jens Axboe		return 0;
1669c0d224129b0c59698e4c77e7fed00dc8cbb50e1Jens Axboe
167d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe	if (!fio_file_open(f)) {
168b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe		if (td->io_ops->open_file(td, f)) {
169b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe			log_err("fio: cannot pre-read, failed to open file\n");
170b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe			return 1;
171b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe		}
172b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe		did_open = 1;
173b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe	}
174b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe
175b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe	old_runstate = td->runstate;
176b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe	td_set_runstate(td, TD_PRE_READING);
177b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe
178afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	bs = td->o.max_bs[DDIR_READ];
179afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	b = malloc(bs);
180afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	memset(b, 0, bs);
181afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
182afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	lseek(f->fd, f->file_offset, SEEK_SET);
183afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	left = f->io_size;
184afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
185afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	while (left && !td->terminate) {
186afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin		if (bs > left)
187afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin			bs = left;
188afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
189afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin		r = read(f->fd, b, bs);
190afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
191afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin		if (r == (int) bs) {
192afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin			left -= bs;
193afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin			continue;
194afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin		} else {
195afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin			td_verror(td, EIO, "pre_read");
196afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin			break;
197afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin		}
198afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	}
199afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
200b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe	td_set_runstate(td, old_runstate);
201b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe
202b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe	if (did_open)
203b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe		td->io_ops->close_file(td, f);
204afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	free(b);
205afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	return 0;
206afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin}
207afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
2087bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboestatic unsigned long long get_rand_file_size(struct thread_data *td)
2099c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe{
210dc873b6f4a536c332b72cce268d5a7ccd356a891Jens Axboe	unsigned long long ret, sized;
2111294c3ec7a02d20a98b105c1c41b23358afc67e4Jens Axboe	unsigned long r;
2129c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe
2134c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe	if (td->o.use_os_rand) {
2144c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe		r = os_random_long(&td->file_size_state);
2154c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe		sized = td->o.file_size_high - td->o.file_size_low;
2164c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe		ret = (unsigned long long) ((double) sized * (r / (OS_RAND_MAX + 1.0)));
2174c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe	} else {
2184c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe		r = __rand(&td->__file_size_state);
2194c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe		sized = td->o.file_size_high - td->o.file_size_low;
2204c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe		ret = (unsigned long long) ((double) sized * (r / (FRAND_MAX + 1.0)));
2214c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe	}
2224c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe
2235ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe	ret += td->o.file_size_low;
2242dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	ret -= (ret % td->o.rw_min_bs);
2259c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe	return ret;
2269c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe}
2279c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe
22853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int file_size(struct thread_data *td, struct fio_file *f)
22953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
23053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	struct stat st;
23153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
232df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe	if (stat(f->file_name, &st) == -1) {
2337bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		td_verror(td, errno, "fstat");
2347bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		return 1;
2357bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
23653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
2377bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	f->real_file_size = st.st_size;
23853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
23953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
24053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
24153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int bdev_size(struct thread_data *td, struct fio_file *f)
24253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
2439b8365618309572d8fd2579c8ea3132db89f843fBruce Cran	unsigned long long bytes = 0;
24453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	int r;
24553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
246df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe	if (td->io_ops->open_file(td, f)) {
247df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe		log_err("fio: failed opening blockdev %s for size check\n",
248df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe			f->file_name);
249df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe		return 1;
250df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe	}
251df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe
252ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran	r = blockdev_size(f, &bytes);
25353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (r) {
254e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, r, "blockdev_size");
2550e238572c4e63b0675fd9cbbf168d19ad8d60464Jens Axboe		printf("fd is %d\n", f->fd);
256df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe		goto err;
25753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
25853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
2597ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe	if (!bytes) {
2607ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe		log_err("%s: zero sized block device?\n", f->file_name);
261df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe		goto err;
2627ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe	}
2637ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe
26453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	f->real_file_size = bytes;
26522a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe	td->io_ops->close_file(td, f);
26653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
267df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboeerr:
268df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe	td->io_ops->close_file(td, f);
269df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe	return 1;
27053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
27153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
2724ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboestatic int char_size(struct thread_data *td, struct fio_file *f)
2734ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe{
2744ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe#ifdef FIO_HAVE_CHARDEV_SIZE
2759b8365618309572d8fd2579c8ea3132db89f843fBruce Cran	unsigned long long bytes = 0;
2764ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	int r;
2774ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe
2784ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	if (td->io_ops->open_file(td, f)) {
2794ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		log_err("fio: failed opening blockdev %s for size check\n",
2804ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe			f->file_name);
2814ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		return 1;
2824ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	}
2834ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe
284ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran	r = chardev_size(f, &bytes);
2854ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	if (r) {
2864ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		td_verror(td, r, "chardev_size");
2874ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		goto err;
2884ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	}
2894ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe
2904ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	if (!bytes) {
2914ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		log_err("%s: zero sized char device?\n", f->file_name);
2924ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		goto err;
2934ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	}
2944ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe
2954ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	f->real_file_size = bytes;
2964ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	td->io_ops->close_file(td, f);
2974ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	return 0;
2984ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboeerr:
2994ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	td->io_ops->close_file(td, f);
3004ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	return 1;
3014ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe#else
3024ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	f->real_file_size = -1ULL;
3034ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	return 0;
3044ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe#endif
3054ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe}
3064ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe
30753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int get_file_size(struct thread_data *td, struct fio_file *f)
30853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
30953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	int ret = 0;
31053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
311d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe	if (fio_file_size_known(f))
312409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe		return 0;
313409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe
3147bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (f->filetype == FIO_TYPE_FILE)
3157bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		ret = file_size(td, f);
3167bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	else if (f->filetype == FIO_TYPE_BD)
31753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		ret = bdev_size(td, f);
3184ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	else if (f->filetype == FIO_TYPE_CHAR)
3194ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		ret = char_size(td, f);
32053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	else
32153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		f->real_file_size = -1;
32253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
32353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (ret)
32453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return ret;
32553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
32653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (f->file_offset > f->real_file_size) {
3270f2152c19ed12fc2280c3d475973112f18e48cd5Bruce Cran		log_err("%s: offset extends end (%llu > %llu)\n", td->o.name,
3285ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe					f->file_offset, f->real_file_size);
32953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return 1;
33053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
33153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
332d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe	fio_file_set_size_known(f);
33353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
33453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
33553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
3363baddf2450d811be658fb47ef883ee84478dc352Jens Axboestatic int __file_invalidate_cache(struct thread_data *td, struct fio_file *f,
3373baddf2450d811be658fb47ef883ee84478dc352Jens Axboe				   unsigned long long off,
3383baddf2450d811be658fb47ef883ee84478dc352Jens Axboe				   unsigned long long len)
339e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe{
340e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	int ret = 0;
341e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
3425e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	if (len == -1ULL)
3433baddf2450d811be658fb47ef883ee84478dc352Jens Axboe		len = f->io_size;
3443baddf2450d811be658fb47ef883ee84478dc352Jens Axboe	if (off == -1ULL)
3453baddf2450d811be658fb47ef883ee84478dc352Jens Axboe		off = f->file_offset;
346ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
3470d1cd207e409a36313784cb9596990c819775f77Jens Axboe	if (len == -1ULL || off == -1ULL)
3480d1cd207e409a36313784cb9596990c819775f77Jens Axboe		return 0;
3490d1cd207e409a36313784cb9596990c819775f77Jens Axboe
3503baddf2450d811be658fb47ef883ee84478dc352Jens Axboe	dprint(FD_IO, "invalidate cache %s: %llu/%llu\n", f->file_name, off,
3513baddf2450d811be658fb47ef883ee84478dc352Jens Axboe								len);
352b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe
353e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	/*
354e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	 * FIXME: add blockdev flushing too
355e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	 */
356a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe	if (f->mmap_ptr) {
35703e20d687566753b90383571e5e152c5142bdffdBruce Cran		ret = posix_madvise(f->mmap_ptr, f->mmap_sz, POSIX_MADV_DONTNEED);
358a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe#ifdef FIO_MADV_FREE
35903e20d687566753b90383571e5e152c5142bdffdBruce Cran		(void) posix_madvise(f->mmap_ptr, f->mmap_sz, FIO_MADV_FREE);
360a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe#endif
361a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe	} else if (f->filetype == FIO_TYPE_FILE) {
362ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran		ret = posix_fadvise(f->fd, off, len, POSIX_FADV_DONTNEED);
3635ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe	} else if (f->filetype == FIO_TYPE_BD) {
364ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran		ret = blockdev_invalidate_cache(f);
3657e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe		if (ret < 0 && errno == EACCES && geteuid()) {
3667172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe			if (!root_warn) {
3675ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				log_err("fio: only root may flush block "
3685ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe					"devices. Cache flush bypassed!\n");
3697172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe				root_warn = 1;
3707172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe			}
3717e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe			ret = 0;
3727e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe		}
373b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe	} else if (f->filetype == FIO_TYPE_CHAR || f->filetype == FIO_TYPE_PIPE)
374e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe		ret = 0;
375e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
376e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	if (ret < 0) {
377e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, errno, "invalidate_cache");
378e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe		return 1;
3793baddf2450d811be658fb47ef883ee84478dc352Jens Axboe	} else if (ret > 0) {
3803baddf2450d811be658fb47ef883ee84478dc352Jens Axboe		td_verror(td, ret, "invalidate_cache");
3813baddf2450d811be658fb47ef883ee84478dc352Jens Axboe		return 1;
382e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	}
383e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
384ad2da605a62faf16887970618b434db19594e17bJens Axboe	return ret;
3853baddf2450d811be658fb47ef883ee84478dc352Jens Axboe
3863baddf2450d811be658fb47ef883ee84478dc352Jens Axboe}
3873baddf2450d811be658fb47ef883ee84478dc352Jens Axboe
3883baddf2450d811be658fb47ef883ee84478dc352Jens Axboeint file_invalidate_cache(struct thread_data *td, struct fio_file *f)
3893baddf2450d811be658fb47ef883ee84478dc352Jens Axboe{
390d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe	if (!fio_file_open(f))
391a5fb461fdff86c442daeebbd28e07984be9f3807Jens Axboe		return 0;
392a5fb461fdff86c442daeebbd28e07984be9f3807Jens Axboe
3935e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	return __file_invalidate_cache(td, f, -1ULL, -1ULL);
394e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe}
395e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
3966977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboeint generic_close_file(struct thread_data fio_unused *td, struct fio_file *f)
39753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
3986977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe	int ret = 0;
3996977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe
400ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "fd close %s\n", f->file_name);
4014906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe
4024906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe	remove_file_hash(f);
4034906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe
4046977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe	if (close(f->fd) < 0)
4056977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe		ret = errno;
4066977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe
407b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe	f->fd = -1;
4086977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe	return ret;
40953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
41053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
4114d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboestatic int file_lookup_open(struct fio_file *f, int flags)
41253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
41329c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe	struct fio_file *__f;
4144d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	int from_hash;
4154d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
4164d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	__f = lookup_file_hash(f->file_name);
4174d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (__f) {
4189efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe		dprint(FD_FILE, "found file in hash %s\n", f->file_name);
4194d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		/*
4204d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		 * racy, need the __f->lock locked
4214d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		 */
4224d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		f->lock = __f->lock;
4234d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		f->lock_owner = __f->lock_owner;
4244d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		f->lock_batch = __f->lock_batch;
4254d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		f->lock_ddir = __f->lock_ddir;
4264d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		from_hash = 1;
4274d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	} else {
4289efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe		dprint(FD_FILE, "file not found in hash %s\n", f->file_name);
4294d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		from_hash = 0;
4304d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	}
4314d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
432e8670ef8b26039573fbf835b4b95ba45a1039d83Jens Axboe	f->fd = open(f->file_name, flags, 0600);
4334d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	return from_hash;
4344d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe}
4354d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
4364d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboeint generic_open_file(struct thread_data *td, struct fio_file *f)
4374d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe{
438661598287ecc3b8987f312cf8403936552ce686aJens Axboe	int is_std = 0;
43953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	int flags = 0;
44029c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe	int from_hash = 0;
44153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
442ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "fd open %s\n", f->file_name);
443ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
444661598287ecc3b8987f312cf8403936552ce686aJens Axboe	if (!strcmp(f->file_name, "-")) {
445661598287ecc3b8987f312cf8403936552ce686aJens Axboe		if (td_rw(td)) {
446661598287ecc3b8987f312cf8403936552ce686aJens Axboe			log_err("fio: can't read/write to stdin/out\n");
447661598287ecc3b8987f312cf8403936552ce686aJens Axboe			return 1;
448661598287ecc3b8987f312cf8403936552ce686aJens Axboe		}
449661598287ecc3b8987f312cf8403936552ce686aJens Axboe		is_std = 1;
450ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe
451ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe		/*
452ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe		 * move output logging to stderr, if we are writing to stdout
453ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe		 */
454ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe		if (td_write(td))
455ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe			f_out = stderr;
456661598287ecc3b8987f312cf8403936552ce686aJens Axboe	}
457661598287ecc3b8987f312cf8403936552ce686aJens Axboe
4582dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	if (td->o.odirect)
4592fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe		flags |= OS_O_DIRECT;
4602dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	if (td->o.sync_io)
4612fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe		flags |= O_SYNC;
462ad92396cc21055cee93470dcf65e82ccde03aac5Jens Axboe	if (f->filetype != FIO_TYPE_FILE)
4635921e80c5dfc9f96d2f21da6ae58f2b5d3a0b373Jens Axboe		flags |= FIO_O_NOATIME;
464814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe	if (td->o.create_on_open)
465814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe		flags |= O_CREAT;
46653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
467056f3459149a7670257350d84b49858718e4a0e6Aaron Carrollopen_again:
468660a1cb5fb9843ec09a04337714e78d63cd557e7Jens Axboe	if (td_write(td)) {
469173081581f94dc4f9f203eb7a7922fc843bfafdeJens Axboe		if (!read_only)
470173081581f94dc4f9f203eb7a7922fc843bfafdeJens Axboe			flags |= O_RDWR;
47153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
472af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe		if (f->filetype == FIO_TYPE_FILE)
4732fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe			flags |= O_CREAT;
4742fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe
475661598287ecc3b8987f312cf8403936552ce686aJens Axboe		if (is_std)
476661598287ecc3b8987f312cf8403936552ce686aJens Axboe			f->fd = dup(STDOUT_FILENO);
4774d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		else
4784d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe			from_hash = file_lookup_open(f, flags);
4792fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe	} else {
4804241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe		if (f->filetype == FIO_TYPE_CHAR && !read_only)
4812fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe			flags |= O_RDWR;
4822fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe		else
4832fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe			flags |= O_RDONLY;
4842fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe
485661598287ecc3b8987f312cf8403936552ce686aJens Axboe		if (is_std)
486661598287ecc3b8987f312cf8403936552ce686aJens Axboe			f->fd = dup(STDIN_FILENO);
4874d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		else
4884d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe			from_hash = file_lookup_open(f, flags);
48953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
49053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
49153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (f->fd == -1) {
492e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe		char buf[FIO_VERROR_SIZE];
493e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		int __e = errno;
494e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe
495835d9b9ed0e5c2591b8a3eacbd5f4ab6bdab466cJens Axboe		if (__e == EPERM && (flags & FIO_O_NOATIME)) {
4965921e80c5dfc9f96d2f21da6ae58f2b5d3a0b373Jens Axboe			flags &= ~FIO_O_NOATIME;
497056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll			goto open_again;
498056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll		}
499056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll
500e8670ef8b26039573fbf835b4b95ba45a1039d83Jens Axboe		snprintf(buf, sizeof(buf) - 1, "open(%s)", f->file_name);
501e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe
502e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe		td_verror(td, __e, buf);
50353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
50453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
50529c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe	if (!from_hash && f->fd != -1) {
50629c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe		if (add_file_hash(f)) {
50729c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe			int ret;
50829c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe
50929c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe			/*
51029c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe			 * OK to ignore, we haven't done anything with it
51129c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe			 */
51229c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe			ret = generic_close_file(td, f);
51329c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe			goto open_again;
51429c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe		}
51529c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe	}
5164906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe
51753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
518b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe}
519b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe
520df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboeint generic_get_file_size(struct thread_data *td, struct fio_file *f)
52121972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe{
522df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe	return get_file_size(td, f);
52321972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe}
52421972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe
5257bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe/*
5267bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * open/close all files, so that ->real_file_size gets set
5277bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */
528bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboestatic int get_file_sizes(struct thread_data *td)
5297bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe{
5307bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	struct fio_file *f;
5317bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	unsigned int i;
532bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe	int err = 0;
5337bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
5347bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	for_each_file(td, f, i) {
5355ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		dprint(FD_FILE, "get file size for %p/%d/%p\n", f, i,
5365ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe								f->file_name);
5379efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe
53899a47c6905731e53dd4d8f7ea6501f36d9329e7bJens Axboe		if (td_io_get_file_size(td, f)) {
53940b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe			if (td->error != ENOENT) {
54040b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe				log_err("%s\n", td->verror);
54140b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe				err = 1;
54240b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe			}
543541d66d70b8fbe9860b31307c0760e6d5f4c78a8Jens Axboe			clear_error(td);
54407eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe		}
545409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe
546409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe		if (f->real_file_size == -1ULL && td->o.size)
547409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe			f->real_file_size = td->o.size / td->o.nr_files;
5487bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
549bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe
550bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe	return err;
5517bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe}
5527bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
5532e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboestruct fio_mount {
5542e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	struct flist_head list;
5552e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	const char *base;
5562e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	char __base[256];
5572e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	unsigned int key;
5582e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe};
5592e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
5602e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe/*
5612e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe * Get free number of bytes for each file on each unique mount.
5622e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe */
5632e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboestatic unsigned long long get_fs_free_counts(struct thread_data *td)
5642e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe{
5652e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	struct flist_head *n, *tmp;
56668b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe	unsigned long long ret = 0;
5672e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	struct fio_mount *fm;
5682e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	FLIST_HEAD(list);
5692e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	struct fio_file *f;
5702e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	unsigned int i;
5712e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
5722e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	for_each_file(td, f, i) {
5732e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		struct stat sb;
5742e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		char buf[256];
5752e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
5764ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		if (f->filetype == FIO_TYPE_BD || f->filetype == FIO_TYPE_CHAR) {
5774ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe			if (f->real_file_size != -1ULL)
5784ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe				ret += f->real_file_size;
57968b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe			continue;
58068b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe		} else if (f->filetype != FIO_TYPE_FILE)
58168b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe			continue;
58268b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe
5832e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		strcpy(buf, f->file_name);
5842e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
5852e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		if (stat(buf, &sb) < 0) {
5862e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			if (errno != ENOENT)
5872e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe				break;
5882e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			strcpy(buf, ".");
5892e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			if (stat(buf, &sb) < 0)
5902e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe				break;
5912e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		}
5922e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
5932e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		fm = NULL;
5942e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		flist_for_each(n, &list) {
5952e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			fm = flist_entry(n, struct fio_mount, list);
5962e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			if (fm->key == sb.st_dev)
5972e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe				break;
5982e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
5992e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			fm = NULL;
6002e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		}
6012e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
6022e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		if (fm)
6032e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			continue;
6042e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
6052e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		fm = malloc(sizeof(*fm));
6062e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		strcpy(fm->__base, buf);
6072e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		fm->base = basename(fm->__base);
6082e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		fm->key = sb.st_dev;
6092e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		flist_add(&fm->list, &list);
6102e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	}
6112e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
6122e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	flist_for_each_safe(n, tmp, &list) {
6132e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		unsigned long long sz;
6142e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
6152e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		fm = flist_entry(n, struct fio_mount, list);
6162e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		flist_del(&fm->list);
6172e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
6182e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		sz = get_fs_size(fm->base);
6192e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		if (sz && sz != -1ULL)
6202e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			ret += sz;
6212e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
6222e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		free(fm);
6232e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	}
6242e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
6252e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	return ret;
6262e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe}
6272e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
6287bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe/*
6297bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * Open the files and setup files sizes, creating files if necessary.
6307bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */
63153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboeint setup_files(struct thread_data *td)
63253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
6337bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	unsigned long long total_size, extend_size;
63453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	struct fio_file *f;
635af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	unsigned int i;
636000b080395e45cbe0ce54e75f0e993addbdc8676Jens Axboe	int err = 0, need_extend;
63753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
638ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "setup files\n");
639ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
640691c8fb014da9dd82e999a90b5511423f4eee188Jens Axboe	if (td->o.read_iolog_file)
641691c8fb014da9dd82e999a90b5511423f4eee188Jens Axboe		return 0;
642691c8fb014da9dd82e999a90b5511423f4eee188Jens Axboe
64353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	/*
64453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	 * if ioengine defines a setup() method, it's responsible for
6457bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * opening the files and setting f->real_file_size to indicate
6467bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * the valid range for that file.
64753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	 */
64853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (td->io_ops->setup)
6497bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		err = td->io_ops->setup(td);
6507bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	else
651bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe		err = get_file_sizes(td);
65253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
653f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe	if (err)
654f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe		return err;
655f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe
6560a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe	/*
6577bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * check sizes. if the files/devices do not exist and the size
6587bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * isn't passed to fio, abort.
6590a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe	 */
6607bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	total_size = 0;
6617bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	for_each_file(td, f, i) {
6627bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		if (f->real_file_size == -1ULL)
6637bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			total_size = -1ULL;
6647bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		else
6657bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			total_size += f->real_file_size;
6667bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
6670a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe
6682e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	if (td->o.fill_device)
6692e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		td->fill_device_size = get_fs_free_counts(td);
6702e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
6717bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	/*
6727bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * device/file sizes are zero and no size given, punt
6737bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 */
6741f809d151ddc4a4c348c2e4f6007db510e3e08a2Jens Axboe	if ((!total_size || total_size == -1ULL) && !td->o.size &&
675aa31f1f108348ba2a8749c73fa8c25f3d4630a7cShawn Lewis	    !(td->io_ops->flags & FIO_NOIO) && !td->o.fill_device) {
6767bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		log_err("%s: you need to specify size=\n", td->o.name);
677e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, EINVAL, "total_file_size");
67853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return 1;
67953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
68053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
6817bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	/*
6827bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * now file sizes are known, so we can set ->io_size. if size= is
6837bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * not given, ->io_size is just equal to ->real_file_size. if size
6847bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * is given, ->io_size is size / nr_files.
6857bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 */
6867bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	extend_size = total_size = 0;
6877bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	need_extend = 0;
6887bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	for_each_file(td, f, i) {
689bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang		f->file_offset = td->o.start_offset;
690bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang
6917bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		if (!td->o.file_size_low) {
6927bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			/*
6937bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * no file size range given, file size is equal to
6947bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * total size divided by number of files. if that is
6957bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * zero, set it to the real file size.
6967bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 */
6977bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			f->io_size = td->o.size / td->o.nr_files;
69865bdb10a09222d8b5d213de74824be775772ea8fJens Axboe			if (!f->io_size)
699273f8c912d981439049d9b21aa048aaeaa323c5dJens Axboe				f->io_size = f->real_file_size - f->file_offset;
7007bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		} else if (f->real_file_size < td->o.file_size_low ||
7017bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			   f->real_file_size > td->o.file_size_high) {
7025ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			if (f->file_offset > td->o.file_size_low)
703bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang				goto err_offset;
7047bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			/*
7057bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * file size given. if it's fixed, use that. if it's a
7067bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * range, generate a random size in-between.
7077bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 */
7085ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			if (td->o.file_size_low == td->o.file_size_high) {
7095ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				f->io_size = td->o.file_size_low
7105ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe						- f->file_offset;
7115ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			} else {
7125ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				f->io_size = get_rand_file_size(td)
7135ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe						- f->file_offset;
7145ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			}
71565bdb10a09222d8b5d213de74824be775772ea8fJens Axboe		} else
716bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang			f->io_size = f->real_file_size - f->file_offset;
71753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
7187bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		if (f->io_size == -1ULL)
7197bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			total_size = -1ULL;
7207bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		else
7217bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			total_size += f->io_size;
7227bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
7237bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		if (f->filetype == FIO_TYPE_FILE &&
724bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang		    (f->io_size + f->file_offset) > f->real_file_size &&
7257bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		    !(td->io_ops->flags & FIO_DISKLESSIO)) {
726814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe			if (!td->o.create_on_open) {
727814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe				need_extend++;
728814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe				extend_size += (f->io_size + f->file_offset);
729814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe			} else
730814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe				f->real_file_size = f->io_size + f->file_offset;
731d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe			fio_file_set_extend(f);
7325ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		}
7337bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
73453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
7352298290eabbe1017421a6ba0f5de93d8c2b048adljzhang,Yaxin Hu,Jianchao Tang	if (!td->o.size || td->o.size > total_size)
7367bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		td->o.size = total_size;
73721972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe
7387bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	/*
7397bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * See if we need to extend some files
7407bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 */
7417bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (need_extend) {
7427bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		temp_stall_ts = 1;
743a7ba8c5f4c0f9fe117d529c1ad6686b2070bae51Shaozhi Shawn Ye		if (!terse_output)
744a7ba8c5f4c0f9fe117d529c1ad6686b2070bae51Shaozhi Shawn Ye			log_info("%s: Laying out IO file(s) (%u file(s) /"
7450f2152c19ed12fc2280c3d475973112f18e48cd5Bruce Cran				 " %lluMB)\n", td->o.name, need_extend,
746a7ba8c5f4c0f9fe117d529c1ad6686b2070bae51Shaozhi Shawn Ye					extend_size >> 20);
7477bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
7487bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		for_each_file(td, f, i) {
7495e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			unsigned long long old_len = -1ULL, extend_len = -1ULL;
7503baddf2450d811be658fb47ef883ee84478dc352Jens Axboe
751d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe			if (!fio_file_extend(f))
7527bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe				continue;
7537bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
754409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe			assert(f->filetype == FIO_TYPE_FILE);
755d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe			fio_file_clear_extend(f);
7565e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			if (!td->o.fill_device) {
7575e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe				old_len = f->real_file_size;
7580b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe				extend_len = f->io_size + f->file_offset -
7590b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe						old_len;
7605e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			}
761bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang			f->real_file_size = (f->io_size + f->file_offset);
7627bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			err = extend_file(td, f);
7637bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			if (err)
7643baddf2450d811be658fb47ef883ee84478dc352Jens Axboe				break;
7655e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe
7663baddf2450d811be658fb47ef883ee84478dc352Jens Axboe			err = __file_invalidate_cache(td, f, old_len,
7673baddf2450d811be658fb47ef883ee84478dc352Jens Axboe								extend_len);
7683baddf2450d811be658fb47ef883ee84478dc352Jens Axboe			close(f->fd);
7693baddf2450d811be658fb47ef883ee84478dc352Jens Axboe			f->fd = -1;
7703baddf2450d811be658fb47ef883ee84478dc352Jens Axboe			if (err)
7717bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe				break;
7727bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		}
7737bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		temp_stall_ts = 0;
7747bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
7757bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
7767bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (err)
7777bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		return err;
7787bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
7797bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (!td->o.zone_size)
7807bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		td->o.zone_size = td->o.size;
7817bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
782ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe	/*
783ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe	 * iolog already set the total io size, if we read back
784ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe	 * stored entries.
785ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe	 */
786ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe	if (!td->o.read_iolog_file)
787ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe		td->total_io_size = td->o.size * td->o.loops;
7887bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	return 0;
789bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tangerr_offset:
790bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang	log_err("%s: you need to specify valid offset=\n", td->o.name);
791bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang	return 1;
79253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
79353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
794afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanminint pre_read_files(struct thread_data *td)
795afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin{
796afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	struct fio_file *f;
797afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	unsigned int i;
798afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
799afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	dprint(FD_FILE, "pre_read files\n");
800afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
801afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	for_each_file(td, f, i) {
802afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin		pre_read_file(td, f);
803afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	}
804afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
805afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	return 1;
806afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin}
807afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
808687270767de17dbad53c50e03e5d73d52505405cJens Axboeint init_random_map(struct thread_data *td)
809687270767de17dbad53c50e03e5d73d52505405cJens Axboe{
810509eab12448823a8eefbe925804b5308ee63bf5eJens Axboe	unsigned long long blocks, num_maps;
811687270767de17dbad53c50e03e5d73d52505405cJens Axboe	struct fio_file *f;
812687270767de17dbad53c50e03e5d73d52505405cJens Axboe	unsigned int i;
813687270767de17dbad53c50e03e5d73d52505405cJens Axboe
814de8dd119d7d869dd9c90c6d62bf4bededd10642eJens Axboe	if (td->o.norandommap || !td_random(td))
815687270767de17dbad53c50e03e5d73d52505405cJens Axboe		return 0;
816687270767de17dbad53c50e03e5d73d52505405cJens Axboe
817687270767de17dbad53c50e03e5d73d52505405cJens Axboe	for_each_file(td, f, i) {
8185ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		blocks = (f->real_file_size + td->o.rw_min_bs - 1) /
8195ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				(unsigned long long) td->o.rw_min_bs;
8205ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		num_maps = (blocks + BLOCKS_PER_MAP - 1) /
8215ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				(unsigned long long) BLOCKS_PER_MAP;
8220ce8b119b65849e537cab628a176a0ec4238aab0Jens Axboe		f->file_map = smalloc(num_maps * sizeof(unsigned long));
823303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe		if (f->file_map) {
824303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe			f->num_maps = num_maps;
825303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe			continue;
826687270767de17dbad53c50e03e5d73d52505405cJens Axboe		}
8272b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe		if (!td->o.softrandommap) {
8285ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			log_err("fio: failed allocating random map. If running"
8295ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				" a large number of jobs, try the 'norandommap'"
8302b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe				" option or set 'softrandommap'. Or give"
8312b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe				" a larger --alloc-size to fio.\n");
832687270767de17dbad53c50e03e5d73d52505405cJens Axboe			return 1;
833687270767de17dbad53c50e03e5d73d52505405cJens Axboe		}
834303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe
835303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe		log_info("fio: file %s failed allocating random map. Running "
836303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe			 "job without.\n", f->file_name);
837303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe		f->num_maps = 0;
838687270767de17dbad53c50e03e5d73d52505405cJens Axboe	}
839687270767de17dbad53c50e03e5d73d52505405cJens Axboe
840687270767de17dbad53c50e03e5d73d52505405cJens Axboe	return 0;
841687270767de17dbad53c50e03e5d73d52505405cJens Axboe}
842687270767de17dbad53c50e03e5d73d52505405cJens Axboe
84353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboevoid close_files(struct thread_data *td)
84453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
8450ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe	struct fio_file *f;
846af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	unsigned int i;
84753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
8482be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe	for_each_file(td, f, i) {
8492be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe		if (fio_file_open(f))
8502be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe			td_io_close_file(td, f);
8512be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe	}
85224ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe}
85324ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe
85424ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboevoid close_and_free_files(struct thread_data *td)
85524ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe{
85624ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe	struct fio_file *f;
85724ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe	unsigned int i;
85824ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe
859ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "close files\n");
860ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
8610ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe	for_each_file(td, f, i) {
862ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe		if (td->o.unlink && f->filetype == FIO_TYPE_FILE) {
863ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe			dprint(FD_FILE, "free unlink %s\n", f->file_name);
864132ad46d22bcf12da95ad69e03c1b6f23f5e60a9Jens Axboe			unlink(f->file_name);
865ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe		}
866bdb4e2e99d4a87e5d3677cc09aa1ce92135125a9Jens Axboe
86722a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe		if (fio_file_open(f))
86822a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe			td_io_close_file(td, f);
86922a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe
870b9fbcf2104ab79127825e0c23ba0a147ec076087Shaozhi Shawn Ye		remove_file_hash(f);
871b3dc7f075b85e004f8c681ebb8566475017696f3Jens Axboe
872f17c43928c202e557f2f325272c60d9050ee528eJens Axboe		sfree(f->file_name);
873fa1da8653e2177b3cc31a91e963c389f079d4172Jens Axboe		f->file_name = NULL;
87461eb313e28c0f0ba8eb144c5b5f331b6b74c4fc8Jens Axboe		sfree(f->file_map);
87561eb313e28c0f0ba8eb144c5b5f331b6b74c4fc8Jens Axboe		f->file_map = NULL;
87678d99e6a2695d3a7936c5dd02f996f13a30309b1Jens Axboe		sfree(f);
87753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
878b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe
8792dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	td->o.filename = NULL;
880cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	free(td->files);
8819efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe	td->files_index = 0;
882b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe	td->files = NULL;
8832dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	td->o.nr_files = 0;
88453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
885af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
886e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboestatic void get_file_type(struct fio_file *f)
887af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe{
888af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	struct stat sb;
889af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
890661598287ecc3b8987f312cf8403936552ce686aJens Axboe	if (!strcmp(f->file_name, "-"))
891661598287ecc3b8987f312cf8403936552ce686aJens Axboe		f->filetype = FIO_TYPE_PIPE;
892661598287ecc3b8987f312cf8403936552ce686aJens Axboe	else
893661598287ecc3b8987f312cf8403936552ce686aJens Axboe		f->filetype = FIO_TYPE_FILE;
894af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
895b30d395ec288508f9c787af11d0f52e9df26e39fJens Axboe	if (!stat(f->file_name, &sb)) {
896ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran		/* \\.\ is the device namespace in Windows, where every file is
897ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran		 * a block device */
898ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran		if (S_ISBLK(sb.st_mode) || strncmp(f->file_name, "\\\\.\\", 4) == 0)
899af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe			f->filetype = FIO_TYPE_BD;
900af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe		else if (S_ISCHR(sb.st_mode))
901af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe			f->filetype = FIO_TYPE_CHAR;
902b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe		else if (S_ISFIFO(sb.st_mode))
903b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe			f->filetype = FIO_TYPE_PIPE;
904af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	}
905af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe}
906af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
907f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboeint add_file(struct thread_data *td, const char *fname)
908af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe{
9097b4e4fe5e6fa26f82f9169c18ec70c08d0805ca9Jens Axboe	int cur_files = td->files_index;
910bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe	char file_name[PATH_MAX];
911af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	struct fio_file *f;
912bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe	int len = 0;
913af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
914ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "add file %s\n", fname);
915ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
916f17c43928c202e557f2f325272c60d9050ee528eJens Axboe	f = smalloc(sizeof(*f));
917c48c0be79173897824d8f439c39374f2588931dcJens Axboe	if (!f) {
918c48c0be79173897824d8f439c39374f2588931dcJens Axboe		log_err("fio: smalloc OOM\n");
919c48c0be79173897824d8f439c39374f2588931dcJens Axboe		assert(0);
920c48c0be79173897824d8f439c39374f2588931dcJens Axboe	}
9210b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe
922af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	f->fd = -1;
92338dad62d5154ffaad445bd0231b271b9a46a5190Jens Axboe	fio_file_reset(f);
924bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe
925fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe	if (td->files_size <= td->files_index) {
9264b341fca0dab0caa41d000e8db36f1530c26616fCarl Henrik Lunde		int new_size = td->o.nr_files + 1;
927126d65c6fc97d6acdc568aa5a969c012018daf15Jens Axboe
928fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe		dprint(FD_FILE, "resize file array to %d files\n", new_size);
929fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe
930fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe		td->files = realloc(td->files, new_size * sizeof(f));
931fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe		td->files_size = new_size;
932fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe	}
9338bb7679e73d3086a01b9d21a650b0d7a859412b6Jens Axboe	td->files[cur_files] = f;
934126d65c6fc97d6acdc568aa5a969c012018daf15Jens Axboe
93507eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe	/*
93607eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe	 * init function, io engine may not be loaded yet
93707eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe	 */
93807eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe	if (td->io_ops && (td->io_ops->flags & FIO_DISKLESSIO))
93907eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe		f->real_file_size = -1ULL;
94007eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe
941bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe	if (td->o.directory)
942bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe		len = sprintf(file_name, "%s/", td->o.directory);
943bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe
944bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe	sprintf(file_name + len, "%s", fname);
945f17c43928c202e557f2f325272c60d9050ee528eJens Axboe	f->file_name = smalloc_strdup(file_name);
946c48c0be79173897824d8f439c39374f2588931dcJens Axboe	if (!f->file_name) {
947c48c0be79173897824d8f439c39374f2588931dcJens Axboe		log_err("fio: smalloc OOM\n");
948c48c0be79173897824d8f439c39374f2588931dcJens Axboe		assert(0);
949c48c0be79173897824d8f439c39374f2588931dcJens Axboe	}
9500b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe
951e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboe	get_file_type(f);
952af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
9534d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	switch (td->o.file_lock_mode) {
9544d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	case FILE_LOCK_NONE:
9554d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		break;
9564d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	case FILE_LOCK_READWRITE:
9574d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		f->lock = fio_mutex_rw_init();
9584d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		break;
9594d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	case FILE_LOCK_EXCLUSIVE:
9604d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		f->lock = fio_mutex_init(1);
9614d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		break;
9624d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	default:
9634d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		log_err("fio: unknown lock mode: %d\n", td->o.file_lock_mode);
9644d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		assert(0);
9654d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	}
96629c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe
9677b4e4fe5e6fa26f82f9169c18ec70c08d0805ca9Jens Axboe	td->files_index++;
9681549441cdfecb2c1a4a8b8d494253859d67b4344Jens Axboe	if (f->filetype == FIO_TYPE_FILE)
9691549441cdfecb2c1a4a8b8d494253859d67b4344Jens Axboe		td->nr_normal_files++;
970f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
9715ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe	dprint(FD_FILE, "file %p \"%s\" added at %d\n", f, f->file_name,
9725ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe							cur_files);
9739efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe
974f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	return cur_files;
975af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe}
9760ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe
97749ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboeint add_file_exclusive(struct thread_data *td, const char *fname)
97849ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe{
97949ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe	struct fio_file *f;
98049ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe	unsigned int i;
98149ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe
98249ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe	for_each_file(td, f, i) {
98349ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe		if (!strcmp(f->file_name, fname))
98449ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe			return i;
98549ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe	}
98649ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe
98749ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe	return add_file(td, fname);
98849ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe}
98949ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe
9900ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboevoid get_file(struct fio_file *f)
9910ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe{
9928172fe972f3a79d42f34d7f6e259ed3f7f800316Jens Axboe	dprint(FD_FILE, "get file %s, ref=%d\n", f->file_name, f->references);
993d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe	assert(fio_file_open(f));
9940ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	f->references++;
9950ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe}
9960ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe
9976977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboeint put_file(struct thread_data *td, struct fio_file *f)
9980ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe{
99998e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe	int f_ret = 0, ret = 0;
10006977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe
10018172fe972f3a79d42f34d7f6e259ed3f7f800316Jens Axboe	dprint(FD_FILE, "put file %s, ref=%d\n", f->file_name, f->references);
1002ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
100322a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe	if (!fio_file_open(f)) {
100422a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe		assert(f->fd == -1);
10056977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe		return 0;
100622a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe	}
10070ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe
10080ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	assert(f->references);
10090ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	if (--f->references)
10106977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe		return 0;
10110ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe
1012d424d4dd657eaf4aeb8ffb07a550a5f64940f41aJens Axboe	if (should_fsync(td) && td->o.fsync_on_close)
101398e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe		f_ret = fsync(f->fd);
1014ebb1415f729c123b8a13bcbd667bf4b4cc95b4d4Jens Axboe
10150ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	if (td->io_ops->close_file)
10166977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe		ret = td->io_ops->close_file(td, f);
10171020a139beff50faf1bb18f761b024b664a09e14Jens Axboe
101898e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe	if (!ret)
1019a5fb461fdff86c442daeebbd28e07984be9f3807Jens Axboe		ret = f_ret;
102098e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe
10210ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	td->nr_open_files--;
1022d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe	fio_file_clear_open(f);
102322a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe	assert(f->fd == -1);
10246977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe	return ret;
10250ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe}
1026bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
10274d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid lock_file(struct thread_data *td, struct fio_file *f, enum fio_ddir ddir)
1028b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe{
10294d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (!f->lock || td->o.file_lock_mode == FILE_LOCK_NONE)
10304d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		return;
103129c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe
10324d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (f->lock_owner == td && f->lock_batch--)
10334d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		return;
10344d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
10354d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (td->o.file_lock_mode == FILE_LOCK_READWRITE) {
10364d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		if (ddir == DDIR_READ)
10374d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe			fio_mutex_down_read(f->lock);
10384d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		else
10394d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe			fio_mutex_down_write(f->lock);
10404d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	} else if (td->o.file_lock_mode == FILE_LOCK_EXCLUSIVE)
10414d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		fio_mutex_down(f->lock);
10424d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
10434d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	f->lock_owner = td;
10444d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	f->lock_batch = td->o.lockfile_batch;
10454d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	f->lock_ddir = ddir;
1046b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe}
1047b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe
10484d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid unlock_file(struct thread_data *td, struct fio_file *f)
1049b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe{
10504d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (!f->lock || td->o.file_lock_mode == FILE_LOCK_NONE)
10514d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		return;
10524d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (f->lock_batch)
10534d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		return;
10544d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
10554d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (td->o.file_lock_mode == FILE_LOCK_READWRITE) {
10564d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		const int is_read = f->lock_ddir == DDIR_READ;
10574d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		int val = fio_mutex_getval(f->lock);
105829c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe
10594d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		if ((is_read && val == 1) || (!is_read && val == -1))
10604d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe			f->lock_owner = NULL;
106129c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe
10624d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		if (is_read)
10634d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe			fio_mutex_up_read(f->lock);
10644d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		else
10654d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe			fio_mutex_up_write(f->lock);
10664d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	} else if (td->o.file_lock_mode == FILE_LOCK_EXCLUSIVE) {
10674d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		int val = fio_mutex_getval(f->lock);
10684d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
10694d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		if (val == 0)
10704d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe			f->lock_owner = NULL;
10714d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
10724d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		fio_mutex_up(f->lock);
107329c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe	}
1074b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe}
1075b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe
10764d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid unlock_file_all(struct thread_data *td, struct fio_file *f)
10774d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe{
10784d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (f->lock_owner != td)
10794d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		return;
10804d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
10814d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	f->lock_batch = 0;
10824d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	unlock_file(td, f);
10834d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe}
10844d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
1085bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboestatic int recurse_dir(struct thread_data *td, const char *dirname)
1086bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe{
1087bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	struct dirent *dir;
1088bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	int ret = 0;
1089bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	DIR *D;
1090bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1091bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	D = opendir(dirname);
1092bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	if (!D) {
10930ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		char buf[FIO_VERROR_SIZE];
10940ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe
10950ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		snprintf(buf, FIO_VERROR_SIZE - 1, "opendir(%s)", dirname);
10960ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		td_verror(td, errno, buf);
1097bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		return 1;
1098bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	}
1099bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1100bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	while ((dir = readdir(D)) != NULL) {
1101bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		char full_path[PATH_MAX];
1102bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		struct stat sb;
1103bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1104e85b2b83e39b64ba5cb73fbfddbf3902b6e84925Jens Axboe		if (!strcmp(dir->d_name, ".") || !strcmp(dir->d_name, ".."))
1105e85b2b83e39b64ba5cb73fbfddbf3902b6e84925Jens Axboe			continue;
110696d32d518a0743a6c050057bc1562e4883e51c5dJens Axboe
1107bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		sprintf(full_path, "%s/%s", dirname, dir->d_name);
1108bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1109bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		if (lstat(full_path, &sb) == -1) {
1110bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			if (errno != ENOENT) {
1111bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe				td_verror(td, errno, "stat");
1112bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe				return 1;
1113bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			}
1114bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		}
1115bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1116bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		if (S_ISREG(sb.st_mode)) {
1117bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			add_file(td, full_path);
11182dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe			td->o.nr_files++;
1119bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			continue;
1120bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		}
11210ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		if (!S_ISDIR(sb.st_mode))
11220ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe			continue;
1123bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
11245ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		ret = recurse_dir(td, full_path);
11255ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		if (ret)
1126bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			break;
1127bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	}
1128bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1129bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	closedir(D);
1130bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	return ret;
1131bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe}
1132bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1133bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboeint add_dir_files(struct thread_data *td, const char *path)
1134bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe{
11350ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe	int ret = recurse_dir(td, path);
11360ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe
11370ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe	if (!ret)
11380ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		log_info("fio: opendir added %d files\n", td->o.nr_files);
11390ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe
11400ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe	return ret;
1141bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe}
1142cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe
1143cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboevoid dup_files(struct thread_data *td, struct thread_data *org)
1144cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe{
1145cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	struct fio_file *f;
1146cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	unsigned int i;
11479efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe
11489efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe	dprint(FD_FILE, "dup files: %d\n", org->files_index);
1149cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe
1150cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	if (!org->files)
1151cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe		return;
1152cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe
11539efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe	td->files = malloc(org->files_index * sizeof(f));
1154cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe
11559efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe	for_each_file(org, f, i) {
1156b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe		struct fio_file *__f;
1157b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe
1158f17c43928c202e557f2f325272c60d9050ee528eJens Axboe		__f = smalloc(sizeof(*__f));
1159c48c0be79173897824d8f439c39374f2588931dcJens Axboe		if (!__f) {
1160c48c0be79173897824d8f439c39374f2588931dcJens Axboe			log_err("fio: smalloc OOM\n");
1161c48c0be79173897824d8f439c39374f2588931dcJens Axboe			assert(0);
1162c48c0be79173897824d8f439c39374f2588931dcJens Axboe		}
116322a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe		__f->fd = -1;
116438dad62d5154ffaad445bd0231b271b9a46a5190Jens Axboe		fio_file_reset(__f);
11650b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe
1166bc3456fa06cc7777c4764da8c7b1c0fd0a3c3772Aaron Carroll		if (f->file_name) {
1167f17c43928c202e557f2f325272c60d9050ee528eJens Axboe			__f->file_name = smalloc_strdup(f->file_name);
1168c48c0be79173897824d8f439c39374f2588931dcJens Axboe			if (!__f->file_name) {
1169c48c0be79173897824d8f439c39374f2588931dcJens Axboe				log_err("fio: smalloc OOM\n");
1170c48c0be79173897824d8f439c39374f2588931dcJens Axboe				assert(0);
1171c48c0be79173897824d8f439c39374f2588931dcJens Axboe			}
11720b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe
1173bc3456fa06cc7777c4764da8c7b1c0fd0a3c3772Aaron Carroll			__f->filetype = f->filetype;
1174bc3456fa06cc7777c4764da8c7b1c0fd0a3c3772Aaron Carroll		}
1175b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe
1176b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe		td->files[i] = __f;
1177cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	}
1178cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe}
1179f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
1180f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe/*
1181f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe * Returns the index that matches the filename, or -1 if not there
1182f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe */
1183f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboeint get_fileno(struct thread_data *td, const char *fname)
1184f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe{
1185f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	struct fio_file *f;
1186f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	unsigned int i;
1187f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
1188f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	for_each_file(td, f, i)
1189f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe		if (!strcmp(f->file_name, fname))
1190f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe			return i;
1191f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
1192f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	return -1;
1193f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe}
1194f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
1195f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe/*
1196f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe * For log usage, where we add/open/close files automatically
1197f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe */
1198f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboevoid free_release_files(struct thread_data *td)
1199f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe{
1200f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	close_files(td);
1201f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	td->files_index = 0;
1202f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	td->nr_normal_files = 0;
1203f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe}
1204