filesetup.c revision a93c5f049da63a60f9962177d8ada50094d234de
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
16a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou#ifdef FIO_HAVE_LINUX_FALLOCATE
17a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou#include <linux/falloc.h>
18a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou#endif
19a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou
207172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboestatic int root_warn;
217172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe
22c592b9fe12d4739d99d5bece517e304804876df6Jens Axboestatic inline void clear_error(struct thread_data *td)
23c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe{
24c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe	td->error = 0;
25c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe	td->verror[0] = '\0';
26c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe}
27c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe
283baddf2450d811be658fb47ef883ee84478dc352Jens Axboe/*
293baddf2450d811be658fb47ef883ee84478dc352Jens Axboe * Leaves f->fd open on success, caller must close
303baddf2450d811be658fb47ef883ee84478dc352Jens Axboe */
317bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboestatic int extend_file(struct thread_data *td, struct fio_file *f)
3225205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe{
33ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe	int r, new_layout = 0, unlink_file = 0, flags;
3425205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe	unsigned long long left;
3525205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe	unsigned int bs;
3625205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe	char *b;
37b2a151925a91f38aeb298d693687a47269ad4e94Jens Axboe
384241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe	if (read_only) {
394241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe		log_err("fio: refusing extend of file due to read-only\n");
404241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe		return 0;
414241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe	}
424241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe
43507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	/*
44507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	 * check if we need to lay the file out complete again. fio
45507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	 * does that for operations involving reads, or for writes
46507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	 * where overwrite is set
47507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	 */
48ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe	if (td_read(td) || (td_write(td) && td->o.overwrite) ||
49ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe	    (td_write(td) && td->io_ops->flags & FIO_NOEXTEND))
50507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe		new_layout = 1;
51ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe	if (td_write(td) && !td->o.overwrite)
52ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe		unlink_file = 1;
53507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe
546ae1f57f2cb8661b97b770372eeb3694f6d5a744Jens Axboe	if (unlink_file || new_layout) {
55bd199f2b98eeb9101795e40fdef5889c630178c1Jens Axboe		dprint(FD_FILE, "layout unlink %s\n", f->file_name);
56982016d689dc7fedbb09646ba0df7e72a781b164Zhang, Yanmin		if ((unlink(f->file_name) < 0) && (errno != ENOENT)) {
577bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			td_verror(td, errno, "unlink");
587bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			return 1;
597bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		}
607bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
617bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
62507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	flags = O_WRONLY | O_CREAT;
63507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	if (new_layout)
64507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe		flags |= O_TRUNC;
65507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe
66ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "open file %s, flags %x\n", f->file_name, flags);
67507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	f->fd = open(f->file_name, flags, 0644);
6853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (f->fd < 0) {
69e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, errno, "open");
7053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return 1;
7153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
7253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
737bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe#ifdef FIO_HAVE_FALLOCATE
74a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou	if (!td->o.fill_device) {
75a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou		switch (td->o.fallocate_mode) {
76a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou		case FIO_FALLOCATE_NONE:
77a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			break;
78a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou		case FIO_FALLOCATE_POSIX:
79a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			dprint(FD_FILE, "posix_fallocate file %s size %llu\n",
80a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou				 f->file_name, f->real_file_size);
81a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou
82a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			r = posix_fallocate(f->fd, 0, f->real_file_size);
83a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			if (r > 0) {
84a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou				log_err("fio: posix_fallocate fails: %s\n",
85a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou						strerror(r));
86a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			}
87a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			break;
88a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou#ifdef FIO_HAVE_LINUX_FALLOCATE
89a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou		case FIO_FALLOCATE_KEEP_SIZE:
90a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			dprint(FD_FILE,
91a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou				"fallocate(FALLOC_FL_KEEP_SIZE) "
92a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou				"file %s size %llu\n",
93a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou				f->file_name, f->real_file_size);
947bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe
95a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			r = fallocate(f->fd, FALLOC_FL_KEEP_SIZE, 0,
96a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou					f->real_file_size);
97a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			if (r != 0) {
98a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou				td_verror(td, errno, "fallocate");
99a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			}
100a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			break;
101a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou#endif /* FIO_HAVE_LINUX_FALLOCATE */
102a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou		default:
103a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			log_err("fio: unknown fallocate mode: %d\n",
104a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou				td->o.fallocate_mode);
105a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			assert(0);
1067bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe		}
1077bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe	}
108a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou#endif /* FIO_HAVE_FALLOCATE */
1099b8365618309572d8fd2579c8ea3132db89f843fBruce Cran
110fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis	if (!new_layout)
111fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis		goto done;
112fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis
1135e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	/*
1145e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	 * The size will be -1ULL when fill_device is used, so don't truncate
1155e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	 * or fallocate this file, just write it
1165e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	 */
1175e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	if (!td->o.fill_device) {
1185e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe		dprint(FD_FILE, "truncate file %s, size %llu\n", f->file_name,
119ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe							f->real_file_size);
1205e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe		if (ftruncate(f->fd, f->real_file_size) == -1) {
1215e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			td_verror(td, errno, "ftruncate");
1225e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			goto err;
1235e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe		}
1245e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	}
12540f8298cd252157fa15d93f8eb470116a94069a0Jens Axboe
1262dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	b = malloc(td->o.max_bs[DDIR_WRITE]);
1272dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	memset(b, 0, td->o.max_bs[DDIR_WRITE]);
12853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
1297bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	left = f->real_file_size;
13053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	while (left && !td->terminate) {
1312dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe		bs = td->o.max_bs[DDIR_WRITE];
13253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		if (bs > left)
13353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			bs = left;
13453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
13553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		r = write(f->fd, b, bs);
13653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
1375e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe		if (r > 0) {
1385e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			left -= r;
13953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			continue;
14053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		} else {
1415e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			if (r < 0) {
1425e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe				int __e = errno;
1435e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe
1445e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe				if (__e == ENOSPC) {
1455e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe					if (td->o.fill_device)
1465e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe						break;
1475e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe					log_info("fio: ENOSPC on laying out "
1485e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe						 "file, stopping\n");
1495e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe					break;
1505e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe				}
151e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe				td_verror(td, errno, "write");
1525e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			} else
153e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe				td_verror(td, EIO, "write");
15453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
15553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			break;
15653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		}
15753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
15853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
159ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe	if (td->terminate) {
160ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe		dprint(FD_FILE, "terminate unlink %s\n", f->file_name);
16153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		unlink(f->file_name);
162ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe	} else if (td->o.create_fsync) {
16398e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe		if (fsync(f->fd) < 0) {
16498e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe			td_verror(td, errno, "fsync");
16598e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe			goto err;
16698e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe		}
16798e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe	}
1680d1cd207e409a36313784cb9596990c819775f77Jens Axboe	if (td->o.fill_device && !td_write(td)) {
169d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe		fio_file_clear_size_known(f);
1705e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe		if (td_io_get_file_size(td, f))
1715e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			goto err;
1725e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe		if (f->io_size > f->real_file_size)
1735e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			f->io_size = f->real_file_size;
1745e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	}
17553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
17653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	free(b);
177507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboedone:
17853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
17953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboeerr:
18053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	close(f->fd);
18153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	f->fd = -1;
18253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 1;
18353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
18453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
185afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanminstatic int pre_read_file(struct thread_data *td, struct fio_file *f)
186afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin{
187b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe	int r, did_open = 0, old_runstate;
188afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	unsigned long long left;
189afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	unsigned int bs;
190afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	char *b;
191afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
1929c0d224129b0c59698e4c77e7fed00dc8cbb50e1Jens Axboe	if (td->io_ops->flags & FIO_PIPEIO)
1939c0d224129b0c59698e4c77e7fed00dc8cbb50e1Jens Axboe		return 0;
1949c0d224129b0c59698e4c77e7fed00dc8cbb50e1Jens Axboe
195d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe	if (!fio_file_open(f)) {
196b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe		if (td->io_ops->open_file(td, f)) {
197b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe			log_err("fio: cannot pre-read, failed to open file\n");
198b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe			return 1;
199b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe		}
200b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe		did_open = 1;
201b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe	}
202b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe
203b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe	old_runstate = td->runstate;
204b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe	td_set_runstate(td, TD_PRE_READING);
205b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe
206afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	bs = td->o.max_bs[DDIR_READ];
207afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	b = malloc(bs);
208afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	memset(b, 0, bs);
209afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
210afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	lseek(f->fd, f->file_offset, SEEK_SET);
211afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	left = f->io_size;
212afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
213afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	while (left && !td->terminate) {
214afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin		if (bs > left)
215afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin			bs = left;
216afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
217afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin		r = read(f->fd, b, bs);
218afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
219afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin		if (r == (int) bs) {
220afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin			left -= bs;
221afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin			continue;
222afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin		} else {
223afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin			td_verror(td, EIO, "pre_read");
224afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin			break;
225afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin		}
226afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	}
227afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
228b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe	td_set_runstate(td, old_runstate);
229b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe
230b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe	if (did_open)
231b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe		td->io_ops->close_file(td, f);
232afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	free(b);
233afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	return 0;
234afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin}
235afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
2367bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboestatic unsigned long long get_rand_file_size(struct thread_data *td)
2379c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe{
238dc873b6f4a536c332b72cce268d5a7ccd356a891Jens Axboe	unsigned long long ret, sized;
2391294c3ec7a02d20a98b105c1c41b23358afc67e4Jens Axboe	unsigned long r;
2409c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe
2414c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe	if (td->o.use_os_rand) {
2424c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe		r = os_random_long(&td->file_size_state);
2434c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe		sized = td->o.file_size_high - td->o.file_size_low;
2444c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe		ret = (unsigned long long) ((double) sized * (r / (OS_RAND_MAX + 1.0)));
2454c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe	} else {
2464c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe		r = __rand(&td->__file_size_state);
2474c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe		sized = td->o.file_size_high - td->o.file_size_low;
2484c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe		ret = (unsigned long long) ((double) sized * (r / (FRAND_MAX + 1.0)));
2494c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe	}
2504c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe
2515ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe	ret += td->o.file_size_low;
2522dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	ret -= (ret % td->o.rw_min_bs);
2539c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe	return ret;
2549c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe}
2559c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe
25653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int file_size(struct thread_data *td, struct fio_file *f)
25753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
25853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	struct stat st;
25953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
260df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe	if (stat(f->file_name, &st) == -1) {
2617bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		td_verror(td, errno, "fstat");
2627bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		return 1;
2637bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
26453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
2657bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	f->real_file_size = st.st_size;
26653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
26753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
26853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
26953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int bdev_size(struct thread_data *td, struct fio_file *f)
27053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
2719b8365618309572d8fd2579c8ea3132db89f843fBruce Cran	unsigned long long bytes = 0;
27253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	int r;
27353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
274df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe	if (td->io_ops->open_file(td, f)) {
275df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe		log_err("fio: failed opening blockdev %s for size check\n",
276df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe			f->file_name);
277df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe		return 1;
278df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe	}
279df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe
280ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran	r = blockdev_size(f, &bytes);
28153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (r) {
282e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, r, "blockdev_size");
283df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe		goto err;
28453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
28553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
2867ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe	if (!bytes) {
2877ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe		log_err("%s: zero sized block device?\n", f->file_name);
288df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe		goto err;
2897ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe	}
2907ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe
29153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	f->real_file_size = bytes;
29222a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe	td->io_ops->close_file(td, f);
29353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
294df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboeerr:
295df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe	td->io_ops->close_file(td, f);
296df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe	return 1;
29753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
29853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
2994ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboestatic int char_size(struct thread_data *td, struct fio_file *f)
3004ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe{
3014ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe#ifdef FIO_HAVE_CHARDEV_SIZE
3029b8365618309572d8fd2579c8ea3132db89f843fBruce Cran	unsigned long long bytes = 0;
3034ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	int r;
3044ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe
3054ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	if (td->io_ops->open_file(td, f)) {
3064ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		log_err("fio: failed opening blockdev %s for size check\n",
3074ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe			f->file_name);
3084ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		return 1;
3094ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	}
3104ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe
311ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran	r = chardev_size(f, &bytes);
3124ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	if (r) {
3134ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		td_verror(td, r, "chardev_size");
3144ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		goto err;
3154ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	}
3164ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe
3174ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	if (!bytes) {
3184ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		log_err("%s: zero sized char device?\n", f->file_name);
3194ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		goto err;
3204ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	}
3214ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe
3224ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	f->real_file_size = bytes;
3234ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	td->io_ops->close_file(td, f);
3244ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	return 0;
3254ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboeerr:
3264ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	td->io_ops->close_file(td, f);
3274ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	return 1;
3284ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe#else
3294ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	f->real_file_size = -1ULL;
3304ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	return 0;
3314ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe#endif
3324ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe}
3334ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe
33453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int get_file_size(struct thread_data *td, struct fio_file *f)
33553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
33653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	int ret = 0;
33753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
338d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe	if (fio_file_size_known(f))
339409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe		return 0;
340409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe
3417bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (f->filetype == FIO_TYPE_FILE)
3427bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		ret = file_size(td, f);
3437bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	else if (f->filetype == FIO_TYPE_BD)
34453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		ret = bdev_size(td, f);
3454ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	else if (f->filetype == FIO_TYPE_CHAR)
3464ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		ret = char_size(td, f);
34753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	else
34853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		f->real_file_size = -1;
34953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
35053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (ret)
35153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return ret;
35253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
35353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (f->file_offset > f->real_file_size) {
3540f2152c19ed12fc2280c3d475973112f18e48cd5Bruce Cran		log_err("%s: offset extends end (%llu > %llu)\n", td->o.name,
3555ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe					f->file_offset, f->real_file_size);
35653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return 1;
35753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
35853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
359d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe	fio_file_set_size_known(f);
36053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
36153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
36253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
3633baddf2450d811be658fb47ef883ee84478dc352Jens Axboestatic int __file_invalidate_cache(struct thread_data *td, struct fio_file *f,
3643baddf2450d811be658fb47ef883ee84478dc352Jens Axboe				   unsigned long long off,
3653baddf2450d811be658fb47ef883ee84478dc352Jens Axboe				   unsigned long long len)
366e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe{
367e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	int ret = 0;
368e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
3695e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	if (len == -1ULL)
3703baddf2450d811be658fb47ef883ee84478dc352Jens Axboe		len = f->io_size;
3713baddf2450d811be658fb47ef883ee84478dc352Jens Axboe	if (off == -1ULL)
3723baddf2450d811be658fb47ef883ee84478dc352Jens Axboe		off = f->file_offset;
373ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
3740d1cd207e409a36313784cb9596990c819775f77Jens Axboe	if (len == -1ULL || off == -1ULL)
3750d1cd207e409a36313784cb9596990c819775f77Jens Axboe		return 0;
3760d1cd207e409a36313784cb9596990c819775f77Jens Axboe
3773baddf2450d811be658fb47ef883ee84478dc352Jens Axboe	dprint(FD_IO, "invalidate cache %s: %llu/%llu\n", f->file_name, off,
3783baddf2450d811be658fb47ef883ee84478dc352Jens Axboe								len);
379b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe
380e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	/*
381e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	 * FIXME: add blockdev flushing too
382e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	 */
383a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe	if (f->mmap_ptr) {
38403e20d687566753b90383571e5e152c5142bdffdBruce Cran		ret = posix_madvise(f->mmap_ptr, f->mmap_sz, POSIX_MADV_DONTNEED);
385a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe#ifdef FIO_MADV_FREE
38603e20d687566753b90383571e5e152c5142bdffdBruce Cran		(void) posix_madvise(f->mmap_ptr, f->mmap_sz, FIO_MADV_FREE);
387a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe#endif
388a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe	} else if (f->filetype == FIO_TYPE_FILE) {
389ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran		ret = posix_fadvise(f->fd, off, len, POSIX_FADV_DONTNEED);
3905ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe	} else if (f->filetype == FIO_TYPE_BD) {
391ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran		ret = blockdev_invalidate_cache(f);
3927e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe		if (ret < 0 && errno == EACCES && geteuid()) {
3937172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe			if (!root_warn) {
3945ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				log_err("fio: only root may flush block "
3955ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe					"devices. Cache flush bypassed!\n");
3967172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe				root_warn = 1;
3977172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe			}
3987e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe			ret = 0;
3997e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe		}
400b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe	} else if (f->filetype == FIO_TYPE_CHAR || f->filetype == FIO_TYPE_PIPE)
401e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe		ret = 0;
402e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
403e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	if (ret < 0) {
404e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, errno, "invalidate_cache");
405e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe		return 1;
4063baddf2450d811be658fb47ef883ee84478dc352Jens Axboe	} else if (ret > 0) {
4073baddf2450d811be658fb47ef883ee84478dc352Jens Axboe		td_verror(td, ret, "invalidate_cache");
4083baddf2450d811be658fb47ef883ee84478dc352Jens Axboe		return 1;
409e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	}
410e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
411ad2da605a62faf16887970618b434db19594e17bJens Axboe	return ret;
4123baddf2450d811be658fb47ef883ee84478dc352Jens Axboe
4133baddf2450d811be658fb47ef883ee84478dc352Jens Axboe}
4143baddf2450d811be658fb47ef883ee84478dc352Jens Axboe
4153baddf2450d811be658fb47ef883ee84478dc352Jens Axboeint file_invalidate_cache(struct thread_data *td, struct fio_file *f)
4163baddf2450d811be658fb47ef883ee84478dc352Jens Axboe{
417d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe	if (!fio_file_open(f))
418a5fb461fdff86c442daeebbd28e07984be9f3807Jens Axboe		return 0;
419a5fb461fdff86c442daeebbd28e07984be9f3807Jens Axboe
4205e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	return __file_invalidate_cache(td, f, -1ULL, -1ULL);
421e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe}
422e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
4236977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboeint generic_close_file(struct thread_data fio_unused *td, struct fio_file *f)
42453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
4256977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe	int ret = 0;
4266977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe
427ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "fd close %s\n", f->file_name);
4284906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe
4294906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe	remove_file_hash(f);
4304906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe
4316977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe	if (close(f->fd) < 0)
4326977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe		ret = errno;
4336977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe
434b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe	f->fd = -1;
4356977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe	return ret;
43653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
43753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
4384d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboestatic int file_lookup_open(struct fio_file *f, int flags)
43953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
44029c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe	struct fio_file *__f;
4414d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	int from_hash;
4424d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
4434d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	__f = lookup_file_hash(f->file_name);
4444d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (__f) {
4459efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe		dprint(FD_FILE, "found file in hash %s\n", f->file_name);
4464d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		/*
4474d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		 * racy, need the __f->lock locked
4484d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		 */
4494d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		f->lock = __f->lock;
4504d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		f->lock_owner = __f->lock_owner;
4514d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		f->lock_batch = __f->lock_batch;
4524d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		f->lock_ddir = __f->lock_ddir;
4534d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		from_hash = 1;
4544d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	} else {
4559efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe		dprint(FD_FILE, "file not found in hash %s\n", f->file_name);
4564d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		from_hash = 0;
4574d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	}
4584d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
459e8670ef8b26039573fbf835b4b95ba45a1039d83Jens Axboe	f->fd = open(f->file_name, flags, 0600);
4604d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	return from_hash;
4614d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe}
4624d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
4634d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboeint generic_open_file(struct thread_data *td, struct fio_file *f)
4644d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe{
465661598287ecc3b8987f312cf8403936552ce686aJens Axboe	int is_std = 0;
46653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	int flags = 0;
46729c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe	int from_hash = 0;
46853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
469ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "fd open %s\n", f->file_name);
470ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
471661598287ecc3b8987f312cf8403936552ce686aJens Axboe	if (!strcmp(f->file_name, "-")) {
472661598287ecc3b8987f312cf8403936552ce686aJens Axboe		if (td_rw(td)) {
473661598287ecc3b8987f312cf8403936552ce686aJens Axboe			log_err("fio: can't read/write to stdin/out\n");
474661598287ecc3b8987f312cf8403936552ce686aJens Axboe			return 1;
475661598287ecc3b8987f312cf8403936552ce686aJens Axboe		}
476661598287ecc3b8987f312cf8403936552ce686aJens Axboe		is_std = 1;
477ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe
478ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe		/*
479ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe		 * move output logging to stderr, if we are writing to stdout
480ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe		 */
481ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe		if (td_write(td))
482ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe			f_out = stderr;
483661598287ecc3b8987f312cf8403936552ce686aJens Axboe	}
484661598287ecc3b8987f312cf8403936552ce686aJens Axboe
4852dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	if (td->o.odirect)
4862fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe		flags |= OS_O_DIRECT;
4872dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	if (td->o.sync_io)
4882fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe		flags |= O_SYNC;
489ad92396cc21055cee93470dcf65e82ccde03aac5Jens Axboe	if (f->filetype != FIO_TYPE_FILE)
4905921e80c5dfc9f96d2f21da6ae58f2b5d3a0b373Jens Axboe		flags |= FIO_O_NOATIME;
491814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe	if (td->o.create_on_open)
492814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe		flags |= O_CREAT;
49353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
494056f3459149a7670257350d84b49858718e4a0e6Aaron Carrollopen_again:
495660a1cb5fb9843ec09a04337714e78d63cd557e7Jens Axboe	if (td_write(td)) {
496173081581f94dc4f9f203eb7a7922fc843bfafdeJens Axboe		if (!read_only)
497173081581f94dc4f9f203eb7a7922fc843bfafdeJens Axboe			flags |= O_RDWR;
49853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
499af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe		if (f->filetype == FIO_TYPE_FILE)
5002fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe			flags |= O_CREAT;
5012fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe
502661598287ecc3b8987f312cf8403936552ce686aJens Axboe		if (is_std)
503661598287ecc3b8987f312cf8403936552ce686aJens Axboe			f->fd = dup(STDOUT_FILENO);
5044d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		else
5054d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe			from_hash = file_lookup_open(f, flags);
5062fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe	} else {
5074241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe		if (f->filetype == FIO_TYPE_CHAR && !read_only)
5082fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe			flags |= O_RDWR;
5092fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe		else
5102fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe			flags |= O_RDONLY;
5112fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe
512661598287ecc3b8987f312cf8403936552ce686aJens Axboe		if (is_std)
513661598287ecc3b8987f312cf8403936552ce686aJens Axboe			f->fd = dup(STDIN_FILENO);
5144d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		else
5154d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe			from_hash = file_lookup_open(f, flags);
51653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
51753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
51853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (f->fd == -1) {
519e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe		char buf[FIO_VERROR_SIZE];
520e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		int __e = errno;
521e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe
522835d9b9ed0e5c2591b8a3eacbd5f4ab6bdab466cJens Axboe		if (__e == EPERM && (flags & FIO_O_NOATIME)) {
5235921e80c5dfc9f96d2f21da6ae58f2b5d3a0b373Jens Axboe			flags &= ~FIO_O_NOATIME;
524056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll			goto open_again;
525056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll		}
526056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll
527e8670ef8b26039573fbf835b4b95ba45a1039d83Jens Axboe		snprintf(buf, sizeof(buf) - 1, "open(%s)", f->file_name);
528e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe
529a93c5f049da63a60f9962177d8ada50094d234deJens Axboe		if (__e == EINVAL && (flags & OS_O_DIRECT)) {
530a93c5f049da63a60f9962177d8ada50094d234deJens Axboe			log_err("fio: looks like your file system does not " \
531a93c5f049da63a60f9962177d8ada50094d234deJens Axboe				"support direct=1/buffered=0\n");
532a93c5f049da63a60f9962177d8ada50094d234deJens Axboe		}
533a93c5f049da63a60f9962177d8ada50094d234deJens Axboe
534e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe		td_verror(td, __e, buf);
53553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
53653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
53729c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe	if (!from_hash && f->fd != -1) {
53829c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe		if (add_file_hash(f)) {
5393f0ca9b914e6d0db8c5c457713c277ce458cbc02Jens Axboe			int fio_unused ret;
54029c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe
54129c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe			/*
54229c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe			 * OK to ignore, we haven't done anything with it
54329c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe			 */
54429c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe			ret = generic_close_file(td, f);
54529c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe			goto open_again;
54629c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe		}
54729c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe	}
5484906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe
54953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
550b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe}
551b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe
552df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboeint generic_get_file_size(struct thread_data *td, struct fio_file *f)
55321972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe{
554df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe	return get_file_size(td, f);
55521972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe}
55621972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe
5577bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe/*
5587bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * open/close all files, so that ->real_file_size gets set
5597bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */
560bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboestatic int get_file_sizes(struct thread_data *td)
5617bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe{
5627bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	struct fio_file *f;
5637bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	unsigned int i;
564bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe	int err = 0;
5657bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
5667bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	for_each_file(td, f, i) {
5675ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		dprint(FD_FILE, "get file size for %p/%d/%p\n", f, i,
5685ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe								f->file_name);
5699efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe
57099a47c6905731e53dd4d8f7ea6501f36d9329e7bJens Axboe		if (td_io_get_file_size(td, f)) {
57140b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe			if (td->error != ENOENT) {
57240b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe				log_err("%s\n", td->verror);
57340b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe				err = 1;
57440b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe			}
575541d66d70b8fbe9860b31307c0760e6d5f4c78a8Jens Axboe			clear_error(td);
57607eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe		}
577409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe
578409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe		if (f->real_file_size == -1ULL && td->o.size)
579409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe			f->real_file_size = td->o.size / td->o.nr_files;
5807bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
581bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe
582bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe	return err;
5837bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe}
5847bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
5852e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboestruct fio_mount {
5862e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	struct flist_head list;
5872e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	const char *base;
5882e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	char __base[256];
5892e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	unsigned int key;
5902e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe};
5912e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
5922e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe/*
5932e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe * Get free number of bytes for each file on each unique mount.
5942e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe */
5952e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboestatic unsigned long long get_fs_free_counts(struct thread_data *td)
5962e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe{
5972e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	struct flist_head *n, *tmp;
59868b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe	unsigned long long ret = 0;
5992e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	struct fio_mount *fm;
6002e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	FLIST_HEAD(list);
6012e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	struct fio_file *f;
6022e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	unsigned int i;
6032e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
6042e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	for_each_file(td, f, i) {
6052e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		struct stat sb;
6062e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		char buf[256];
6072e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
6084ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		if (f->filetype == FIO_TYPE_BD || f->filetype == FIO_TYPE_CHAR) {
6094ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe			if (f->real_file_size != -1ULL)
6104ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe				ret += f->real_file_size;
61168b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe			continue;
61268b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe		} else if (f->filetype != FIO_TYPE_FILE)
61368b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe			continue;
61468b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe
6152e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		strcpy(buf, f->file_name);
6162e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
6172e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		if (stat(buf, &sb) < 0) {
6182e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			if (errno != ENOENT)
6192e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe				break;
6202e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			strcpy(buf, ".");
6212e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			if (stat(buf, &sb) < 0)
6222e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe				break;
6232e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		}
6242e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
6252e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		fm = NULL;
6262e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		flist_for_each(n, &list) {
6272e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			fm = flist_entry(n, struct fio_mount, list);
6282e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			if (fm->key == sb.st_dev)
6292e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe				break;
6302e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
6312e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			fm = NULL;
6322e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		}
6332e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
6342e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		if (fm)
6352e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			continue;
6362e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
6372e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		fm = malloc(sizeof(*fm));
6382e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		strcpy(fm->__base, buf);
6392e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		fm->base = basename(fm->__base);
6402e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		fm->key = sb.st_dev;
6412e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		flist_add(&fm->list, &list);
6422e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	}
6432e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
6442e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	flist_for_each_safe(n, tmp, &list) {
6452e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		unsigned long long sz;
6462e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
6472e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		fm = flist_entry(n, struct fio_mount, list);
6482e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		flist_del(&fm->list);
6492e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
6502e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		sz = get_fs_size(fm->base);
6512e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		if (sz && sz != -1ULL)
6522e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			ret += sz;
6532e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
6542e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		free(fm);
6552e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	}
6562e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
6572e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	return ret;
6582e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe}
6592e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
6607bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe/*
6617bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * Open the files and setup files sizes, creating files if necessary.
6627bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */
66353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboeint setup_files(struct thread_data *td)
66453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
6657bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	unsigned long long total_size, extend_size;
66653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	struct fio_file *f;
667af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	unsigned int i;
668000b080395e45cbe0ce54e75f0e993addbdc8676Jens Axboe	int err = 0, need_extend;
66953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
670ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "setup files\n");
671ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
672691c8fb014da9dd82e999a90b5511423f4eee188Jens Axboe	if (td->o.read_iolog_file)
67325460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboe		goto done;
674691c8fb014da9dd82e999a90b5511423f4eee188Jens Axboe
67553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	/*
67653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	 * if ioengine defines a setup() method, it's responsible for
6777bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * opening the files and setting f->real_file_size to indicate
6787bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * the valid range for that file.
67953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	 */
68053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (td->io_ops->setup)
6817bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		err = td->io_ops->setup(td);
6827bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	else
683bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe		err = get_file_sizes(td);
68453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
685f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe	if (err)
686f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe		return err;
687f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe
6880a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe	/*
6897bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * check sizes. if the files/devices do not exist and the size
6907bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * isn't passed to fio, abort.
6910a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe	 */
6927bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	total_size = 0;
6937bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	for_each_file(td, f, i) {
6947bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		if (f->real_file_size == -1ULL)
6957bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			total_size = -1ULL;
6967bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		else
6977bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			total_size += f->real_file_size;
6987bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
6990a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe
7002e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	if (td->o.fill_device)
7012e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		td->fill_device_size = get_fs_free_counts(td);
7022e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
7037bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	/*
7047bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * device/file sizes are zero and no size given, punt
7057bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 */
7061f809d151ddc4a4c348c2e4f6007db510e3e08a2Jens Axboe	if ((!total_size || total_size == -1ULL) && !td->o.size &&
707aa31f1f108348ba2a8749c73fa8c25f3d4630a7cShawn Lewis	    !(td->io_ops->flags & FIO_NOIO) && !td->o.fill_device) {
7087bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		log_err("%s: you need to specify size=\n", td->o.name);
709e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, EINVAL, "total_file_size");
71053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return 1;
71153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
71253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
7137bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	/*
7147bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * now file sizes are known, so we can set ->io_size. if size= is
7157bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * not given, ->io_size is just equal to ->real_file_size. if size
7167bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * is given, ->io_size is size / nr_files.
7177bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 */
7187bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	extend_size = total_size = 0;
7197bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	need_extend = 0;
7207bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	for_each_file(td, f, i) {
721214ac7e009897f8f82ab9e21aff9bc86d33bb470Dan Ehrenberg		f->file_offset = td->o.start_offset +
722591e9e0653dd8f5d8464b2896434a01ab742a3b1Jens Axboe			(td->thread_number - 1) * td->o.offset_increment;
723bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang
7247bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		if (!td->o.file_size_low) {
7257bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			/*
7267bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * no file size range given, file size is equal to
7277bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * total size divided by number of files. if that is
7287bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * zero, set it to the real file size.
7297bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 */
7307bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			f->io_size = td->o.size / td->o.nr_files;
73165bdb10a09222d8b5d213de74824be775772ea8fJens Axboe			if (!f->io_size)
732273f8c912d981439049d9b21aa048aaeaa323c5dJens Axboe				f->io_size = f->real_file_size - f->file_offset;
7337bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		} else if (f->real_file_size < td->o.file_size_low ||
7347bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			   f->real_file_size > td->o.file_size_high) {
7355ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			if (f->file_offset > td->o.file_size_low)
736bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang				goto err_offset;
7377bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			/*
7387bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * file size given. if it's fixed, use that. if it's a
7397bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * range, generate a random size in-between.
7407bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 */
7415ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			if (td->o.file_size_low == td->o.file_size_high) {
7425ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				f->io_size = td->o.file_size_low
7435ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe						- f->file_offset;
7445ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			} else {
7455ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				f->io_size = get_rand_file_size(td)
7465ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe						- f->file_offset;
7475ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			}
74865bdb10a09222d8b5d213de74824be775772ea8fJens Axboe		} else
749bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang			f->io_size = f->real_file_size - f->file_offset;
75053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
7517bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		if (f->io_size == -1ULL)
7527bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			total_size = -1ULL;
7537bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		else
7547bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			total_size += f->io_size;
7557bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
7567bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		if (f->filetype == FIO_TYPE_FILE &&
757bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang		    (f->io_size + f->file_offset) > f->real_file_size &&
7587bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		    !(td->io_ops->flags & FIO_DISKLESSIO)) {
759814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe			if (!td->o.create_on_open) {
760814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe				need_extend++;
761814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe				extend_size += (f->io_size + f->file_offset);
762814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe			} else
763814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe				f->real_file_size = f->io_size + f->file_offset;
764d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe			fio_file_set_extend(f);
7655ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		}
7667bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
76753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
7687bb591020669b7266c57108f2a68b48a03ae72eeJens Axboe	if (td->o.size_percent)
7697bb591020669b7266c57108f2a68b48a03ae72eeJens Axboe		total_size = (total_size * td->o.size_percent) / 100;
7707bb591020669b7266c57108f2a68b48a03ae72eeJens Axboe
7712298290eabbe1017421a6ba0f5de93d8c2b048adljzhang,Yaxin Hu,Jianchao Tang	if (!td->o.size || td->o.size > total_size)
7727bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		td->o.size = total_size;
77321972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe
7747bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	/*
7757bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * See if we need to extend some files
7767bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 */
7777bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (need_extend) {
7787bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		temp_stall_ts = 1;
779a7ba8c5f4c0f9fe117d529c1ad6686b2070bae51Shaozhi Shawn Ye		if (!terse_output)
780a7ba8c5f4c0f9fe117d529c1ad6686b2070bae51Shaozhi Shawn Ye			log_info("%s: Laying out IO file(s) (%u file(s) /"
7810f2152c19ed12fc2280c3d475973112f18e48cd5Bruce Cran				 " %lluMB)\n", td->o.name, need_extend,
782a7ba8c5f4c0f9fe117d529c1ad6686b2070bae51Shaozhi Shawn Ye					extend_size >> 20);
7837bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
7847bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		for_each_file(td, f, i) {
7855e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			unsigned long long old_len = -1ULL, extend_len = -1ULL;
7863baddf2450d811be658fb47ef883ee84478dc352Jens Axboe
787d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe			if (!fio_file_extend(f))
7887bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe				continue;
7897bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
790409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe			assert(f->filetype == FIO_TYPE_FILE);
791d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe			fio_file_clear_extend(f);
7925e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			if (!td->o.fill_device) {
7935e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe				old_len = f->real_file_size;
7940b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe				extend_len = f->io_size + f->file_offset -
7950b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe						old_len;
7965e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			}
797bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang			f->real_file_size = (f->io_size + f->file_offset);
7987bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			err = extend_file(td, f);
7997bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			if (err)
8003baddf2450d811be658fb47ef883ee84478dc352Jens Axboe				break;
8015e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe
8023baddf2450d811be658fb47ef883ee84478dc352Jens Axboe			err = __file_invalidate_cache(td, f, old_len,
8033baddf2450d811be658fb47ef883ee84478dc352Jens Axboe								extend_len);
8043baddf2450d811be658fb47ef883ee84478dc352Jens Axboe			close(f->fd);
8053baddf2450d811be658fb47ef883ee84478dc352Jens Axboe			f->fd = -1;
8063baddf2450d811be658fb47ef883ee84478dc352Jens Axboe			if (err)
8077bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe				break;
8087bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		}
8097bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		temp_stall_ts = 0;
8107bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
8117bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
8127bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (err)
8137bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		return err;
8147bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
8157bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (!td->o.zone_size)
8167bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		td->o.zone_size = td->o.size;
8177bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
818ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe	/*
819ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe	 * iolog already set the total io size, if we read back
820ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe	 * stored entries.
821ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe	 */
822ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe	if (!td->o.read_iolog_file)
823ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe		td->total_io_size = td->o.size * td->o.loops;
82425460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboe
82525460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboedone:
82625460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboe	if (td->o.create_only)
82725460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboe		td->done = 1;
82825460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboe
8297bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	return 0;
830bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tangerr_offset:
831bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang	log_err("%s: you need to specify valid offset=\n", td->o.name);
832bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang	return 1;
83353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
83453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
835afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanminint pre_read_files(struct thread_data *td)
836afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin{
837afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	struct fio_file *f;
838afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	unsigned int i;
839afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
840afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	dprint(FD_FILE, "pre_read files\n");
841afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
842afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	for_each_file(td, f, i) {
843afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin		pre_read_file(td, f);
844afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	}
845afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
846afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	return 1;
847afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin}
848afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
849687270767de17dbad53c50e03e5d73d52505405cJens Axboeint init_random_map(struct thread_data *td)
850687270767de17dbad53c50e03e5d73d52505405cJens Axboe{
851509eab12448823a8eefbe925804b5308ee63bf5eJens Axboe	unsigned long long blocks, num_maps;
852687270767de17dbad53c50e03e5d73d52505405cJens Axboe	struct fio_file *f;
853687270767de17dbad53c50e03e5d73d52505405cJens Axboe	unsigned int i;
854687270767de17dbad53c50e03e5d73d52505405cJens Axboe
855de8dd119d7d869dd9c90c6d62bf4bededd10642eJens Axboe	if (td->o.norandommap || !td_random(td))
856687270767de17dbad53c50e03e5d73d52505405cJens Axboe		return 0;
857687270767de17dbad53c50e03e5d73d52505405cJens Axboe
858687270767de17dbad53c50e03e5d73d52505405cJens Axboe	for_each_file(td, f, i) {
8595ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		blocks = (f->real_file_size + td->o.rw_min_bs - 1) /
8605ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				(unsigned long long) td->o.rw_min_bs;
8615ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		num_maps = (blocks + BLOCKS_PER_MAP - 1) /
8625ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				(unsigned long long) BLOCKS_PER_MAP;
863ceadd59ef93421001530aa765d928e9e8c26b32eJens Axboe		if (num_maps == (unsigned long) num_maps) {
864ceadd59ef93421001530aa765d928e9e8c26b32eJens Axboe			f->file_map = smalloc(num_maps * sizeof(unsigned long));
865ceadd59ef93421001530aa765d928e9e8c26b32eJens Axboe			if (f->file_map) {
866ceadd59ef93421001530aa765d928e9e8c26b32eJens Axboe				f->num_maps = num_maps;
867ceadd59ef93421001530aa765d928e9e8c26b32eJens Axboe				continue;
868ceadd59ef93421001530aa765d928e9e8c26b32eJens Axboe			}
869ceadd59ef93421001530aa765d928e9e8c26b32eJens Axboe		} else
870ceadd59ef93421001530aa765d928e9e8c26b32eJens Axboe			f->file_map = NULL;
871ceadd59ef93421001530aa765d928e9e8c26b32eJens Axboe
8722b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe		if (!td->o.softrandommap) {
8735ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			log_err("fio: failed allocating random map. If running"
8745ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				" a large number of jobs, try the 'norandommap'"
8752b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe				" option or set 'softrandommap'. Or give"
8762b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe				" a larger --alloc-size to fio.\n");
877687270767de17dbad53c50e03e5d73d52505405cJens Axboe			return 1;
878687270767de17dbad53c50e03e5d73d52505405cJens Axboe		}
879303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe
880303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe		log_info("fio: file %s failed allocating random map. Running "
881303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe			 "job without.\n", f->file_name);
882303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe		f->num_maps = 0;
883687270767de17dbad53c50e03e5d73d52505405cJens Axboe	}
884687270767de17dbad53c50e03e5d73d52505405cJens Axboe
885687270767de17dbad53c50e03e5d73d52505405cJens Axboe	return 0;
886687270767de17dbad53c50e03e5d73d52505405cJens Axboe}
887687270767de17dbad53c50e03e5d73d52505405cJens Axboe
88853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboevoid close_files(struct thread_data *td)
88953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
8900ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe	struct fio_file *f;
891af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	unsigned int i;
89253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
8932be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe	for_each_file(td, f, i) {
8942be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe		if (fio_file_open(f))
8952be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe			td_io_close_file(td, f);
8962be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe	}
89724ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe}
89824ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe
89924ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboevoid close_and_free_files(struct thread_data *td)
90024ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe{
90124ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe	struct fio_file *f;
90224ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe	unsigned int i;
90324ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe
904ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "close files\n");
905ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
9060ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe	for_each_file(td, f, i) {
907ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe		if (td->o.unlink && f->filetype == FIO_TYPE_FILE) {
908ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe			dprint(FD_FILE, "free unlink %s\n", f->file_name);
909132ad46d22bcf12da95ad69e03c1b6f23f5e60a9Jens Axboe			unlink(f->file_name);
910ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe		}
911bdb4e2e99d4a87e5d3677cc09aa1ce92135125a9Jens Axboe
91222a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe		if (fio_file_open(f))
91322a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe			td_io_close_file(td, f);
91422a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe
915b9fbcf2104ab79127825e0c23ba0a147ec076087Shaozhi Shawn Ye		remove_file_hash(f);
916b3dc7f075b85e004f8c681ebb8566475017696f3Jens Axboe
917f17c43928c202e557f2f325272c60d9050ee528eJens Axboe		sfree(f->file_name);
918fa1da8653e2177b3cc31a91e963c389f079d4172Jens Axboe		f->file_name = NULL;
91961eb313e28c0f0ba8eb144c5b5f331b6b74c4fc8Jens Axboe		sfree(f->file_map);
92061eb313e28c0f0ba8eb144c5b5f331b6b74c4fc8Jens Axboe		f->file_map = NULL;
92178d99e6a2695d3a7936c5dd02f996f13a30309b1Jens Axboe		sfree(f);
92253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
923b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe
9242dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	td->o.filename = NULL;
925cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	free(td->files);
9269efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe	td->files_index = 0;
927b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe	td->files = NULL;
9282dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	td->o.nr_files = 0;
92953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
930af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
931e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboestatic void get_file_type(struct fio_file *f)
932af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe{
933af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	struct stat sb;
934af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
935661598287ecc3b8987f312cf8403936552ce686aJens Axboe	if (!strcmp(f->file_name, "-"))
936661598287ecc3b8987f312cf8403936552ce686aJens Axboe		f->filetype = FIO_TYPE_PIPE;
937661598287ecc3b8987f312cf8403936552ce686aJens Axboe	else
938661598287ecc3b8987f312cf8403936552ce686aJens Axboe		f->filetype = FIO_TYPE_FILE;
939af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
9403892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran	/* \\.\ is the device namespace in Windows, where every file is
9413892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran	 * a block device */
9423892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran	if (strncmp(f->file_name, "\\\\.\\", 4) == 0)
9433892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran		f->filetype = FIO_TYPE_BD;
9443892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran
945b30d395ec288508f9c787af11d0f52e9df26e39fJens Axboe	if (!stat(f->file_name, &sb)) {
9463892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran		if (S_ISBLK(sb.st_mode))
947af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe			f->filetype = FIO_TYPE_BD;
948af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe		else if (S_ISCHR(sb.st_mode))
949af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe			f->filetype = FIO_TYPE_CHAR;
950b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe		else if (S_ISFIFO(sb.st_mode))
951b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe			f->filetype = FIO_TYPE_PIPE;
952af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	}
953af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe}
954af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
955f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboeint add_file(struct thread_data *td, const char *fname)
956af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe{
9577b4e4fe5e6fa26f82f9169c18ec70c08d0805ca9Jens Axboe	int cur_files = td->files_index;
958bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe	char file_name[PATH_MAX];
959af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	struct fio_file *f;
960bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe	int len = 0;
961af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
962ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "add file %s\n", fname);
963ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
964f17c43928c202e557f2f325272c60d9050ee528eJens Axboe	f = smalloc(sizeof(*f));
965c48c0be79173897824d8f439c39374f2588931dcJens Axboe	if (!f) {
966c48c0be79173897824d8f439c39374f2588931dcJens Axboe		log_err("fio: smalloc OOM\n");
967c48c0be79173897824d8f439c39374f2588931dcJens Axboe		assert(0);
968c48c0be79173897824d8f439c39374f2588931dcJens Axboe	}
9690b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe
970af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	f->fd = -1;
97138dad62d5154ffaad445bd0231b271b9a46a5190Jens Axboe	fio_file_reset(f);
972bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe
973fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe	if (td->files_size <= td->files_index) {
9744b341fca0dab0caa41d000e8db36f1530c26616fCarl Henrik Lunde		int new_size = td->o.nr_files + 1;
975126d65c6fc97d6acdc568aa5a969c012018daf15Jens Axboe
976fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe		dprint(FD_FILE, "resize file array to %d files\n", new_size);
977fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe
978fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe		td->files = realloc(td->files, new_size * sizeof(f));
979fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe		td->files_size = new_size;
980fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe	}
9818bb7679e73d3086a01b9d21a650b0d7a859412b6Jens Axboe	td->files[cur_files] = f;
982126d65c6fc97d6acdc568aa5a969c012018daf15Jens Axboe
98307eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe	/*
98407eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe	 * init function, io engine may not be loaded yet
98507eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe	 */
98607eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe	if (td->io_ops && (td->io_ops->flags & FIO_DISKLESSIO))
98707eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe		f->real_file_size = -1ULL;
98807eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe
989bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe	if (td->o.directory)
990bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe		len = sprintf(file_name, "%s/", td->o.directory);
991bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe
992bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe	sprintf(file_name + len, "%s", fname);
993f17c43928c202e557f2f325272c60d9050ee528eJens Axboe	f->file_name = smalloc_strdup(file_name);
994c48c0be79173897824d8f439c39374f2588931dcJens Axboe	if (!f->file_name) {
995c48c0be79173897824d8f439c39374f2588931dcJens Axboe		log_err("fio: smalloc OOM\n");
996c48c0be79173897824d8f439c39374f2588931dcJens Axboe		assert(0);
997c48c0be79173897824d8f439c39374f2588931dcJens Axboe	}
9980b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe
999e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboe	get_file_type(f);
1000af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
10014d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	switch (td->o.file_lock_mode) {
10024d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	case FILE_LOCK_NONE:
10034d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		break;
10044d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	case FILE_LOCK_READWRITE:
10054d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		f->lock = fio_mutex_rw_init();
10064d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		break;
10074d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	case FILE_LOCK_EXCLUSIVE:
10084d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		f->lock = fio_mutex_init(1);
10094d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		break;
10104d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	default:
10114d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		log_err("fio: unknown lock mode: %d\n", td->o.file_lock_mode);
10124d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		assert(0);
10134d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	}
101429c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe
10157b4e4fe5e6fa26f82f9169c18ec70c08d0805ca9Jens Axboe	td->files_index++;
10161549441cdfecb2c1a4a8b8d494253859d67b4344Jens Axboe	if (f->filetype == FIO_TYPE_FILE)
10171549441cdfecb2c1a4a8b8d494253859d67b4344Jens Axboe		td->nr_normal_files++;
1018f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
10195ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe	dprint(FD_FILE, "file %p \"%s\" added at %d\n", f, f->file_name,
10205ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe							cur_files);
10219efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe
1022f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	return cur_files;
1023af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe}
10240ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe
102549ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboeint add_file_exclusive(struct thread_data *td, const char *fname)
102649ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe{
102749ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe	struct fio_file *f;
102849ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe	unsigned int i;
102949ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe
103049ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe	for_each_file(td, f, i) {
103149ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe		if (!strcmp(f->file_name, fname))
103249ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe			return i;
103349ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe	}
103449ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe
103549ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe	return add_file(td, fname);
103649ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe}
103749ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe
10380ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboevoid get_file(struct fio_file *f)
10390ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe{
10408172fe972f3a79d42f34d7f6e259ed3f7f800316Jens Axboe	dprint(FD_FILE, "get file %s, ref=%d\n", f->file_name, f->references);
1041d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe	assert(fio_file_open(f));
10420ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	f->references++;
10430ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe}
10440ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe
10456977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboeint put_file(struct thread_data *td, struct fio_file *f)
10460ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe{
104798e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe	int f_ret = 0, ret = 0;
10486977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe
10498172fe972f3a79d42f34d7f6e259ed3f7f800316Jens Axboe	dprint(FD_FILE, "put file %s, ref=%d\n", f->file_name, f->references);
1050ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
105122a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe	if (!fio_file_open(f)) {
105222a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe		assert(f->fd == -1);
10536977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe		return 0;
105422a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe	}
10550ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe
10560ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	assert(f->references);
10570ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	if (--f->references)
10586977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe		return 0;
10590ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe
1060d424d4dd657eaf4aeb8ffb07a550a5f64940f41aJens Axboe	if (should_fsync(td) && td->o.fsync_on_close)
106198e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe		f_ret = fsync(f->fd);
1062ebb1415f729c123b8a13bcbd667bf4b4cc95b4d4Jens Axboe
10630ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	if (td->io_ops->close_file)
10646977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe		ret = td->io_ops->close_file(td, f);
10651020a139beff50faf1bb18f761b024b664a09e14Jens Axboe
106698e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe	if (!ret)
1067a5fb461fdff86c442daeebbd28e07984be9f3807Jens Axboe		ret = f_ret;
106898e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe
10690ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	td->nr_open_files--;
1070d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe	fio_file_clear_open(f);
107122a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe	assert(f->fd == -1);
10726977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe	return ret;
10730ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe}
1074bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
10754d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid lock_file(struct thread_data *td, struct fio_file *f, enum fio_ddir ddir)
1076b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe{
10774d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (!f->lock || td->o.file_lock_mode == FILE_LOCK_NONE)
10784d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		return;
107929c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe
10804d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (f->lock_owner == td && f->lock_batch--)
10814d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		return;
10824d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
10834d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (td->o.file_lock_mode == FILE_LOCK_READWRITE) {
10844d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		if (ddir == DDIR_READ)
10854d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe			fio_mutex_down_read(f->lock);
10864d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		else
10874d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe			fio_mutex_down_write(f->lock);
10884d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	} else if (td->o.file_lock_mode == FILE_LOCK_EXCLUSIVE)
10894d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		fio_mutex_down(f->lock);
10904d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
10914d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	f->lock_owner = td;
10924d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	f->lock_batch = td->o.lockfile_batch;
10934d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	f->lock_ddir = ddir;
1094b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe}
1095b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe
10964d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid unlock_file(struct thread_data *td, struct fio_file *f)
1097b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe{
10984d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (!f->lock || td->o.file_lock_mode == FILE_LOCK_NONE)
10994d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		return;
11004d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (f->lock_batch)
11014d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		return;
11024d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
11034d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (td->o.file_lock_mode == FILE_LOCK_READWRITE) {
11044d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		const int is_read = f->lock_ddir == DDIR_READ;
11054d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		int val = fio_mutex_getval(f->lock);
110629c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe
11074d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		if ((is_read && val == 1) || (!is_read && val == -1))
11084d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe			f->lock_owner = NULL;
110929c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe
11104d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		if (is_read)
11114d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe			fio_mutex_up_read(f->lock);
11124d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		else
11134d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe			fio_mutex_up_write(f->lock);
11144d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	} else if (td->o.file_lock_mode == FILE_LOCK_EXCLUSIVE) {
11154d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		int val = fio_mutex_getval(f->lock);
11164d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
11174d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		if (val == 0)
11184d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe			f->lock_owner = NULL;
11194d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
11204d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		fio_mutex_up(f->lock);
112129c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe	}
1122b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe}
1123b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe
11244d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid unlock_file_all(struct thread_data *td, struct fio_file *f)
11254d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe{
11264d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (f->lock_owner != td)
11274d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		return;
11284d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
11294d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	f->lock_batch = 0;
11304d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	unlock_file(td, f);
11314d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe}
11324d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
1133bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboestatic int recurse_dir(struct thread_data *td, const char *dirname)
1134bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe{
1135bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	struct dirent *dir;
1136bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	int ret = 0;
1137bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	DIR *D;
1138bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1139bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	D = opendir(dirname);
1140bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	if (!D) {
11410ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		char buf[FIO_VERROR_SIZE];
11420ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe
11430ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		snprintf(buf, FIO_VERROR_SIZE - 1, "opendir(%s)", dirname);
11440ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		td_verror(td, errno, buf);
1145bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		return 1;
1146bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	}
1147bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1148bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	while ((dir = readdir(D)) != NULL) {
1149bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		char full_path[PATH_MAX];
1150bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		struct stat sb;
1151bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1152e85b2b83e39b64ba5cb73fbfddbf3902b6e84925Jens Axboe		if (!strcmp(dir->d_name, ".") || !strcmp(dir->d_name, ".."))
1153e85b2b83e39b64ba5cb73fbfddbf3902b6e84925Jens Axboe			continue;
115496d32d518a0743a6c050057bc1562e4883e51c5dJens Axboe
1155b9fd788f0e8adacc33316107594e9eb0463743d7Bruce Cran		sprintf(full_path, "%s%s%s", dirname, FIO_OS_PATH_SEPARATOR, dir->d_name);
1156bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1157bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		if (lstat(full_path, &sb) == -1) {
1158bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			if (errno != ENOENT) {
1159bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe				td_verror(td, errno, "stat");
1160bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe				return 1;
1161bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			}
1162bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		}
1163bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1164bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		if (S_ISREG(sb.st_mode)) {
1165bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			add_file(td, full_path);
11662dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe			td->o.nr_files++;
1167bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			continue;
1168bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		}
11690ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		if (!S_ISDIR(sb.st_mode))
11700ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe			continue;
1171bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
11725ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		ret = recurse_dir(td, full_path);
11735ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		if (ret)
1174bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			break;
1175bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	}
1176bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1177bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	closedir(D);
1178bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	return ret;
1179bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe}
1180bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1181bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboeint add_dir_files(struct thread_data *td, const char *path)
1182bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe{
11830ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe	int ret = recurse_dir(td, path);
11840ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe
11850ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe	if (!ret)
11860ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		log_info("fio: opendir added %d files\n", td->o.nr_files);
11870ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe
11880ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe	return ret;
1189bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe}
1190cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe
1191cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboevoid dup_files(struct thread_data *td, struct thread_data *org)
1192cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe{
1193cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	struct fio_file *f;
1194cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	unsigned int i;
11959efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe
11969efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe	dprint(FD_FILE, "dup files: %d\n", org->files_index);
1197cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe
1198cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	if (!org->files)
1199cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe		return;
1200cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe
12019efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe	td->files = malloc(org->files_index * sizeof(f));
1202cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe
12039efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe	for_each_file(org, f, i) {
1204b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe		struct fio_file *__f;
1205b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe
1206f17c43928c202e557f2f325272c60d9050ee528eJens Axboe		__f = smalloc(sizeof(*__f));
1207c48c0be79173897824d8f439c39374f2588931dcJens Axboe		if (!__f) {
1208c48c0be79173897824d8f439c39374f2588931dcJens Axboe			log_err("fio: smalloc OOM\n");
1209c48c0be79173897824d8f439c39374f2588931dcJens Axboe			assert(0);
1210c48c0be79173897824d8f439c39374f2588931dcJens Axboe		}
121122a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe		__f->fd = -1;
121238dad62d5154ffaad445bd0231b271b9a46a5190Jens Axboe		fio_file_reset(__f);
12130b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe
1214bc3456fa06cc7777c4764da8c7b1c0fd0a3c3772Aaron Carroll		if (f->file_name) {
1215f17c43928c202e557f2f325272c60d9050ee528eJens Axboe			__f->file_name = smalloc_strdup(f->file_name);
1216c48c0be79173897824d8f439c39374f2588931dcJens Axboe			if (!__f->file_name) {
1217c48c0be79173897824d8f439c39374f2588931dcJens Axboe				log_err("fio: smalloc OOM\n");
1218c48c0be79173897824d8f439c39374f2588931dcJens Axboe				assert(0);
1219c48c0be79173897824d8f439c39374f2588931dcJens Axboe			}
12200b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe
1221bc3456fa06cc7777c4764da8c7b1c0fd0a3c3772Aaron Carroll			__f->filetype = f->filetype;
1222bc3456fa06cc7777c4764da8c7b1c0fd0a3c3772Aaron Carroll		}
1223b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe
1224b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe		td->files[i] = __f;
1225cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	}
1226cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe}
1227f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
1228f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe/*
1229f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe * Returns the index that matches the filename, or -1 if not there
1230f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe */
1231f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboeint get_fileno(struct thread_data *td, const char *fname)
1232f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe{
1233f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	struct fio_file *f;
1234f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	unsigned int i;
1235f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
1236f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	for_each_file(td, f, i)
1237f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe		if (!strcmp(f->file_name, fname))
1238f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe			return i;
1239f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
1240f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	return -1;
1241f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe}
1242f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
1243f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe/*
1244f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe * For log usage, where we add/open/close files automatically
1245f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe */
1246f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboevoid free_release_files(struct thread_data *td)
1247f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe{
1248f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	close_files(td);
1249f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	td->files_index = 0;
1250f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	td->nr_normal_files = 0;
1251f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe}
1252