filesetup.c revision d1faa06dc74fcdcae02e70260c90121502ef01cf
153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include <unistd.h>
253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include <fcntl.h>
353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include <string.h>
453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include <assert.h>
5bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe#include <dirent.h>
6d74ac843d82345862070400cb5fe408524c613f3YAMAMOTO Takashi#include <libgen.h>
753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include <sys/stat.h>
853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include <sys/mman.h>
9bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe#include <sys/types.h>
1053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
1153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include "fio.h"
12f17c43928c202e557f2f325272c60d9050ee528eJens Axboe#include "smalloc.h"
134906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe#include "filehash.h"
14bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt#include "options.h"
15ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran#include "os/os.h"
162316296a514711bb388d87b34742c04bb561d986Jens Axboe#include "hash.h"
177ebd796f4e50c21d652e62bf1e112755b0f338a8Jens Axboe#include "lib/axmap.h"
1853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
1997ac992c99d89eed8cdf9249bb038ac4d7b709b9Jens Axboe#ifdef CONFIG_LINUX_FALLOCATE
20a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou#include <linux/falloc.h>
21a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou#endif
22a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou
237172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboestatic int root_warn;
247172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe
25bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardtstatic FLIST_HEAD(filename_list);
26bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt
27c592b9fe12d4739d99d5bece517e304804876df6Jens Axboestatic inline void clear_error(struct thread_data *td)
28c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe{
29c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe	td->error = 0;
30c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe	td->verror[0] = '\0';
31c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe}
32c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe
333baddf2450d811be658fb47ef883ee84478dc352Jens Axboe/*
343baddf2450d811be658fb47ef883ee84478dc352Jens Axboe * Leaves f->fd open on success, caller must close
353baddf2450d811be658fb47ef883ee84478dc352Jens Axboe */
367bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboestatic int extend_file(struct thread_data *td, struct fio_file *f)
3725205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe{
38ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe	int r, new_layout = 0, unlink_file = 0, flags;
3925205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe	unsigned long long left;
4025205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe	unsigned int bs;
41f3e1eb23a6c900921caa58c6cad66d3b60b0b6d7Jens Axboe	char *b = NULL;
42b2a151925a91f38aeb298d693687a47269ad4e94Jens Axboe
434241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe	if (read_only) {
444241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe		log_err("fio: refusing extend of file due to read-only\n");
454241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe		return 0;
464241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe	}
474241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe
48507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	/*
49507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	 * check if we need to lay the file out complete again. fio
50507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	 * does that for operations involving reads, or for writes
51507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	 * where overwrite is set
52507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	 */
531417daeb92c44632f2e1e376d736a0f198d7af8dJens Axboe	if (td_read(td) ||
541417daeb92c44632f2e1e376d736a0f198d7af8dJens Axboe	   (td_write(td) && td->o.overwrite && !td->o.file_append) ||
55ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe	    (td_write(td) && td->io_ops->flags & FIO_NOEXTEND))
56507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe		new_layout = 1;
571417daeb92c44632f2e1e376d736a0f198d7af8dJens Axboe	if (td_write(td) && !td->o.overwrite && !td->o.file_append)
58ea443657ce85860b7a0dd2f39f2572d4a09fc885Jens Axboe		unlink_file = 1;
59507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe
606ae1f57f2cb8661b97b770372eeb3694f6d5a744Jens Axboe	if (unlink_file || new_layout) {
61bd199f2b98eeb9101795e40fdef5889c630178c1Jens Axboe		dprint(FD_FILE, "layout unlink %s\n", f->file_name);
62982016d689dc7fedbb09646ba0df7e72a781b164Zhang, Yanmin		if ((unlink(f->file_name) < 0) && (errno != ENOENT)) {
637bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			td_verror(td, errno, "unlink");
647bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			return 1;
657bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		}
667bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
677bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
68507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	flags = O_WRONLY | O_CREAT;
69507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	if (new_layout)
70507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe		flags |= O_TRUNC;
71507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe
72ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "open file %s, flags %x\n", f->file_name, flags);
73507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	f->fd = open(f->file_name, flags, 0644);
7453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (f->fd < 0) {
75e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, errno, "open");
7653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return 1;
7753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
7853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
7997ac992c99d89eed8cdf9249bb038ac4d7b709b9Jens Axboe#ifdef CONFIG_POSIX_FALLOCATE
80a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou	if (!td->o.fill_device) {
81a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou		switch (td->o.fallocate_mode) {
82a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou		case FIO_FALLOCATE_NONE:
83a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			break;
84a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou		case FIO_FALLOCATE_POSIX:
85a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			dprint(FD_FILE, "posix_fallocate file %s size %llu\n",
864b91ee8fd12c72bd76ce9f5ff9116626b48566a0Jens Axboe				 f->file_name,
874b91ee8fd12c72bd76ce9f5ff9116626b48566a0Jens Axboe				 (unsigned long long) f->real_file_size);
88a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou
89a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			r = posix_fallocate(f->fd, 0, f->real_file_size);
90a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			if (r > 0) {
91a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou				log_err("fio: posix_fallocate fails: %s\n",
92a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou						strerror(r));
93a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			}
94a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			break;
9597ac992c99d89eed8cdf9249bb038ac4d7b709b9Jens Axboe#ifdef CONFIG_LINUX_FALLOCATE
96a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou		case FIO_FALLOCATE_KEEP_SIZE:
97a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			dprint(FD_FILE,
98a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou				"fallocate(FALLOC_FL_KEEP_SIZE) "
994b91ee8fd12c72bd76ce9f5ff9116626b48566a0Jens Axboe				"file %s size %llu\n", f->file_name,
1004b91ee8fd12c72bd76ce9f5ff9116626b48566a0Jens Axboe				(unsigned long long) f->real_file_size);
1017bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe
102a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			r = fallocate(f->fd, FALLOC_FL_KEEP_SIZE, 0,
103a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou					f->real_file_size);
104888677a428eb6ae6b54195e99734d6d6b3ee55e7Jens Axboe			if (r != 0)
105a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou				td_verror(td, errno, "fallocate");
106888677a428eb6ae6b54195e99734d6d6b3ee55e7Jens Axboe
107a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			break;
10897ac992c99d89eed8cdf9249bb038ac4d7b709b9Jens Axboe#endif /* CONFIG_LINUX_FALLOCATE */
109a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou		default:
110a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			log_err("fio: unknown fallocate mode: %d\n",
111a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou				td->o.fallocate_mode);
112a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			assert(0);
1137bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe		}
1147bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe	}
11597ac992c99d89eed8cdf9249bb038ac4d7b709b9Jens Axboe#endif /* CONFIG_POSIX_FALLOCATE */
1169b8365618309572d8fd2579c8ea3132db89f843fBruce Cran
117fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis	if (!new_layout)
118fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis		goto done;
119fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis
1205e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	/*
1215e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	 * The size will be -1ULL when fill_device is used, so don't truncate
1225e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	 * or fallocate this file, just write it
1235e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	 */
1245e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	if (!td->o.fill_device) {
1255e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe		dprint(FD_FILE, "truncate file %s, size %llu\n", f->file_name,
1264b91ee8fd12c72bd76ce9f5ff9116626b48566a0Jens Axboe					(unsigned long long) f->real_file_size);
1275e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe		if (ftruncate(f->fd, f->real_file_size) == -1) {
1283cd4c66f35fad0df64e4e6dfeddc5bdfd5206e0cJohn			if (errno != EFBIG) {
1293cd4c66f35fad0df64e4e6dfeddc5bdfd5206e0cJohn				td_verror(td, errno, "ftruncate");
1303cd4c66f35fad0df64e4e6dfeddc5bdfd5206e0cJohn				goto err;
1313cd4c66f35fad0df64e4e6dfeddc5bdfd5206e0cJohn			}
1325e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe		}
1335e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	}
13440f8298cd252157fa15d93f8eb470116a94069a0Jens Axboe
1352dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	b = malloc(td->o.max_bs[DDIR_WRITE]);
13653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
1377bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	left = f->real_file_size;
13853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	while (left && !td->terminate) {
1392dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe		bs = td->o.max_bs[DDIR_WRITE];
14053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		if (bs > left)
14153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			bs = left;
14253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
143cc86c395fd9dd2002ec1edc0967b7c9453debdfbJens Axboe		fill_io_buffer(td, b, bs, bs);
144cc86c395fd9dd2002ec1edc0967b7c9453debdfbJens Axboe
14553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		r = write(f->fd, b, bs);
14653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
1475e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe		if (r > 0) {
1485e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			left -= r;
14953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			continue;
15053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		} else {
1515e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			if (r < 0) {
1525e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe				int __e = errno;
1535e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe
1545e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe				if (__e == ENOSPC) {
1555e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe					if (td->o.fill_device)
1565e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe						break;
1575e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe					log_info("fio: ENOSPC on laying out "
1585e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe						 "file, stopping\n");
1595e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe					break;
1605e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe				}
161e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe				td_verror(td, errno, "write");
1625e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			} else
163e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe				td_verror(td, EIO, "write");
16453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
16553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			break;
16653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		}
16753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
16853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
169ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe	if (td->terminate) {
170ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe		dprint(FD_FILE, "terminate unlink %s\n", f->file_name);
17153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		unlink(f->file_name);
172ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe	} else if (td->o.create_fsync) {
17398e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe		if (fsync(f->fd) < 0) {
17498e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe			td_verror(td, errno, "fsync");
17598e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe			goto err;
17698e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe		}
17798e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe	}
1780d1cd207e409a36313784cb9596990c819775f77Jens Axboe	if (td->o.fill_device && !td_write(td)) {
179d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe		fio_file_clear_size_known(f);
1805e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe		if (td_io_get_file_size(td, f))
1815e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			goto err;
1825e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe		if (f->io_size > f->real_file_size)
1835e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			f->io_size = f->real_file_size;
1845e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	}
18553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
18653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	free(b);
187507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboedone:
18853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
18953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboeerr:
19053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	close(f->fd);
19153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	f->fd = -1;
192f3e1eb23a6c900921caa58c6cad66d3b60b0b6d7Jens Axboe	if (b)
193f3e1eb23a6c900921caa58c6cad66d3b60b0b6d7Jens Axboe		free(b);
19453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 1;
19553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
19653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
197afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanminstatic int pre_read_file(struct thread_data *td, struct fio_file *f)
198afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin{
199ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe	int ret = 0, r, did_open = 0, old_runstate;
200afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	unsigned long long left;
201afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	unsigned int bs;
202afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	char *b;
203afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
2049c0d224129b0c59698e4c77e7fed00dc8cbb50e1Jens Axboe	if (td->io_ops->flags & FIO_PIPEIO)
2059c0d224129b0c59698e4c77e7fed00dc8cbb50e1Jens Axboe		return 0;
2069c0d224129b0c59698e4c77e7fed00dc8cbb50e1Jens Axboe
207d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe	if (!fio_file_open(f)) {
208b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe		if (td->io_ops->open_file(td, f)) {
209b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe			log_err("fio: cannot pre-read, failed to open file\n");
210b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe			return 1;
211b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe		}
212b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe		did_open = 1;
213b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe	}
214b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe
2158edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe	old_runstate = td_bump_runstate(td, TD_PRE_READING);
216b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe
217afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	bs = td->o.max_bs[DDIR_READ];
218afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	b = malloc(bs);
219afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	memset(b, 0, bs);
220afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
221ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe	if (lseek(f->fd, f->file_offset, SEEK_SET) < 0) {
222ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe		td_verror(td, errno, "lseek");
223ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe		log_err("fio: failed to lseek pre-read file\n");
224ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe		ret = 1;
225ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe		goto error;
226ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe	}
227ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe
228afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	left = f->io_size;
229afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
230afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	while (left && !td->terminate) {
231afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin		if (bs > left)
232afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin			bs = left;
233afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
234afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin		r = read(f->fd, b, bs);
235afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
236afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin		if (r == (int) bs) {
237afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin			left -= bs;
238afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin			continue;
239afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin		} else {
240afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin			td_verror(td, EIO, "pre_read");
241afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin			break;
242afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin		}
243afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	}
244afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
245ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboeerror:
2468edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe	td_restore_runstate(td, old_runstate);
247b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe
248b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe	if (did_open)
249b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe		td->io_ops->close_file(td, f);
250ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe
251afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	free(b);
252ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe	return ret;
253afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin}
254afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
2557bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboestatic unsigned long long get_rand_file_size(struct thread_data *td)
2569c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe{
257dc873b6f4a536c332b72cce268d5a7ccd356a891Jens Axboe	unsigned long long ret, sized;
2581294c3ec7a02d20a98b105c1c41b23358afc67e4Jens Axboe	unsigned long r;
2599c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe
2604c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe	if (td->o.use_os_rand) {
2614c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe		r = os_random_long(&td->file_size_state);
2624c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe		sized = td->o.file_size_high - td->o.file_size_low;
2634c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe		ret = (unsigned long long) ((double) sized * (r / (OS_RAND_MAX + 1.0)));
2644c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe	} else {
2654c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe		r = __rand(&td->__file_size_state);
2664c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe		sized = td->o.file_size_high - td->o.file_size_low;
2674c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe		ret = (unsigned long long) ((double) sized * (r / (FRAND_MAX + 1.0)));
2684c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe	}
2694c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe
2705ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe	ret += td->o.file_size_low;
2712dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	ret -= (ret % td->o.rw_min_bs);
2729c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe	return ret;
2739c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe}
2749c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe
27553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int file_size(struct thread_data *td, struct fio_file *f)
27653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
27753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	struct stat st;
27853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
279df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe	if (stat(f->file_name, &st) == -1) {
2807bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		td_verror(td, errno, "fstat");
2817bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		return 1;
2827bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
28353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
2847bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	f->real_file_size = st.st_size;
28553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
28653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
28753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
28853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int bdev_size(struct thread_data *td, struct fio_file *f)
28953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
2909b8365618309572d8fd2579c8ea3132db89f843fBruce Cran	unsigned long long bytes = 0;
29153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	int r;
29253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
293df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe	if (td->io_ops->open_file(td, f)) {
294df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe		log_err("fio: failed opening blockdev %s for size check\n",
295df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe			f->file_name);
296df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe		return 1;
297df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe	}
298df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe
299ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran	r = blockdev_size(f, &bytes);
30053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (r) {
301e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, r, "blockdev_size");
302df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe		goto err;
30353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
30453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
3057ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe	if (!bytes) {
3067ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe		log_err("%s: zero sized block device?\n", f->file_name);
307df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe		goto err;
3087ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe	}
3097ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe
31053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	f->real_file_size = bytes;
31122a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe	td->io_ops->close_file(td, f);
31253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
313df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboeerr:
314df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe	td->io_ops->close_file(td, f);
315df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe	return 1;
31653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
31753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
3184ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboestatic int char_size(struct thread_data *td, struct fio_file *f)
3194ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe{
3204ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe#ifdef FIO_HAVE_CHARDEV_SIZE
3219b8365618309572d8fd2579c8ea3132db89f843fBruce Cran	unsigned long long bytes = 0;
3224ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	int r;
3234ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe
3244ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	if (td->io_ops->open_file(td, f)) {
3254ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		log_err("fio: failed opening blockdev %s for size check\n",
3264ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe			f->file_name);
3274ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		return 1;
3284ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	}
3294ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe
330ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran	r = chardev_size(f, &bytes);
3314ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	if (r) {
3324ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		td_verror(td, r, "chardev_size");
3334ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		goto err;
3344ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	}
3354ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe
3364ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	if (!bytes) {
3374ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		log_err("%s: zero sized char device?\n", f->file_name);
3384ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		goto err;
3394ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	}
3404ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe
3414ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	f->real_file_size = bytes;
3424ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	td->io_ops->close_file(td, f);
3434ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	return 0;
3444ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboeerr:
3454ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	td->io_ops->close_file(td, f);
3464ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	return 1;
3474ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe#else
3484ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	f->real_file_size = -1ULL;
3494ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	return 0;
3504ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe#endif
3514ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe}
3524ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe
35353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int get_file_size(struct thread_data *td, struct fio_file *f)
35453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
35553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	int ret = 0;
35653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
357d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe	if (fio_file_size_known(f))
358409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe		return 0;
359409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe
3607bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (f->filetype == FIO_TYPE_FILE)
3617bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		ret = file_size(td, f);
3627bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	else if (f->filetype == FIO_TYPE_BD)
36353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		ret = bdev_size(td, f);
3644ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	else if (f->filetype == FIO_TYPE_CHAR)
3654ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		ret = char_size(td, f);
36653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	else
36753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		f->real_file_size = -1;
36853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
36953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (ret)
37053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return ret;
37153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
37253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (f->file_offset > f->real_file_size) {
3730f2152c19ed12fc2280c3d475973112f18e48cd5Bruce Cran		log_err("%s: offset extends end (%llu > %llu)\n", td->o.name,
3744e0a8fa2593006505b7f4e18931a201d221b49e9Jens Axboe					(unsigned long long) f->file_offset,
3754e0a8fa2593006505b7f4e18931a201d221b49e9Jens Axboe					(unsigned long long) f->real_file_size);
37653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return 1;
37753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
37853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
379d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe	fio_file_set_size_known(f);
38053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
38153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
38253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
3833baddf2450d811be658fb47ef883ee84478dc352Jens Axboestatic int __file_invalidate_cache(struct thread_data *td, struct fio_file *f,
3843baddf2450d811be658fb47ef883ee84478dc352Jens Axboe				   unsigned long long off,
3853baddf2450d811be658fb47ef883ee84478dc352Jens Axboe				   unsigned long long len)
386e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe{
387e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	int ret = 0;
388e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
3895e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	if (len == -1ULL)
3903baddf2450d811be658fb47ef883ee84478dc352Jens Axboe		len = f->io_size;
3913baddf2450d811be658fb47ef883ee84478dc352Jens Axboe	if (off == -1ULL)
3923baddf2450d811be658fb47ef883ee84478dc352Jens Axboe		off = f->file_offset;
393ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
3940d1cd207e409a36313784cb9596990c819775f77Jens Axboe	if (len == -1ULL || off == -1ULL)
3950d1cd207e409a36313784cb9596990c819775f77Jens Axboe		return 0;
3960d1cd207e409a36313784cb9596990c819775f77Jens Axboe
3973baddf2450d811be658fb47ef883ee84478dc352Jens Axboe	dprint(FD_IO, "invalidate cache %s: %llu/%llu\n", f->file_name, off,
3983baddf2450d811be658fb47ef883ee84478dc352Jens Axboe								len);
399b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe
400a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe	if (f->mmap_ptr) {
40103e20d687566753b90383571e5e152c5142bdffdBruce Cran		ret = posix_madvise(f->mmap_ptr, f->mmap_sz, POSIX_MADV_DONTNEED);
402a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe#ifdef FIO_MADV_FREE
4033e10fb832645e3ab3ef006f589f0459dc567cb53Jens Axboe		if (f->filetype == FIO_TYPE_BD)
4043e10fb832645e3ab3ef006f589f0459dc567cb53Jens Axboe			(void) posix_madvise(f->mmap_ptr, f->mmap_sz, FIO_MADV_FREE);
405a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe#endif
406a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe	} else if (f->filetype == FIO_TYPE_FILE) {
407ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran		ret = posix_fadvise(f->fd, off, len, POSIX_FADV_DONTNEED);
4085ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe	} else if (f->filetype == FIO_TYPE_BD) {
409ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran		ret = blockdev_invalidate_cache(f);
4107e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe		if (ret < 0 && errno == EACCES && geteuid()) {
4117172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe			if (!root_warn) {
4125ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				log_err("fio: only root may flush block "
4135ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe					"devices. Cache flush bypassed!\n");
4147172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe				root_warn = 1;
4157172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe			}
4167e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe			ret = 0;
4177e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe		}
418b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe	} else if (f->filetype == FIO_TYPE_CHAR || f->filetype == FIO_TYPE_PIPE)
419e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe		ret = 0;
420e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
421dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe	/*
422dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe	 * Cache flushing isn't a fatal condition, and we know it will
423dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe	 * happen on some platforms where we don't have the proper
424dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe	 * function to flush eg block device caches. So just warn and
425dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe	 * continue on our way.
426dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe	 */
427dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe	if (ret) {
428dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe		log_info("fio: cache invalidation of %s failed: %s\n", f->file_name, strerror(errno));
429dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe		ret = 0;
430e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	}
431e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
432dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe	return 0;
4333baddf2450d811be658fb47ef883ee84478dc352Jens Axboe
4343baddf2450d811be658fb47ef883ee84478dc352Jens Axboe}
4353baddf2450d811be658fb47ef883ee84478dc352Jens Axboe
4363baddf2450d811be658fb47ef883ee84478dc352Jens Axboeint file_invalidate_cache(struct thread_data *td, struct fio_file *f)
4373baddf2450d811be658fb47ef883ee84478dc352Jens Axboe{
438d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe	if (!fio_file_open(f))
439a5fb461fdff86c442daeebbd28e07984be9f3807Jens Axboe		return 0;
440a5fb461fdff86c442daeebbd28e07984be9f3807Jens Axboe
4415e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	return __file_invalidate_cache(td, f, -1ULL, -1ULL);
442e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe}
443e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
4446977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboeint generic_close_file(struct thread_data fio_unused *td, struct fio_file *f)
44553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
4466977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe	int ret = 0;
4476977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe
448ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "fd close %s\n", f->file_name);
4494906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe
4504906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe	remove_file_hash(f);
4514906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe
4526977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe	if (close(f->fd) < 0)
4536977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe		ret = errno;
4546977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe
455b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe	f->fd = -1;
456e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe
457e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe	if (f->shadow_fd != -1) {
458e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe		close(f->shadow_fd);
459e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe		f->shadow_fd = -1;
460e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe	}
461e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe
46257e54e087e051186d18cdedad20a2460463d4d30Juan Casse	f->engine_data = 0;
4636977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe	return ret;
46453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
46553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
4661ccc6dc75b28ef70cd7a8c39ac8c1cb68c720a65Dmitry Monakhovint file_lookup_open(struct fio_file *f, int flags)
46753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
46829c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe	struct fio_file *__f;
4694d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	int from_hash;
4704d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
4714d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	__f = lookup_file_hash(f->file_name);
4724d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (__f) {
4739efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe		dprint(FD_FILE, "found file in hash %s\n", f->file_name);
4744d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		/*
4754d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		 * racy, need the __f->lock locked
4764d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		 */
4774d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		f->lock = __f->lock;
4784d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		from_hash = 1;
4794d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	} else {
4809efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe		dprint(FD_FILE, "file not found in hash %s\n", f->file_name);
4814d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		from_hash = 0;
4824d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	}
4834d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
484e8670ef8b26039573fbf835b4b95ba45a1039d83Jens Axboe	f->fd = open(f->file_name, flags, 0600);
4854d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	return from_hash;
4864d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe}
4874d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
488e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboestatic int file_close_shadow_fds(struct thread_data *td)
489e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe{
490e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe	struct fio_file *f;
491e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe	int num_closed = 0;
492e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe	unsigned int i;
493e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe
494e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe	for_each_file(td, f, i) {
495e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe		if (f->shadow_fd == -1)
496e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe			continue;
497e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe
498e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe		close(f->shadow_fd);
499e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe		f->shadow_fd = -1;
500e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe		num_closed++;
501e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe	}
502e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe
503e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe	return num_closed;
504e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe}
505e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe
5064d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboeint generic_open_file(struct thread_data *td, struct fio_file *f)
5074d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe{
508661598287ecc3b8987f312cf8403936552ce686aJens Axboe	int is_std = 0;
50953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	int flags = 0;
51029c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe	int from_hash = 0;
51153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
512ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "fd open %s\n", f->file_name);
513ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
5146eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	if (td_trim(td) && f->filetype != FIO_TYPE_BD) {
5156eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li		log_err("fio: trim only applies to block device\n");
5166eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li		return 1;
5176eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	}
5186eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li
519661598287ecc3b8987f312cf8403936552ce686aJens Axboe	if (!strcmp(f->file_name, "-")) {
520661598287ecc3b8987f312cf8403936552ce686aJens Axboe		if (td_rw(td)) {
521661598287ecc3b8987f312cf8403936552ce686aJens Axboe			log_err("fio: can't read/write to stdin/out\n");
522661598287ecc3b8987f312cf8403936552ce686aJens Axboe			return 1;
523661598287ecc3b8987f312cf8403936552ce686aJens Axboe		}
524661598287ecc3b8987f312cf8403936552ce686aJens Axboe		is_std = 1;
525ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe
526ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe		/*
527ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe		 * move output logging to stderr, if we are writing to stdout
528ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe		 */
529ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe		if (td_write(td))
530ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe			f_out = stderr;
531661598287ecc3b8987f312cf8403936552ce686aJens Axboe	}
532661598287ecc3b8987f312cf8403936552ce686aJens Axboe
5336eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	if (td_trim(td))
5346eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li		goto skip_flags;
5352dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	if (td->o.odirect)
5362fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe		flags |= OS_O_DIRECT;
537d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason	if (td->o.oatomic) {
538d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason		if (!FIO_O_ATOMIC) {
539d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason			td_verror(td, EINVAL, "OS does not support atomic IO");
540d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason			return 1;
541d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason		}
542d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason		flags |= OS_O_DIRECT | FIO_O_ATOMIC;
543d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason	}
5442dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	if (td->o.sync_io)
5452fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe		flags |= O_SYNC;
546814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe	if (td->o.create_on_open)
547814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe		flags |= O_CREAT;
5486eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Liskip_flags:
5496eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	if (f->filetype != FIO_TYPE_FILE)
5506eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li		flags |= FIO_O_NOATIME;
55153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
552056f3459149a7670257350d84b49858718e4a0e6Aaron Carrollopen_again:
553660a1cb5fb9843ec09a04337714e78d63cd557e7Jens Axboe	if (td_write(td)) {
554173081581f94dc4f9f203eb7a7922fc843bfafdeJens Axboe		if (!read_only)
555173081581f94dc4f9f203eb7a7922fc843bfafdeJens Axboe			flags |= O_RDWR;
55653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
557af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe		if (f->filetype == FIO_TYPE_FILE)
5582fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe			flags |= O_CREAT;
5592fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe
560661598287ecc3b8987f312cf8403936552ce686aJens Axboe		if (is_std)
561661598287ecc3b8987f312cf8403936552ce686aJens Axboe			f->fd = dup(STDOUT_FILENO);
5624d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		else
5634d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe			from_hash = file_lookup_open(f, flags);
5646eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	} else if (td_read(td)) {
5654241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe		if (f->filetype == FIO_TYPE_CHAR && !read_only)
5662fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe			flags |= O_RDWR;
5672fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe		else
5682fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe			flags |= O_RDONLY;
5692fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe
570661598287ecc3b8987f312cf8403936552ce686aJens Axboe		if (is_std)
571661598287ecc3b8987f312cf8403936552ce686aJens Axboe			f->fd = dup(STDIN_FILENO);
5724d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		else
5734d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe			from_hash = file_lookup_open(f, flags);
5746eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	} else { //td trim
5756eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li		flags |= O_RDWR;
5766eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li		from_hash = file_lookup_open(f, flags);
57753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
57853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
57953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (f->fd == -1) {
580e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe		char buf[FIO_VERROR_SIZE];
581e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		int __e = errno;
582e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe
583835d9b9ed0e5c2591b8a3eacbd5f4ab6bdab466cJens Axboe		if (__e == EPERM && (flags & FIO_O_NOATIME)) {
5845921e80c5dfc9f96d2f21da6ae58f2b5d3a0b373Jens Axboe			flags &= ~FIO_O_NOATIME;
585056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll			goto open_again;
586056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll		}
587e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe		if (__e == EMFILE && file_close_shadow_fds(td))
588e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe			goto open_again;
589056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll
59098ffb8f3ecebed9984d1744f142eb8be10c14dbdKen Raeburn		snprintf(buf, sizeof(buf), "open(%s)", f->file_name);
591e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe
592a93c5f049da63a60f9962177d8ada50094d234deJens Axboe		if (__e == EINVAL && (flags & OS_O_DIRECT)) {
593a93c5f049da63a60f9962177d8ada50094d234deJens Axboe			log_err("fio: looks like your file system does not " \
594a93c5f049da63a60f9962177d8ada50094d234deJens Axboe				"support direct=1/buffered=0\n");
595a93c5f049da63a60f9962177d8ada50094d234deJens Axboe		}
596a93c5f049da63a60f9962177d8ada50094d234deJens Axboe
597e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe		td_verror(td, __e, buf);
59853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
59953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
60029c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe	if (!from_hash && f->fd != -1) {
60129c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe		if (add_file_hash(f)) {
6023f0ca9b914e6d0db8c5c457713c277ce458cbc02Jens Axboe			int fio_unused ret;
60329c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe
60429c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe			/*
605e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe			 * Stash away descriptor for later close. This is to
606e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe			 * work-around a "feature" on Linux, where a close of
607e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe			 * an fd that has been opened for write will trigger
608e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe			 * udev to call blkid to check partitions, fs id, etc.
609de8f6de97438d5664cd8765e60102b9109a273e2Anatol Pomozov			 * That pollutes the device cache, which can slow down
610e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe			 * unbuffered accesses.
61129c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe			 */
612e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe			if (f->shadow_fd == -1)
613e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe				f->shadow_fd = f->fd;
614e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe			else {
615e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe				/*
616e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe			 	 * OK to ignore, we haven't done anything
617e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe				 * with it
618e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe				 */
619e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe				ret = generic_close_file(td, f);
620e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe			}
62129c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe			goto open_again;
62229c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe		}
62329c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe	}
6244906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe
62553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
626b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe}
627b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe
628df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboeint generic_get_file_size(struct thread_data *td, struct fio_file *f)
62921972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe{
630df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe	return get_file_size(td, f);
63121972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe}
63221972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe
6337bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe/*
6347bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * open/close all files, so that ->real_file_size gets set
6357bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */
636bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboestatic int get_file_sizes(struct thread_data *td)
6377bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe{
6387bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	struct fio_file *f;
6397bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	unsigned int i;
640bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe	int err = 0;
6417bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
6427bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	for_each_file(td, f, i) {
6435ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		dprint(FD_FILE, "get file size for %p/%d/%p\n", f, i,
6445ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe								f->file_name);
6459efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe
64699a47c6905731e53dd4d8f7ea6501f36d9329e7bJens Axboe		if (td_io_get_file_size(td, f)) {
64740b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe			if (td->error != ENOENT) {
64840b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe				log_err("%s\n", td->verror);
64940b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe				err = 1;
65040b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe			}
651541d66d70b8fbe9860b31307c0760e6d5f4c78a8Jens Axboe			clear_error(td);
65207eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe		}
653409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe
654409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe		if (f->real_file_size == -1ULL && td->o.size)
655409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe			f->real_file_size = td->o.size / td->o.nr_files;
6567bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
657bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe
658bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe	return err;
6597bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe}
6607bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
6612e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboestruct fio_mount {
6622e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	struct flist_head list;
6632e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	const char *base;
6642e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	char __base[256];
6652e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	unsigned int key;
6662e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe};
6672e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
6682e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe/*
6692e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe * Get free number of bytes for each file on each unique mount.
6702e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe */
6712e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboestatic unsigned long long get_fs_free_counts(struct thread_data *td)
6722e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe{
6732e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	struct flist_head *n, *tmp;
67468b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe	unsigned long long ret = 0;
6752e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	struct fio_mount *fm;
6762e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	FLIST_HEAD(list);
6772e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	struct fio_file *f;
6782e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	unsigned int i;
6792e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
6802e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	for_each_file(td, f, i) {
6812e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		struct stat sb;
6822e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		char buf[256];
6832e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
6844ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		if (f->filetype == FIO_TYPE_BD || f->filetype == FIO_TYPE_CHAR) {
6854ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe			if (f->real_file_size != -1ULL)
6864ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe				ret += f->real_file_size;
68768b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe			continue;
68868b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe		} else if (f->filetype != FIO_TYPE_FILE)
68968b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe			continue;
69068b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe
691da27a4bf0f9753fcc9da7b63f1be482fc0349907Jens Axboe		buf[255] = '\0';
692da27a4bf0f9753fcc9da7b63f1be482fc0349907Jens Axboe		strncpy(buf, f->file_name, 255);
6932e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
6942e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		if (stat(buf, &sb) < 0) {
6952e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			if (errno != ENOENT)
6962e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe				break;
6972e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			strcpy(buf, ".");
6982e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			if (stat(buf, &sb) < 0)
6992e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe				break;
7002e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		}
7012e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
7022e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		fm = NULL;
7032e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		flist_for_each(n, &list) {
7042e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			fm = flist_entry(n, struct fio_mount, list);
7052e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			if (fm->key == sb.st_dev)
7062e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe				break;
7072e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
7082e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			fm = NULL;
7092e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		}
7102e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
7112e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		if (fm)
7122e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			continue;
7132e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
7143660ceae229f08b4086279be7c82e86926f0304bJens Axboe		fm = calloc(1, sizeof(*fm));
7153660ceae229f08b4086279be7c82e86926f0304bJens Axboe		strncpy(fm->__base, buf, sizeof(fm->__base) - 1);
7162e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		fm->base = basename(fm->__base);
7172e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		fm->key = sb.st_dev;
7182e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		flist_add(&fm->list, &list);
7192e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	}
7202e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
7212e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	flist_for_each_safe(n, tmp, &list) {
7222e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		unsigned long long sz;
7232e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
7242e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		fm = flist_entry(n, struct fio_mount, list);
7252e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		flist_del(&fm->list);
7262e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
7272e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		sz = get_fs_size(fm->base);
7282e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		if (sz && sz != -1ULL)
7292e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			ret += sz;
7302e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
7312e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		free(fm);
7322e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	}
7332e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
7342e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	return ret;
7352e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe}
7362e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
737bedc9dc24223bb33be4120f4a57718bc54888ca5Jens Axboeuint64_t get_start_offset(struct thread_data *td, struct fio_file *f)
738ce95d651568bd5494e4c4ddc95832715c6760d56Dan Ehrenberg{
739bedc9dc24223bb33be4120f4a57718bc54888ca5Jens Axboe	struct thread_options *o = &td->o;
740bedc9dc24223bb33be4120f4a57718bc54888ca5Jens Axboe
741bedc9dc24223bb33be4120f4a57718bc54888ca5Jens Axboe	if (o->file_append && f->filetype == FIO_TYPE_FILE)
742bedc9dc24223bb33be4120f4a57718bc54888ca5Jens Axboe		return f->real_file_size;
743bedc9dc24223bb33be4120f4a57718bc54888ca5Jens Axboe
744ce95d651568bd5494e4c4ddc95832715c6760d56Dan Ehrenberg	return td->o.start_offset +
745ce95d651568bd5494e4c4ddc95832715c6760d56Dan Ehrenberg		(td->thread_number - 1) * td->o.offset_increment;
746ce95d651568bd5494e4c4ddc95832715c6760d56Dan Ehrenberg}
747ce95d651568bd5494e4c4ddc95832715c6760d56Dan Ehrenberg
7487bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe/*
7497bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * Open the files and setup files sizes, creating files if necessary.
7507bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */
75153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboeint setup_files(struct thread_data *td)
75253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
7537bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	unsigned long long total_size, extend_size;
754de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe	struct thread_options *o = &td->o;
75553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	struct fio_file *f;
756002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe	unsigned int i, nr_fs_extra = 0;
757000b080395e45cbe0ce54e75f0e993addbdc8676Jens Axboe	int err = 0, need_extend;
758e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe	int old_state;
759002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe	const unsigned int bs = td_min_bs(td);
760002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe	uint64_t fs = 0;
76153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
762ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "setup files\n");
763ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
7648edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe	old_state = td_bump_runstate(td, TD_SETTING_UP);
765e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe
766de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe	if (o->read_iolog_file)
76725460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboe		goto done;
768691c8fb014da9dd82e999a90b5511423f4eee188Jens Axboe
76953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	/*
77053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	 * if ioengine defines a setup() method, it's responsible for
7717bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * opening the files and setting f->real_file_size to indicate
7727bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * the valid range for that file.
77353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	 */
77453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (td->io_ops->setup)
7757bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		err = td->io_ops->setup(td);
7767bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	else
777bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe		err = get_file_sizes(td);
77853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
779f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe	if (err)
780e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe		goto err_out;
781f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe
7820a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe	/*
7837bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * check sizes. if the files/devices do not exist and the size
7847bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * isn't passed to fio, abort.
7850a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe	 */
7867bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	total_size = 0;
7877bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	for_each_file(td, f, i) {
7887bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		if (f->real_file_size == -1ULL)
7897bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			total_size = -1ULL;
7907bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		else
7917bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			total_size += f->real_file_size;
7927bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
7930a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe
794de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe	if (o->fill_device)
7952e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		td->fill_device_size = get_fs_free_counts(td);
7962e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
7977bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	/*
7987bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * device/file sizes are zero and no size given, punt
7997bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 */
800de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe	if ((!total_size || total_size == -1ULL) && !o->size &&
801de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe	    !(td->io_ops->flags & FIO_NOIO) && !o->fill_device &&
802de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe	    !(o->nr_files && (o->file_size_low || o->file_size_high))) {
803de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe		log_err("%s: you need to specify size=\n", o->name);
804e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, EINVAL, "total_file_size");
805e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe		goto err_out;
80653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
80753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
8087bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	/*
809002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe	 * Calculate per-file size and potential extra size for the
810002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe	 * first files, if needed.
811002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe	 */
812d1e78e6b0429bac92794fb6f1c24b5078c68da6dJens Axboe	if (!o->file_size_low && o->nr_files) {
813002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe		uint64_t all_fs;
814002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe
815002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe		fs = o->size / o->nr_files;
816002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe		all_fs = fs * o->nr_files;
817002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe
818002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe		if (all_fs < o->size)
819002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe			nr_fs_extra = (o->size - all_fs) / bs;
820002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe	}
821002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe
822002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe	/*
8237bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * now file sizes are known, so we can set ->io_size. if size= is
8247bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * not given, ->io_size is just equal to ->real_file_size. if size
8257bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * is given, ->io_size is size / nr_files.
8267bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 */
8277bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	extend_size = total_size = 0;
8287bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	need_extend = 0;
8297bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	for_each_file(td, f, i) {
830bedc9dc24223bb33be4120f4a57718bc54888ca5Jens Axboe		f->file_offset = get_start_offset(td, f);
831bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang
832de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe		if (!o->file_size_low) {
8337bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			/*
8347bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * no file size range given, file size is equal to
835002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe			 * total size divided by number of files. If that is
836002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe			 * zero, set it to the real file size. If the size
837002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe			 * doesn't divide nicely with the min blocksize,
838002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe			 * make the first files bigger.
8397bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 */
840002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe			f->io_size = fs;
841002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe			if (nr_fs_extra) {
842002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe				nr_fs_extra--;
843002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe				f->io_size += bs;
844002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe			}
845002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe
84665bdb10a09222d8b5d213de74824be775772ea8fJens Axboe			if (!f->io_size)
847273f8c912d981439049d9b21aa048aaeaa323c5dJens Axboe				f->io_size = f->real_file_size - f->file_offset;
848de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe		} else if (f->real_file_size < o->file_size_low ||
849de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe			   f->real_file_size > o->file_size_high) {
850de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe			if (f->file_offset > o->file_size_low)
851bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang				goto err_offset;
8527bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			/*
8537bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * file size given. if it's fixed, use that. if it's a
8547bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * range, generate a random size in-between.
8557bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 */
856de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe			if (o->file_size_low == o->file_size_high)
857de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe				f->io_size = o->file_size_low - f->file_offset;
858de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe			else {
8595ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				f->io_size = get_rand_file_size(td)
8605ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe						- f->file_offset;
8615ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			}
86265bdb10a09222d8b5d213de74824be775772ea8fJens Axboe		} else
863bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang			f->io_size = f->real_file_size - f->file_offset;
86453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
8657bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		if (f->io_size == -1ULL)
8667bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			total_size = -1ULL;
8674d002569dc503474a53e824e3f72b10a09c9a2b5Shaohua Li		else {
868de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe                        if (o->size_percent)
869de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe                                f->io_size = (f->io_size * o->size_percent) / 100;
8707bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			total_size += f->io_size;
8714d002569dc503474a53e824e3f72b10a09c9a2b5Shaohua Li		}
8727bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
8737bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		if (f->filetype == FIO_TYPE_FILE &&
874bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang		    (f->io_size + f->file_offset) > f->real_file_size &&
8757bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		    !(td->io_ops->flags & FIO_DISKLESSIO)) {
876de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe			if (!o->create_on_open) {
877814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe				need_extend++;
878814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe				extend_size += (f->io_size + f->file_offset);
879814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe			} else
880814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe				f->real_file_size = f->io_size + f->file_offset;
881d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe			fio_file_set_extend(f);
8825ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		}
8837bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
88453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
885de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe	if (!o->size || o->size > total_size)
886de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe		o->size = total_size;
88721972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe
888d1faa06dc74fcdcae02e70260c90121502ef01cfJens Axboe	if (o->size < td_min_bs(td)) {
889d1faa06dc74fcdcae02e70260c90121502ef01cfJens Axboe		log_err("fio: blocksize too large for data set\n");
890d1faa06dc74fcdcae02e70260c90121502ef01cfJens Axboe		goto err_out;
891d1faa06dc74fcdcae02e70260c90121502ef01cfJens Axboe	}
892d1faa06dc74fcdcae02e70260c90121502ef01cfJens Axboe
8937bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	/*
8947bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * See if we need to extend some files
8957bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 */
8967bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (need_extend) {
8977bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		temp_stall_ts = 1;
898f3afa57e36550288340f1b6c694f354ae72654b9Jens Axboe		if (output_format == FIO_OUTPUT_NORMAL)
899a7ba8c5f4c0f9fe117d529c1ad6686b2070bae51Shaozhi Shawn Ye			log_info("%s: Laying out IO file(s) (%u file(s) /"
900de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe				 " %lluMB)\n", o->name, need_extend,
901a7ba8c5f4c0f9fe117d529c1ad6686b2070bae51Shaozhi Shawn Ye					extend_size >> 20);
9027bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
9037bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		for_each_file(td, f, i) {
9045e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			unsigned long long old_len = -1ULL, extend_len = -1ULL;
9053baddf2450d811be658fb47ef883ee84478dc352Jens Axboe
906d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe			if (!fio_file_extend(f))
9077bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe				continue;
9087bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
909409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe			assert(f->filetype == FIO_TYPE_FILE);
910d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe			fio_file_clear_extend(f);
911de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe			if (!o->fill_device) {
9125e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe				old_len = f->real_file_size;
9130b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe				extend_len = f->io_size + f->file_offset -
9140b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe						old_len;
9155e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			}
916bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang			f->real_file_size = (f->io_size + f->file_offset);
9177bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			err = extend_file(td, f);
9187bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			if (err)
9193baddf2450d811be658fb47ef883ee84478dc352Jens Axboe				break;
9205e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe
9213baddf2450d811be658fb47ef883ee84478dc352Jens Axboe			err = __file_invalidate_cache(td, f, old_len,
9223baddf2450d811be658fb47ef883ee84478dc352Jens Axboe								extend_len);
9239824f73be5a03e683a236eb1ebe18f4656ac06b8Jens Axboe
9249824f73be5a03e683a236eb1ebe18f4656ac06b8Jens Axboe			/*
9259824f73be5a03e683a236eb1ebe18f4656ac06b8Jens Axboe			 * Shut up static checker
9269824f73be5a03e683a236eb1ebe18f4656ac06b8Jens Axboe			 */
9279824f73be5a03e683a236eb1ebe18f4656ac06b8Jens Axboe			if (f->fd != -1)
9289824f73be5a03e683a236eb1ebe18f4656ac06b8Jens Axboe				close(f->fd);
9299824f73be5a03e683a236eb1ebe18f4656ac06b8Jens Axboe
9303baddf2450d811be658fb47ef883ee84478dc352Jens Axboe			f->fd = -1;
9313baddf2450d811be658fb47ef883ee84478dc352Jens Axboe			if (err)
9327bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe				break;
9337bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		}
9347bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		temp_stall_ts = 0;
9357bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
9367bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
9377bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (err)
938e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe		goto err_out;
9397bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
940de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe	if (!o->zone_size)
941de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe		o->zone_size = o->size;
9427bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
943ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe	/*
944ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe	 * iolog already set the total io size, if we read back
945ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe	 * stored entries.
946ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe	 */
947de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe	if (!o->read_iolog_file)
948de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe		td->total_io_size = o->size * o->loops;
94925460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboe
95025460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboedone:
951de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe	if (o->create_only)
95225460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboe		td->done = 1;
95325460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboe
9548edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe	td_restore_runstate(td, old_state);
9557bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	return 0;
956bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tangerr_offset:
957de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe	log_err("%s: you need to specify valid offset=\n", o->name);
958e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboeerr_out:
9598edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe	td_restore_runstate(td, old_state);
960bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang	return 1;
96153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
96253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
963afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanminint pre_read_files(struct thread_data *td)
964afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin{
965afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	struct fio_file *f;
966afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	unsigned int i;
967afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
968afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	dprint(FD_FILE, "pre_read files\n");
969afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
970afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	for_each_file(td, f, i) {
971afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin		pre_read_file(td, f);
972afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	}
973afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
974afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	return 1;
975afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin}
976afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
9779c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboestatic int __init_rand_distribution(struct thread_data *td, struct fio_file *f)
9789c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe{
9792316296a514711bb388d87b34742c04bb561d986Jens Axboe	unsigned int range_size, seed;
9809c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	unsigned long nranges;
98121415db9f1689a5c47fda5e710879c4739707442Jens Axboe	uint64_t file_size;
9829c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe
9839c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	range_size = min(td->o.min_bs[DDIR_READ], td->o.min_bs[DDIR_WRITE]);
98421415db9f1689a5c47fda5e710879c4739707442Jens Axboe	file_size = min(f->real_file_size, f->io_size);
9859c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe
98621415db9f1689a5c47fda5e710879c4739707442Jens Axboe	nranges = (file_size + range_size - 1) / range_size;
9879c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe
9882316296a514711bb388d87b34742c04bb561d986Jens Axboe	seed = jhash(f->file_name, strlen(f->file_name), 0) * td->thread_number;
9898425687edef1b2961a17bd58341686f7b598cf28Jens Axboe	if (!td->o.rand_repeatable)
9908425687edef1b2961a17bd58341686f7b598cf28Jens Axboe		seed = td->rand_seeds[4];
9918425687edef1b2961a17bd58341686f7b598cf28Jens Axboe
9929c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	if (td->o.random_distribution == FIO_RAND_DIST_ZIPF)
993888677a428eb6ae6b54195e99734d6d6b3ee55e7Jens Axboe		zipf_init(&f->zipf, nranges, td->o.zipf_theta.u.f, seed);
9949c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	else
995888677a428eb6ae6b54195e99734d6d6b3ee55e7Jens Axboe		pareto_init(&f->zipf, nranges, td->o.pareto_h.u.f, seed);
9969c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe
9979c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	return 1;
9989c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe}
9999c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe
10009c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboestatic int init_rand_distribution(struct thread_data *td)
10019c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe{
10029c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	struct fio_file *f;
10039c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	unsigned int i;
10049c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	int state;
10059c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe
10069c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	if (td->o.random_distribution == FIO_RAND_DIST_RANDOM)
10079c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe		return 0;
10089c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe
10098edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe	state = td_bump_runstate(td, TD_SETTING_UP);
10108edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe
10119c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	for_each_file(td, f, i)
10129c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe		__init_rand_distribution(td, f);
10138edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe
10148edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe	td_restore_runstate(td, state);
10159c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe
10169c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	return 1;
10179c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe}
10189c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe
1019687270767de17dbad53c50e03e5d73d52505405cJens Axboeint init_random_map(struct thread_data *td)
1020687270767de17dbad53c50e03e5d73d52505405cJens Axboe{
102151ede0b1e9c9b570b942b50b44d0455183a0d5ecJens Axboe	unsigned long long blocks;
1022687270767de17dbad53c50e03e5d73d52505405cJens Axboe	struct fio_file *f;
1023687270767de17dbad53c50e03e5d73d52505405cJens Axboe	unsigned int i;
1024687270767de17dbad53c50e03e5d73d52505405cJens Axboe
10259c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	if (init_rand_distribution(td))
10269c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe		return 0;
10273831a843c289ab6a42a19752733d0fca4250882aJens Axboe	if (!td_random(td))
1028687270767de17dbad53c50e03e5d73d52505405cJens Axboe		return 0;
1029687270767de17dbad53c50e03e5d73d52505405cJens Axboe
1030687270767de17dbad53c50e03e5d73d52505405cJens Axboe	for_each_file(td, f, i) {
103138f30c81d8d194da047950cbbda3896bd35cd98cJens Axboe		uint64_t file_size = min(f->real_file_size, f->io_size);
103238f30c81d8d194da047950cbbda3896bd35cd98cJens Axboe
103353737ae01ca65f88089d3b8639df7be5b2f7ef0eJens Axboe		blocks = file_size / (unsigned long long) td->o.rw_min_bs;
103453737ae01ca65f88089d3b8639df7be5b2f7ef0eJens Axboe
10358055e41d0ecc54770a2653427532b3e2c5fabdadJens Axboe		if (td->o.random_generator == FIO_RAND_GEN_LFSR) {
103682af46be1fa0c0e188bbb6723008fa33a510606fJens Axboe			unsigned long seed;
103782af46be1fa0c0e188bbb6723008fa33a510606fJens Axboe
103882af46be1fa0c0e188bbb6723008fa33a510606fJens Axboe			seed = td->rand_seeds[FIO_RAND_BLOCK_OFF];
103982af46be1fa0c0e188bbb6723008fa33a510606fJens Axboe
1040225ba9e3433cf27d8ff7b213d9f78b7ef2776c70Jens Axboe			if (!lfsr_init(&f->lfsr, blocks, seed, 0))
10418055e41d0ecc54770a2653427532b3e2c5fabdadJens Axboe				continue;
10423831a843c289ab6a42a19752733d0fca4250882aJens Axboe		} else if (!td->o.norandommap) {
10437ebd796f4e50c21d652e62bf1e112755b0f338a8Jens Axboe			f->io_axmap = axmap_new(blocks);
10447ebd796f4e50c21d652e62bf1e112755b0f338a8Jens Axboe			if (f->io_axmap)
10458055e41d0ecc54770a2653427532b3e2c5fabdadJens Axboe				continue;
10461cad7121e8e6c59440ae43545be05fa302e4110dJens Axboe		} else if (td->o.norandommap)
10471cad7121e8e6c59440ae43545be05fa302e4110dJens Axboe			continue;
1048ceadd59ef93421001530aa765d928e9e8c26b32eJens Axboe
10492b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe		if (!td->o.softrandommap) {
10505ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			log_err("fio: failed allocating random map. If running"
10515ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				" a large number of jobs, try the 'norandommap'"
10522b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe				" option or set 'softrandommap'. Or give"
10532b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe				" a larger --alloc-size to fio.\n");
1054687270767de17dbad53c50e03e5d73d52505405cJens Axboe			return 1;
1055687270767de17dbad53c50e03e5d73d52505405cJens Axboe		}
1056303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe
1057303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe		log_info("fio: file %s failed allocating random map. Running "
1058303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe			 "job without.\n", f->file_name);
1059687270767de17dbad53c50e03e5d73d52505405cJens Axboe	}
1060687270767de17dbad53c50e03e5d73d52505405cJens Axboe
1061687270767de17dbad53c50e03e5d73d52505405cJens Axboe	return 0;
1062687270767de17dbad53c50e03e5d73d52505405cJens Axboe}
1063687270767de17dbad53c50e03e5d73d52505405cJens Axboe
106453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboevoid close_files(struct thread_data *td)
106553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
10660ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe	struct fio_file *f;
1067af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	unsigned int i;
106853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
10692be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe	for_each_file(td, f, i) {
10702be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe		if (fio_file_open(f))
10712be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe			td_io_close_file(td, f);
10722be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe	}
107324ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe}
107424ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe
107524ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboevoid close_and_free_files(struct thread_data *td)
107624ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe{
107724ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe	struct fio_file *f;
107824ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe	unsigned int i;
107924ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe
1080ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "close files\n");
1081ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
10820ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe	for_each_file(td, f, i) {
108322a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe		if (fio_file_open(f))
108422a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe			td_io_close_file(td, f);
108522a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe
1086b9fbcf2104ab79127825e0c23ba0a147ec076087Shaozhi Shawn Ye		remove_file_hash(f);
1087b3dc7f075b85e004f8c681ebb8566475017696f3Jens Axboe
1088b5f4d8baefc6eb3e13235b7d9042b7ffecdb23ddJens Axboe		if (td->o.unlink && f->filetype == FIO_TYPE_FILE) {
1089b5f4d8baefc6eb3e13235b7d9042b7ffecdb23ddJens Axboe			dprint(FD_FILE, "free unlink %s\n", f->file_name);
1090b5f4d8baefc6eb3e13235b7d9042b7ffecdb23ddJens Axboe			unlink(f->file_name);
1091b5f4d8baefc6eb3e13235b7d9042b7ffecdb23ddJens Axboe		}
1092b5f4d8baefc6eb3e13235b7d9042b7ffecdb23ddJens Axboe
1093f17c43928c202e557f2f325272c60d9050ee528eJens Axboe		sfree(f->file_name);
1094fa1da8653e2177b3cc31a91e963c389f079d4172Jens Axboe		f->file_name = NULL;
10957ebd796f4e50c21d652e62bf1e112755b0f338a8Jens Axboe		axmap_free(f->io_axmap);
10967ebd796f4e50c21d652e62bf1e112755b0f338a8Jens Axboe		f->io_axmap = NULL;
109778d99e6a2695d3a7936c5dd02f996f13a30309b1Jens Axboe		sfree(f);
109853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
1099b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe
11002dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	td->o.filename = NULL;
1101cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	free(td->files);
1102d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe	free(td->file_locks);
11039efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe	td->files_index = 0;
1104b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe	td->files = NULL;
1105d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe	td->file_locks = NULL;
110627ddbfa09b22911d5cefb42a44f894e6eb48216eJens Axboe	td->o.file_lock_mode = FILE_LOCK_NONE;
11072dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	td->o.nr_files = 0;
110853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
1109af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
1110e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboestatic void get_file_type(struct fio_file *f)
1111af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe{
1112af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	struct stat sb;
1113af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
1114661598287ecc3b8987f312cf8403936552ce686aJens Axboe	if (!strcmp(f->file_name, "-"))
1115661598287ecc3b8987f312cf8403936552ce686aJens Axboe		f->filetype = FIO_TYPE_PIPE;
1116661598287ecc3b8987f312cf8403936552ce686aJens Axboe	else
1117661598287ecc3b8987f312cf8403936552ce686aJens Axboe		f->filetype = FIO_TYPE_FILE;
1118af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
11193892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran	/* \\.\ is the device namespace in Windows, where every file is
11203892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran	 * a block device */
11213892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran	if (strncmp(f->file_name, "\\\\.\\", 4) == 0)
11223892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran		f->filetype = FIO_TYPE_BD;
11233892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran
1124b30d395ec288508f9c787af11d0f52e9df26e39fJens Axboe	if (!stat(f->file_name, &sb)) {
11253892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran		if (S_ISBLK(sb.st_mode))
1126af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe			f->filetype = FIO_TYPE_BD;
1127af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe		else if (S_ISCHR(sb.st_mode))
1128af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe			f->filetype = FIO_TYPE_CHAR;
1129b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe		else if (S_ISFIFO(sb.st_mode))
1130b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe			f->filetype = FIO_TYPE_PIPE;
1131af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	}
1132af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe}
1133af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
113490426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboestatic int __is_already_allocated(const char *fname)
1135190b8f0c9c1c1a99ed26fd953f7af9023f9533eeCastor Fu{
113690426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	struct flist_head *entry;
113790426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	char *filename;
1138bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt
113990426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	if (flist_empty(&filename_list))
114090426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe		return 0;
114190426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe
114290426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	flist_for_each(entry, &filename_list) {
114390426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe		filename = flist_entry(entry, struct file_name, list)->filename;
114490426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe
114590426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe		if (strcmp(filename, fname) == 0)
114690426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe			return 1;
114790426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	}
114890426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe
114990426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	return 0;
1150bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt}
1151bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt
1152bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardtstatic int is_already_allocated(const char *fname)
1153bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt{
115490426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	int ret;
1155bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt
115690426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	fio_file_hash_lock();
115790426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	ret = __is_already_allocated(fname);
115890426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	fio_file_hash_unlock();
115990426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	return ret;
116090426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe}
1161bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt
116290426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboestatic void set_already_allocated(const char *fname)
116390426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe{
116490426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	struct file_name *fn;
116590426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe
116690426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	fn = malloc(sizeof(struct file_name));
116790426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	fn->filename = strdup(fname);
116890426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe
116990426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	fio_file_hash_lock();
117090426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	if (!__is_already_allocated(fname)) {
117190426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe		flist_add_tail(&fn->list, &filename_list);
117290426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe		fn = NULL;
1173bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt	}
117490426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	fio_file_hash_unlock();
1175bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt
117690426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	if (fn) {
117790426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe		free(fn->filename);
117890426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe		free(fn);
117990426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	}
1180bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt}
1181bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt
118290426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe
1183190b8f0c9c1c1a99ed26fd953f7af9023f9533eeCastor Fustatic void free_already_allocated(void)
1184190b8f0c9c1c1a99ed26fd953f7af9023f9533eeCastor Fu{
1185bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt	struct flist_head *entry, *tmp;
1186bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt	struct file_name *fn;
1187bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt
118890426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	if (flist_empty(&filename_list))
118990426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe		return;
119090426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe
119190426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	fio_file_hash_lock();
119290426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	flist_for_each_safe(entry, tmp, &filename_list) {
119390426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe		fn = flist_entry(entry, struct file_name, list);
119490426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe		free(fn->filename);
119590426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe		flist_del(&fn->list);
119690426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe		free(fn);
1197bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt	}
119890426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe
119990426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	fio_file_hash_unlock();
1200bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt}
1201bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt
12027b5cb700485518c2e7f2f49548319c89ba907195Jens Axboestatic struct fio_file *alloc_new_file(struct thread_data *td)
12037b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe{
12047b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe	struct fio_file *f;
12057b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe
12067b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe	f = smalloc(sizeof(*f));
12077b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe	if (!f) {
12087b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe		log_err("fio: smalloc OOM\n");
12097b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe		assert(0);
12107b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe		return NULL;
12117b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe	}
12127b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe
12137b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe	f->fd = -1;
12147b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe	f->shadow_fd = -1;
12157b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe	fio_file_reset(td, f);
12167b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe	return f;
12177b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe}
12187b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe
12195903e7b7907854014478b6febfc5645a203ff59eJens Axboeint add_file(struct thread_data *td, const char *fname, int numjob, int inc)
1220af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe{
12217b4e4fe5e6fa26f82f9169c18ec70c08d0805ca9Jens Axboe	int cur_files = td->files_index;
1222bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe	char file_name[PATH_MAX];
1223af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	struct fio_file *f;
1224bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe	int len = 0;
1225af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
1226ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "add file %s\n", fname);
1227ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
1228bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt	if (td->o.directory)
1229bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt		len = set_name_idx(file_name, td->o.directory, numjob);
1230bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt
1231bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt	sprintf(file_name + len, "%s", fname);
1232bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt
1233bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt	/* clean cloned siblings using existing files */
1234bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt	if (numjob && is_already_allocated(file_name))
1235bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt		return 0;
1236bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt
12377b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe	f = alloc_new_file(td);
1238bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe
1239fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe	if (td->files_size <= td->files_index) {
12401983e3271c20a5dca84ac1ad872e44dd9e62e6b8Jianpeng Ma		unsigned int new_size = td->o.nr_files + 1;
1241126d65c6fc97d6acdc568aa5a969c012018daf15Jens Axboe
1242fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe		dprint(FD_FILE, "resize file array to %d files\n", new_size);
1243fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe
1244fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe		td->files = realloc(td->files, new_size * sizeof(f));
1245d537c08b0eacdeb05835ee8c5f269b872239713aJianpeng Ma		if (td->files == NULL) {
1246d537c08b0eacdeb05835ee8c5f269b872239713aJianpeng Ma			log_err("fio: realloc OOM\n");
1247d537c08b0eacdeb05835ee8c5f269b872239713aJianpeng Ma			assert(0);
1248d537c08b0eacdeb05835ee8c5f269b872239713aJianpeng Ma		}
1249d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe		if (td->o.file_lock_mode != FILE_LOCK_NONE) {
1250d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe			td->file_locks = realloc(td->file_locks, new_size);
1251d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe			if (!td->file_locks) {
1252d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe				log_err("fio: realloc OOM\n");
1253d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe				assert(0);
1254d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe			}
1255d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe			td->file_locks[cur_files] = FILE_LOCK_NONE;
1256d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe		}
1257fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe		td->files_size = new_size;
1258fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe	}
12598bb7679e73d3086a01b9d21a650b0d7a859412b6Jens Axboe	td->files[cur_files] = f;
126089ac1d48971578ccb0645c292d4a058340aeb909Shaohua Li	f->fileno = cur_files;
1261126d65c6fc97d6acdc568aa5a969c012018daf15Jens Axboe
126207eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe	/*
126307eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe	 * init function, io engine may not be loaded yet
126407eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe	 */
126507eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe	if (td->io_ops && (td->io_ops->flags & FIO_DISKLESSIO))
126607eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe		f->real_file_size = -1ULL;
126707eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe
1268f17c43928c202e557f2f325272c60d9050ee528eJens Axboe	f->file_name = smalloc_strdup(file_name);
1269c48c0be79173897824d8f439c39374f2588931dcJens Axboe	if (!f->file_name) {
1270c48c0be79173897824d8f439c39374f2588931dcJens Axboe		log_err("fio: smalloc OOM\n");
1271c48c0be79173897824d8f439c39374f2588931dcJens Axboe		assert(0);
1272c48c0be79173897824d8f439c39374f2588931dcJens Axboe	}
12730b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe
1274e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboe	get_file_type(f);
1275af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
12764d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	switch (td->o.file_lock_mode) {
12774d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	case FILE_LOCK_NONE:
12784d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		break;
12794d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	case FILE_LOCK_READWRITE:
1280d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe		f->rwlock = fio_rwlock_init();
12814d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		break;
12824d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	case FILE_LOCK_EXCLUSIVE:
1283521da527743088a9bd2ab882f8b64799d49d5848Jens Axboe		f->lock = fio_mutex_init(FIO_MUTEX_UNLOCKED);
12844d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		break;
12854d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	default:
12864d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		log_err("fio: unknown lock mode: %d\n", td->o.file_lock_mode);
12874d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		assert(0);
12884d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	}
128929c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe
12907b4e4fe5e6fa26f82f9169c18ec70c08d0805ca9Jens Axboe	td->files_index++;
12911549441cdfecb2c1a4a8b8d494253859d67b4344Jens Axboe	if (f->filetype == FIO_TYPE_FILE)
12921549441cdfecb2c1a4a8b8d494253859d67b4344Jens Axboe		td->nr_normal_files++;
1293f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
1294bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt	set_already_allocated(file_name);
1295bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt
12965903e7b7907854014478b6febfc5645a203ff59eJens Axboe	if (inc)
12975903e7b7907854014478b6febfc5645a203ff59eJens Axboe		td->o.nr_files++;
12985903e7b7907854014478b6febfc5645a203ff59eJens Axboe
12995ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe	dprint(FD_FILE, "file %p \"%s\" added at %d\n", f, f->file_name,
13005ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe							cur_files);
13019efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe
1302f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	return cur_files;
1303af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe}
13040ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe
130549ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboeint add_file_exclusive(struct thread_data *td, const char *fname)
130649ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe{
130749ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe	struct fio_file *f;
130849ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe	unsigned int i;
130949ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe
131049ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe	for_each_file(td, f, i) {
131149ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe		if (!strcmp(f->file_name, fname))
131249ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe			return i;
131349ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe	}
131449ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe
13155903e7b7907854014478b6febfc5645a203ff59eJens Axboe	return add_file(td, fname, 0, 1);
131649ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe}
131749ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe
13180ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboevoid get_file(struct fio_file *f)
13190ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe{
13208172fe972f3a79d42f34d7f6e259ed3f7f800316Jens Axboe	dprint(FD_FILE, "get file %s, ref=%d\n", f->file_name, f->references);
1321d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe	assert(fio_file_open(f));
13220ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	f->references++;
13230ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe}
13240ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe
13256977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboeint put_file(struct thread_data *td, struct fio_file *f)
13260ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe{
132798e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe	int f_ret = 0, ret = 0;
13286977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe
13298172fe972f3a79d42f34d7f6e259ed3f7f800316Jens Axboe	dprint(FD_FILE, "put file %s, ref=%d\n", f->file_name, f->references);
1330ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
133122a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe	if (!fio_file_open(f)) {
133222a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe		assert(f->fd == -1);
13336977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe		return 0;
133422a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe	}
13350ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe
13360ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	assert(f->references);
13370ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	if (--f->references)
13386977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe		return 0;
13390ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe
134071b84caab6ef5ddbc7893e3268887b8ff0516f75Jens Axboe	if (should_fsync(td) && td->o.fsync_on_close) {
134198e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe		f_ret = fsync(f->fd);
134271b84caab6ef5ddbc7893e3268887b8ff0516f75Jens Axboe		if (f_ret < 0)
134371b84caab6ef5ddbc7893e3268887b8ff0516f75Jens Axboe			f_ret = errno;
134471b84caab6ef5ddbc7893e3268887b8ff0516f75Jens Axboe	}
1345ebb1415f729c123b8a13bcbd667bf4b4cc95b4d4Jens Axboe
13460ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	if (td->io_ops->close_file)
13476977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe		ret = td->io_ops->close_file(td, f);
13481020a139beff50faf1bb18f761b024b664a09e14Jens Axboe
134998e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe	if (!ret)
1350a5fb461fdff86c442daeebbd28e07984be9f3807Jens Axboe		ret = f_ret;
135198e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe
13520ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	td->nr_open_files--;
1353d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe	fio_file_clear_open(f);
135422a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe	assert(f->fd == -1);
13556977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe	return ret;
13560ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe}
1357bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
13584d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid lock_file(struct thread_data *td, struct fio_file *f, enum fio_ddir ddir)
1359b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe{
13604d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (!f->lock || td->o.file_lock_mode == FILE_LOCK_NONE)
13614d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		return;
136229c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe
13634d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (td->o.file_lock_mode == FILE_LOCK_READWRITE) {
13644d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		if (ddir == DDIR_READ)
1365d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe			fio_rwlock_read(f->rwlock);
13664d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		else
1367d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe			fio_rwlock_write(f->rwlock);
13684d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	} else if (td->o.file_lock_mode == FILE_LOCK_EXCLUSIVE)
13694d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		fio_mutex_down(f->lock);
13704d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
1371d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe	td->file_locks[f->fileno] = td->o.file_lock_mode;
1372b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe}
1373b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe
13744d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid unlock_file(struct thread_data *td, struct fio_file *f)
1375b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe{
13764d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (!f->lock || td->o.file_lock_mode == FILE_LOCK_NONE)
13774d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		return;
13784d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
1379d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe	if (td->o.file_lock_mode == FILE_LOCK_READWRITE)
1380d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe		fio_rwlock_unlock(f->rwlock);
1381d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe	else if (td->o.file_lock_mode == FILE_LOCK_EXCLUSIVE)
13824d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		fio_mutex_up(f->lock);
1383d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe
1384d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe	td->file_locks[f->fileno] = FILE_LOCK_NONE;
1385b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe}
1386b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe
13874d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid unlock_file_all(struct thread_data *td, struct fio_file *f)
13884d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe{
1389f2a2803a4982a1516eb75d9f98de68cf21d1ae7dJens Axboe	if (td->o.file_lock_mode == FILE_LOCK_NONE || !td->file_locks)
139027ddbfa09b22911d5cefb42a44f894e6eb48216eJens Axboe		return;
1391d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe	if (td->file_locks[f->fileno] != FILE_LOCK_NONE)
1392d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe		unlock_file(td, f);
13934d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe}
13944d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
1395bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboestatic int recurse_dir(struct thread_data *td, const char *dirname)
1396bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe{
1397bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	struct dirent *dir;
1398bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	int ret = 0;
1399bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	DIR *D;
1400bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1401bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	D = opendir(dirname);
1402bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	if (!D) {
14030ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		char buf[FIO_VERROR_SIZE];
14040ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe
140598ffb8f3ecebed9984d1744f142eb8be10c14dbdKen Raeburn		snprintf(buf, FIO_VERROR_SIZE, "opendir(%s)", dirname);
14060ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		td_verror(td, errno, buf);
1407bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		return 1;
1408bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	}
1409bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1410bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	while ((dir = readdir(D)) != NULL) {
1411bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		char full_path[PATH_MAX];
1412bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		struct stat sb;
1413bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1414e85b2b83e39b64ba5cb73fbfddbf3902b6e84925Jens Axboe		if (!strcmp(dir->d_name, ".") || !strcmp(dir->d_name, ".."))
1415e85b2b83e39b64ba5cb73fbfddbf3902b6e84925Jens Axboe			continue;
141696d32d518a0743a6c050057bc1562e4883e51c5dJens Axboe
1417b9fd788f0e8adacc33316107594e9eb0463743d7Bruce Cran		sprintf(full_path, "%s%s%s", dirname, FIO_OS_PATH_SEPARATOR, dir->d_name);
1418bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1419bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		if (lstat(full_path, &sb) == -1) {
1420bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			if (errno != ENOENT) {
1421bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe				td_verror(td, errno, "stat");
142268ace9e00ca481d101f9937461402b83e8895ba2Jens Axboe				ret = 1;
142368ace9e00ca481d101f9937461402b83e8895ba2Jens Axboe				break;
1424bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			}
1425bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		}
1426bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1427bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		if (S_ISREG(sb.st_mode)) {
14285903e7b7907854014478b6febfc5645a203ff59eJens Axboe			add_file(td, full_path, 0, 1);
1429bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			continue;
1430bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		}
14310ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		if (!S_ISDIR(sb.st_mode))
14320ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe			continue;
1433bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
14345ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		ret = recurse_dir(td, full_path);
14355ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		if (ret)
1436bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			break;
1437bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	}
1438bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1439bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	closedir(D);
1440bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	return ret;
1441bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe}
1442bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1443bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboeint add_dir_files(struct thread_data *td, const char *path)
1444bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe{
14450ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe	int ret = recurse_dir(td, path);
14460ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe
14470ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe	if (!ret)
14480ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		log_info("fio: opendir added %d files\n", td->o.nr_files);
14490ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe
14500ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe	return ret;
1451bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe}
1452cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe
1453cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboevoid dup_files(struct thread_data *td, struct thread_data *org)
1454cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe{
1455cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	struct fio_file *f;
1456cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	unsigned int i;
14579efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe
14589efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe	dprint(FD_FILE, "dup files: %d\n", org->files_index);
1459cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe
1460cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	if (!org->files)
1461cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe		return;
1462cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe
14639efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe	td->files = malloc(org->files_index * sizeof(f));
1464cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe
1465d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe	if (td->o.file_lock_mode != FILE_LOCK_NONE)
1466d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe		td->file_locks = malloc(org->files_index);
1467d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe
14689efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe	for_each_file(org, f, i) {
1469b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe		struct fio_file *__f;
1470b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe
14717b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe		__f = alloc_new_file(td);
14720b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe
1473bc3456fa06cc7777c4764da8c7b1c0fd0a3c3772Aaron Carroll		if (f->file_name) {
1474f17c43928c202e557f2f325272c60d9050ee528eJens Axboe			__f->file_name = smalloc_strdup(f->file_name);
1475c48c0be79173897824d8f439c39374f2588931dcJens Axboe			if (!__f->file_name) {
1476c48c0be79173897824d8f439c39374f2588931dcJens Axboe				log_err("fio: smalloc OOM\n");
1477c48c0be79173897824d8f439c39374f2588931dcJens Axboe				assert(0);
1478c48c0be79173897824d8f439c39374f2588931dcJens Axboe			}
14790b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe
1480bc3456fa06cc7777c4764da8c7b1c0fd0a3c3772Aaron Carroll			__f->filetype = f->filetype;
1481bc3456fa06cc7777c4764da8c7b1c0fd0a3c3772Aaron Carroll		}
1482b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe
148367ad92428bb19008354ca20e614050241e9f17e7Jens Axboe		if (td->o.file_lock_mode == FILE_LOCK_EXCLUSIVE)
148467ad92428bb19008354ca20e614050241e9f17e7Jens Axboe			__f->lock = f->lock;
148567ad92428bb19008354ca20e614050241e9f17e7Jens Axboe		else if (td->o.file_lock_mode == FILE_LOCK_READWRITE)
148667ad92428bb19008354ca20e614050241e9f17e7Jens Axboe			__f->rwlock = f->rwlock;
148767ad92428bb19008354ca20e614050241e9f17e7Jens Axboe
1488b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe		td->files[i] = __f;
1489cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	}
1490cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe}
1491f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
1492f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe/*
1493f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe * Returns the index that matches the filename, or -1 if not there
1494f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe */
1495f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboeint get_fileno(struct thread_data *td, const char *fname)
1496f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe{
1497f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	struct fio_file *f;
1498f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	unsigned int i;
1499f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
1500f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	for_each_file(td, f, i)
1501f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe		if (!strcmp(f->file_name, fname))
1502f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe			return i;
1503f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
1504f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	return -1;
1505f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe}
1506f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
1507f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe/*
1508f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe * For log usage, where we add/open/close files automatically
1509f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe */
1510f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboevoid free_release_files(struct thread_data *td)
1511f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe{
1512f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	close_files(td);
1513f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	td->files_index = 0;
1514f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	td->nr_normal_files = 0;
1515f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe}
151633c48814e08cf961801bf37f759da2748eb3431bJens Axboe
151733c48814e08cf961801bf37f759da2748eb3431bJens Axboevoid fio_file_reset(struct thread_data *td, struct fio_file *f)
151833c48814e08cf961801bf37f759da2748eb3431bJens Axboe{
151933c48814e08cf961801bf37f759da2748eb3431bJens Axboe	f->last_pos = f->file_offset;
152033c48814e08cf961801bf37f759da2748eb3431bJens Axboe	f->last_start = -1ULL;
152133c48814e08cf961801bf37f759da2748eb3431bJens Axboe	if (f->io_axmap)
152233c48814e08cf961801bf37f759da2748eb3431bJens Axboe		axmap_reset(f->io_axmap);
152333c48814e08cf961801bf37f759da2748eb3431bJens Axboe	if (td->o.random_generator == FIO_RAND_GEN_LFSR)
152433c48814e08cf961801bf37f759da2748eb3431bJens Axboe		lfsr_reset(&f->lfsr, td->rand_seeds[FIO_RAND_BLOCK_OFF]);
152533c48814e08cf961801bf37f759da2748eb3431bJens Axboe}
1526002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe
1527002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboeint fio_files_done(struct thread_data *td)
1528002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe{
1529002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe	struct fio_file *f;
1530002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe	unsigned int i;
1531002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe
1532002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe	for_each_file(td, f, i)
1533002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe		if (!fio_file_done(f))
1534002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe			return 0;
1535002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe
1536002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe	return 1;
1537002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe}
1538bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt
1539bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt/* free memory used in initialization phase only */
1540190b8f0c9c1c1a99ed26fd953f7af9023f9533eeCastor Fuvoid filesetup_mem_free(void)
1541190b8f0c9c1c1a99ed26fd953f7af9023f9533eeCastor Fu{
1542bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt	free_already_allocated();
1543bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt}
1544