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);
629187a269bf4539fa4b5b97a9b7439ba408d6b872Castor Fu		if ((td_io_unlink_file(td, f) < 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
729c0f3f3279985b724c2f1358bb05cc2c795f2265Bruce Cran#ifdef WIN32
739c0f3f3279985b724c2f1358bb05cc2c795f2265Bruce Cran	flags |= _O_BINARY;
749c0f3f3279985b724c2f1358bb05cc2c795f2265Bruce Cran#endif
759c0f3f3279985b724c2f1358bb05cc2c795f2265Bruce Cran
76ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "open file %s, flags %x\n", f->file_name, flags);
77507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboe	f->fd = open(f->file_name, flags, 0644);
7853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (f->fd < 0) {
79e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, errno, "open");
8053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return 1;
8153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
8253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
8397ac992c99d89eed8cdf9249bb038ac4d7b709b9Jens Axboe#ifdef CONFIG_POSIX_FALLOCATE
84a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou	if (!td->o.fill_device) {
85a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou		switch (td->o.fallocate_mode) {
86a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou		case FIO_FALLOCATE_NONE:
87a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			break;
88a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou		case FIO_FALLOCATE_POSIX:
89a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			dprint(FD_FILE, "posix_fallocate file %s size %llu\n",
904b91ee8fd12c72bd76ce9f5ff9116626b48566a0Jens Axboe				 f->file_name,
914b91ee8fd12c72bd76ce9f5ff9116626b48566a0Jens Axboe				 (unsigned long long) f->real_file_size);
92a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou
93a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			r = posix_fallocate(f->fd, 0, f->real_file_size);
94a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			if (r > 0) {
95a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou				log_err("fio: posix_fallocate fails: %s\n",
96a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou						strerror(r));
97a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			}
98a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			break;
9997ac992c99d89eed8cdf9249bb038ac4d7b709b9Jens Axboe#ifdef CONFIG_LINUX_FALLOCATE
100a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou		case FIO_FALLOCATE_KEEP_SIZE:
101a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			dprint(FD_FILE,
102a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou				"fallocate(FALLOC_FL_KEEP_SIZE) "
1034b91ee8fd12c72bd76ce9f5ff9116626b48566a0Jens Axboe				"file %s size %llu\n", f->file_name,
1044b91ee8fd12c72bd76ce9f5ff9116626b48566a0Jens Axboe				(unsigned long long) f->real_file_size);
1057bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe
106a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			r = fallocate(f->fd, FALLOC_FL_KEEP_SIZE, 0,
107a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou					f->real_file_size);
108888677a428eb6ae6b54195e99734d6d6b3ee55e7Jens Axboe			if (r != 0)
109a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou				td_verror(td, errno, "fallocate");
110888677a428eb6ae6b54195e99734d6d6b3ee55e7Jens Axboe
111a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			break;
11297ac992c99d89eed8cdf9249bb038ac4d7b709b9Jens Axboe#endif /* CONFIG_LINUX_FALLOCATE */
113a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou		default:
114a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			log_err("fio: unknown fallocate mode: %d\n",
115a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou				td->o.fallocate_mode);
116a596f047e2b3d447ccca76bd075f05473a1f8d1cEric Gouriou			assert(0);
1177bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe		}
1187bc8c2cf02fbd538ca388618ff2f4618787a86e0Jens Axboe	}
11997ac992c99d89eed8cdf9249bb038ac4d7b709b9Jens Axboe#endif /* CONFIG_POSIX_FALLOCATE */
1209b8365618309572d8fd2579c8ea3132db89f843fBruce Cran
121fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis	if (!new_layout)
122fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis		goto done;
123fc74ac1d749c977308016eb22c8658a9a5ac7989Shawn Lewis
1245e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	/*
1255e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	 * The size will be -1ULL when fill_device is used, so don't truncate
1265e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	 * or fallocate this file, just write it
1275e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	 */
1285e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	if (!td->o.fill_device) {
1295e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe		dprint(FD_FILE, "truncate file %s, size %llu\n", f->file_name,
1304b91ee8fd12c72bd76ce9f5ff9116626b48566a0Jens Axboe					(unsigned long long) f->real_file_size);
1315e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe		if (ftruncate(f->fd, f->real_file_size) == -1) {
1323cd4c66f35fad0df64e4e6dfeddc5bdfd5206e0cJohn			if (errno != EFBIG) {
1333cd4c66f35fad0df64e4e6dfeddc5bdfd5206e0cJohn				td_verror(td, errno, "ftruncate");
1343cd4c66f35fad0df64e4e6dfeddc5bdfd5206e0cJohn				goto err;
1353cd4c66f35fad0df64e4e6dfeddc5bdfd5206e0cJohn			}
1365e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe		}
1375e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	}
13840f8298cd252157fa15d93f8eb470116a94069a0Jens Axboe
1392dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	b = malloc(td->o.max_bs[DDIR_WRITE]);
14053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
1417bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	left = f->real_file_size;
14253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	while (left && !td->terminate) {
1432dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe		bs = td->o.max_bs[DDIR_WRITE];
14453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		if (bs > left)
14553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			bs = left;
14653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
147cc86c395fd9dd2002ec1edc0967b7c9453debdfbJens Axboe		fill_io_buffer(td, b, bs, bs);
148cc86c395fd9dd2002ec1edc0967b7c9453debdfbJens Axboe
14953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		r = write(f->fd, b, bs);
15053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
1515e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe		if (r > 0) {
1525e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			left -= r;
15353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			continue;
15453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		} else {
1555e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			if (r < 0) {
1565e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe				int __e = errno;
1575e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe
1585e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe				if (__e == ENOSPC) {
1595e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe					if (td->o.fill_device)
1605e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe						break;
1615e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe					log_info("fio: ENOSPC on laying out "
1625e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe						 "file, stopping\n");
1635e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe					break;
1645e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe				}
165e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe				td_verror(td, errno, "write");
1665e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			} else
167e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe				td_verror(td, EIO, "write");
16853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
16953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			break;
17053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		}
17153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
17253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
173ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe	if (td->terminate) {
174ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe		dprint(FD_FILE, "terminate unlink %s\n", f->file_name);
1759187a269bf4539fa4b5b97a9b7439ba408d6b872Castor Fu		td_io_unlink_file(td, f);
176ffdfabd48d0edfba9cb53cfd27a2f12ad887c211Jens Axboe	} else if (td->o.create_fsync) {
17798e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe		if (fsync(f->fd) < 0) {
17898e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe			td_verror(td, errno, "fsync");
17998e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe			goto err;
18098e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe		}
18198e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe	}
1820d1cd207e409a36313784cb9596990c819775f77Jens Axboe	if (td->o.fill_device && !td_write(td)) {
183d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe		fio_file_clear_size_known(f);
1845e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe		if (td_io_get_file_size(td, f))
1855e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			goto err;
1865e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe		if (f->io_size > f->real_file_size)
1875e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			f->io_size = f->real_file_size;
1885e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	}
18953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
19053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	free(b);
191507a702f6a61fa461c2566d01dcc46380ee7dffaJens Axboedone:
19253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
19353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboeerr:
19453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	close(f->fd);
19553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	f->fd = -1;
196f3e1eb23a6c900921caa58c6cad66d3b60b0b6d7Jens Axboe	if (b)
197f3e1eb23a6c900921caa58c6cad66d3b60b0b6d7Jens Axboe		free(b);
19853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 1;
19953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
20053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
201afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanminstatic int pre_read_file(struct thread_data *td, struct fio_file *f)
202afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin{
203ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe	int ret = 0, r, did_open = 0, old_runstate;
204afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	unsigned long long left;
205afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	unsigned int bs;
206afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	char *b;
207afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
2089c0d224129b0c59698e4c77e7fed00dc8cbb50e1Jens Axboe	if (td->io_ops->flags & FIO_PIPEIO)
2099c0d224129b0c59698e4c77e7fed00dc8cbb50e1Jens Axboe		return 0;
2109c0d224129b0c59698e4c77e7fed00dc8cbb50e1Jens Axboe
211d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe	if (!fio_file_open(f)) {
212b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe		if (td->io_ops->open_file(td, f)) {
213b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe			log_err("fio: cannot pre-read, failed to open file\n");
214b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe			return 1;
215b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe		}
216b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe		did_open = 1;
217b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe	}
218b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe
2198edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe	old_runstate = td_bump_runstate(td, TD_PRE_READING);
220b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe
221afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	bs = td->o.max_bs[DDIR_READ];
222afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	b = malloc(bs);
223afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	memset(b, 0, bs);
224afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
225ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe	if (lseek(f->fd, f->file_offset, SEEK_SET) < 0) {
226ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe		td_verror(td, errno, "lseek");
227ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe		log_err("fio: failed to lseek pre-read file\n");
228ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe		ret = 1;
229ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe		goto error;
230ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe	}
231ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe
232afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	left = f->io_size;
233afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
234afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	while (left && !td->terminate) {
235afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin		if (bs > left)
236afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin			bs = left;
237afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
238afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin		r = read(f->fd, b, bs);
239afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
240afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin		if (r == (int) bs) {
241afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin			left -= bs;
242afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin			continue;
243afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin		} else {
244afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin			td_verror(td, EIO, "pre_read");
245afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin			break;
246afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin		}
247afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	}
248afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
249ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboeerror:
2508edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe	td_restore_runstate(td, old_runstate);
251b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe
252b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe	if (did_open)
253b0f65863844b4de92d10fefaabde80ea5bc3e5ccJens Axboe		td->io_ops->close_file(td, f);
254ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe
255afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	free(b);
256ef799a64618cbd53adb50d615666cd7afe9f0a8fJens Axboe	return ret;
257afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin}
258afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
2597bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboestatic unsigned long long get_rand_file_size(struct thread_data *td)
2609c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe{
261dc873b6f4a536c332b72cce268d5a7ccd356a891Jens Axboe	unsigned long long ret, sized;
2621294c3ec7a02d20a98b105c1c41b23358afc67e4Jens Axboe	unsigned long r;
2639c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe
264f678701783f1c200ce574215feeb7ff801c4ff72Jens Axboe	r = __rand(&td->file_size_state);
265559073f664a872f32632892c560667097b29e963Jens Axboe	sized = td->o.file_size_high - td->o.file_size_low;
266559073f664a872f32632892c560667097b29e963Jens Axboe	ret = (unsigned long long) ((double) sized * (r / (FRAND_MAX + 1.0)));
2675ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe	ret += td->o.file_size_low;
2682dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	ret -= (ret % td->o.rw_min_bs);
2699c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe	return ret;
2709c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe}
2719c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe
27253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int file_size(struct thread_data *td, struct fio_file *f)
27353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
27453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	struct stat st;
27553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
276df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe	if (stat(f->file_name, &st) == -1) {
2777bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		td_verror(td, errno, "fstat");
2787bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		return 1;
2797bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
28053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
2817bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	f->real_file_size = st.st_size;
28253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
28353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
28453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
28553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int bdev_size(struct thread_data *td, struct fio_file *f)
28653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
2879b8365618309572d8fd2579c8ea3132db89f843fBruce Cran	unsigned long long bytes = 0;
28853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	int r;
28953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
290df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe	if (td->io_ops->open_file(td, f)) {
291df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe		log_err("fio: failed opening blockdev %s for size check\n",
292df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe			f->file_name);
293df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe		return 1;
294df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe	}
295df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe
296ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran	r = blockdev_size(f, &bytes);
29753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (r) {
298e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, r, "blockdev_size");
299df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe		goto err;
30053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
30153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
3027ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe	if (!bytes) {
3037ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe		log_err("%s: zero sized block device?\n", f->file_name);
304df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe		goto err;
3057ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe	}
3067ab077ab119fd28b6ccf5705ea8453e414f574c1Jens Axboe
30753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	f->real_file_size = bytes;
30822a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe	td->io_ops->close_file(td, f);
30953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
310df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboeerr:
311df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe	td->io_ops->close_file(td, f);
312df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe	return 1;
31353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
31453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
3154ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboestatic int char_size(struct thread_data *td, struct fio_file *f)
3164ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe{
3174ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe#ifdef FIO_HAVE_CHARDEV_SIZE
3189b8365618309572d8fd2579c8ea3132db89f843fBruce Cran	unsigned long long bytes = 0;
3194ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	int r;
3204ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe
3214ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	if (td->io_ops->open_file(td, f)) {
3224ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		log_err("fio: failed opening blockdev %s for size check\n",
3234ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe			f->file_name);
3244ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		return 1;
3254ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	}
3264ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe
327ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran	r = chardev_size(f, &bytes);
3284ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	if (r) {
3294ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		td_verror(td, r, "chardev_size");
3304ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		goto err;
3314ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	}
3324ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe
3334ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	if (!bytes) {
3344ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		log_err("%s: zero sized char device?\n", f->file_name);
3354ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		goto err;
3364ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	}
3374ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe
3384ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	f->real_file_size = bytes;
3394ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	td->io_ops->close_file(td, f);
3404ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	return 0;
3414ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboeerr:
3424ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	td->io_ops->close_file(td, f);
3434ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	return 1;
3444ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe#else
3454ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	f->real_file_size = -1ULL;
3464ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	return 0;
3474ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe#endif
3484ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe}
3494ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe
35053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int get_file_size(struct thread_data *td, struct fio_file *f)
35153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
35253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	int ret = 0;
35353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
354d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe	if (fio_file_size_known(f))
355409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe		return 0;
356409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe
3577bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (f->filetype == FIO_TYPE_FILE)
3587bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		ret = file_size(td, f);
3597bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	else if (f->filetype == FIO_TYPE_BD)
36053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		ret = bdev_size(td, f);
3614ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe	else if (f->filetype == FIO_TYPE_CHAR)
3624ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		ret = char_size(td, f);
36353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	else
36453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		f->real_file_size = -1;
36553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
36653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (ret)
36753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return ret;
36853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
36953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (f->file_offset > f->real_file_size) {
3700f2152c19ed12fc2280c3d475973112f18e48cd5Bruce Cran		log_err("%s: offset extends end (%llu > %llu)\n", td->o.name,
3714e0a8fa2593006505b7f4e18931a201d221b49e9Jens Axboe					(unsigned long long) f->file_offset,
3724e0a8fa2593006505b7f4e18931a201d221b49e9Jens Axboe					(unsigned long long) f->real_file_size);
37353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return 1;
37453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
37553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
376d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe	fio_file_set_size_known(f);
37753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
37853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
37953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
3803baddf2450d811be658fb47ef883ee84478dc352Jens Axboestatic int __file_invalidate_cache(struct thread_data *td, struct fio_file *f,
3813baddf2450d811be658fb47ef883ee84478dc352Jens Axboe				   unsigned long long off,
3823baddf2450d811be658fb47ef883ee84478dc352Jens Axboe				   unsigned long long len)
383e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe{
384e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	int ret = 0;
385e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
386ef7035a9b2c7af1e745b7cd2448685527ef7eeb0Jens Axboe#ifdef CONFIG_ESX
387ef7035a9b2c7af1e745b7cd2448685527ef7eeb0Jens Axboe	return 0;
388ef7035a9b2c7af1e745b7cd2448685527ef7eeb0Jens Axboe#endif
389ef7035a9b2c7af1e745b7cd2448685527ef7eeb0Jens Axboe
3905e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	if (len == -1ULL)
3913baddf2450d811be658fb47ef883ee84478dc352Jens Axboe		len = f->io_size;
3923baddf2450d811be658fb47ef883ee84478dc352Jens Axboe	if (off == -1ULL)
3933baddf2450d811be658fb47ef883ee84478dc352Jens Axboe		off = f->file_offset;
394ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
3950d1cd207e409a36313784cb9596990c819775f77Jens Axboe	if (len == -1ULL || off == -1ULL)
3960d1cd207e409a36313784cb9596990c819775f77Jens Axboe		return 0;
3970d1cd207e409a36313784cb9596990c819775f77Jens Axboe
3983baddf2450d811be658fb47ef883ee84478dc352Jens Axboe	dprint(FD_IO, "invalidate cache %s: %llu/%llu\n", f->file_name, off,
3993baddf2450d811be658fb47ef883ee84478dc352Jens Axboe								len);
400b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe
4011be9f219c5f7d218a6c5cced3ee93c7174a032daJens Axboe	if (td->io_ops->invalidate)
4021be9f219c5f7d218a6c5cced3ee93c7174a032daJens Axboe		ret = td->io_ops->invalidate(td, f);
403eea6bedef6357ff84b878f989f758f9a8e441839Jens Axboe	else if (f->filetype == FIO_TYPE_FILE)
404ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran		ret = posix_fadvise(f->fd, off, len, POSIX_FADV_DONTNEED);
405eea6bedef6357ff84b878f989f758f9a8e441839Jens Axboe	else if (f->filetype == FIO_TYPE_BD) {
406ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran		ret = blockdev_invalidate_cache(f);
4077e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe		if (ret < 0 && errno == EACCES && geteuid()) {
4087172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe			if (!root_warn) {
4095ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				log_err("fio: only root may flush block "
4105ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe					"devices. Cache flush bypassed!\n");
4117172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe				root_warn = 1;
4127172cfe8e0e918cc279eb501986f6ec78cc7aad9Jens Axboe			}
4137e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe			ret = 0;
4147e0e25c924d51f23196b3e0ea83b79178fc46823Jens Axboe		}
415b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe	} else if (f->filetype == FIO_TYPE_CHAR || f->filetype == FIO_TYPE_PIPE)
416e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe		ret = 0;
417e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
418dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe	/*
419dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe	 * Cache flushing isn't a fatal condition, and we know it will
420dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe	 * happen on some platforms where we don't have the proper
421dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe	 * function to flush eg block device caches. So just warn and
422dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe	 * continue on our way.
423dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe	 */
424dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe	if (ret) {
425dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe		log_info("fio: cache invalidation of %s failed: %s\n", f->file_name, strerror(errno));
426dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe		ret = 0;
427e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	}
428e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
429dfe11fd1e8249a52c42f34c9e9e6b910ab6b05c5Jens Axboe	return 0;
4303baddf2450d811be658fb47ef883ee84478dc352Jens Axboe
4313baddf2450d811be658fb47ef883ee84478dc352Jens Axboe}
4323baddf2450d811be658fb47ef883ee84478dc352Jens Axboe
4333baddf2450d811be658fb47ef883ee84478dc352Jens Axboeint file_invalidate_cache(struct thread_data *td, struct fio_file *f)
4343baddf2450d811be658fb47ef883ee84478dc352Jens Axboe{
435d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe	if (!fio_file_open(f))
436a5fb461fdff86c442daeebbd28e07984be9f3807Jens Axboe		return 0;
437a5fb461fdff86c442daeebbd28e07984be9f3807Jens Axboe
4385e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe	return __file_invalidate_cache(td, f, -1ULL, -1ULL);
439e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe}
440e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
4416977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboeint generic_close_file(struct thread_data fio_unused *td, struct fio_file *f)
44253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
4436977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe	int ret = 0;
4446977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe
445ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "fd close %s\n", f->file_name);
4464906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe
4474906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe	remove_file_hash(f);
4484906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe
4496977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe	if (close(f->fd) < 0)
4506977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe		ret = errno;
4516977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe
452b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe	f->fd = -1;
453e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe
454e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe	if (f->shadow_fd != -1) {
455e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe		close(f->shadow_fd);
456e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe		f->shadow_fd = -1;
457e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe	}
458e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe
45957e54e087e051186d18cdedad20a2460463d4d30Juan Casse	f->engine_data = 0;
4606977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe	return ret;
46153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
46253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
4631ccc6dc75b28ef70cd7a8c39ac8c1cb68c720a65Dmitry Monakhovint file_lookup_open(struct fio_file *f, int flags)
46453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
46529c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe	struct fio_file *__f;
4664d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	int from_hash;
4674d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
4684d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	__f = lookup_file_hash(f->file_name);
4694d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (__f) {
4709efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe		dprint(FD_FILE, "found file in hash %s\n", f->file_name);
4714d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		/*
4724d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		 * racy, need the __f->lock locked
4734d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		 */
4744d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		f->lock = __f->lock;
4754d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		from_hash = 1;
4764d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	} else {
4779efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe		dprint(FD_FILE, "file not found in hash %s\n", f->file_name);
4784d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		from_hash = 0;
4794d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	}
4804d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
4819c0f3f3279985b724c2f1358bb05cc2c795f2265Bruce Cran#ifdef WIN32
4829c0f3f3279985b724c2f1358bb05cc2c795f2265Bruce Cran	flags |= _O_BINARY;
4839c0f3f3279985b724c2f1358bb05cc2c795f2265Bruce Cran#endif
4849c0f3f3279985b724c2f1358bb05cc2c795f2265Bruce Cran
485e8670ef8b26039573fbf835b4b95ba45a1039d83Jens Axboe	f->fd = open(f->file_name, flags, 0600);
4864d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	return from_hash;
4874d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe}
4884d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
489e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboestatic int file_close_shadow_fds(struct thread_data *td)
490e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe{
491e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe	struct fio_file *f;
492e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe	int num_closed = 0;
493e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe	unsigned int i;
494e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe
495e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe	for_each_file(td, f, i) {
496e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe		if (f->shadow_fd == -1)
497e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe			continue;
498e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe
499e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe		close(f->shadow_fd);
500e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe		f->shadow_fd = -1;
501e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe		num_closed++;
502e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe	}
503e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe
504e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe	return num_closed;
505e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe}
506e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe
5074d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboeint generic_open_file(struct thread_data *td, struct fio_file *f)
5084d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe{
509661598287ecc3b8987f312cf8403936552ce686aJens Axboe	int is_std = 0;
51053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	int flags = 0;
51129c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe	int from_hash = 0;
51253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
513ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "fd open %s\n", f->file_name);
514ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
5156eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	if (td_trim(td) && f->filetype != FIO_TYPE_BD) {
5166eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li		log_err("fio: trim only applies to block device\n");
5176eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li		return 1;
5186eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	}
5196eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li
520661598287ecc3b8987f312cf8403936552ce686aJens Axboe	if (!strcmp(f->file_name, "-")) {
521661598287ecc3b8987f312cf8403936552ce686aJens Axboe		if (td_rw(td)) {
522661598287ecc3b8987f312cf8403936552ce686aJens Axboe			log_err("fio: can't read/write to stdin/out\n");
523661598287ecc3b8987f312cf8403936552ce686aJens Axboe			return 1;
524661598287ecc3b8987f312cf8403936552ce686aJens Axboe		}
525661598287ecc3b8987f312cf8403936552ce686aJens Axboe		is_std = 1;
526ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe
527ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe		/*
528ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe		 * move output logging to stderr, if we are writing to stdout
529ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe		 */
530ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe		if (td_write(td))
531ce98fa663bb7c157b0db45791731d4795d6208a5Jens Axboe			f_out = stderr;
532661598287ecc3b8987f312cf8403936552ce686aJens Axboe	}
533661598287ecc3b8987f312cf8403936552ce686aJens Axboe
5346eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	if (td_trim(td))
5356eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li		goto skip_flags;
5362dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	if (td->o.odirect)
5372fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe		flags |= OS_O_DIRECT;
538d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason	if (td->o.oatomic) {
539d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason		if (!FIO_O_ATOMIC) {
540d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason			td_verror(td, EINVAL, "OS does not support atomic IO");
541d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason			return 1;
542d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason		}
543d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason		flags |= OS_O_DIRECT | FIO_O_ATOMIC;
544d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason	}
5452dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	if (td->o.sync_io)
5462fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe		flags |= O_SYNC;
547814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe	if (td->o.create_on_open)
548814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe		flags |= O_CREAT;
5496eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Liskip_flags:
5506eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	if (f->filetype != FIO_TYPE_FILE)
5516eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li		flags |= FIO_O_NOATIME;
55253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
553056f3459149a7670257350d84b49858718e4a0e6Aaron Carrollopen_again:
554660a1cb5fb9843ec09a04337714e78d63cd557e7Jens Axboe	if (td_write(td)) {
555173081581f94dc4f9f203eb7a7922fc843bfafdeJens Axboe		if (!read_only)
556173081581f94dc4f9f203eb7a7922fc843bfafdeJens Axboe			flags |= O_RDWR;
55753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
558af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe		if (f->filetype == FIO_TYPE_FILE)
5592fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe			flags |= O_CREAT;
5602fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe
561661598287ecc3b8987f312cf8403936552ce686aJens Axboe		if (is_std)
562661598287ecc3b8987f312cf8403936552ce686aJens Axboe			f->fd = dup(STDOUT_FILENO);
5634d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		else
5644d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe			from_hash = file_lookup_open(f, flags);
5656eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	} else if (td_read(td)) {
5664241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe		if (f->filetype == FIO_TYPE_CHAR && !read_only)
5672fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe			flags |= O_RDWR;
5682fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe		else
5692fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe			flags |= O_RDONLY;
5702fd233b7302603fb6fd9b7098994d2a155cf7a22Jens Axboe
571661598287ecc3b8987f312cf8403936552ce686aJens Axboe		if (is_std)
572661598287ecc3b8987f312cf8403936552ce686aJens Axboe			f->fd = dup(STDIN_FILENO);
5734d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		else
5744d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe			from_hash = file_lookup_open(f, flags);
5756eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	} else { //td trim
5766eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li		flags |= O_RDWR;
5776eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li		from_hash = file_lookup_open(f, flags);
57853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
57953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
58053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (f->fd == -1) {
581e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe		char buf[FIO_VERROR_SIZE];
582e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		int __e = errno;
583e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe
584835d9b9ed0e5c2591b8a3eacbd5f4ab6bdab466cJens Axboe		if (__e == EPERM && (flags & FIO_O_NOATIME)) {
5855921e80c5dfc9f96d2f21da6ae58f2b5d3a0b373Jens Axboe			flags &= ~FIO_O_NOATIME;
586056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll			goto open_again;
587056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll		}
588e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe		if (__e == EMFILE && file_close_shadow_fds(td))
589e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe			goto open_again;
590056f3459149a7670257350d84b49858718e4a0e6Aaron Carroll
59198ffb8f3ecebed9984d1744f142eb8be10c14dbdKen Raeburn		snprintf(buf, sizeof(buf), "open(%s)", f->file_name);
592e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe
593a93c5f049da63a60f9962177d8ada50094d234deJens Axboe		if (__e == EINVAL && (flags & OS_O_DIRECT)) {
594a93c5f049da63a60f9962177d8ada50094d234deJens Axboe			log_err("fio: looks like your file system does not " \
595a93c5f049da63a60f9962177d8ada50094d234deJens Axboe				"support direct=1/buffered=0\n");
596a93c5f049da63a60f9962177d8ada50094d234deJens Axboe		}
597a93c5f049da63a60f9962177d8ada50094d234deJens Axboe
598e4e33258637e55550a0fac59eb3350e8bf06f8e6Jens Axboe		td_verror(td, __e, buf);
59934329ca61aaf3be246a4a9d69412a1f3cdccee42Andreas Gruenbacher		return 1;
60053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
60153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
60229c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe	if (!from_hash && f->fd != -1) {
60329c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe		if (add_file_hash(f)) {
6043f0ca9b914e6d0db8c5c457713c277ce458cbc02Jens Axboe			int fio_unused ret;
60529c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe
60629c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe			/*
607e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe			 * Stash away descriptor for later close. This is to
608e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe			 * work-around a "feature" on Linux, where a close of
609e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe			 * an fd that has been opened for write will trigger
610e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe			 * udev to call blkid to check partitions, fs id, etc.
611de8f6de97438d5664cd8765e60102b9109a273e2Anatol Pomozov			 * That pollutes the device cache, which can slow down
612e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe			 * unbuffered accesses.
61329c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe			 */
614e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe			if (f->shadow_fd == -1)
615e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe				f->shadow_fd = f->fd;
616e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe			else {
617e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe				/*
618e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe			 	 * OK to ignore, we haven't done anything
619e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe				 * with it
620e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe				 */
621e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe				ret = generic_close_file(td, f);
622e6c4d732fc99070091367d0ce41fe2cf1ddd1dc9Jens Axboe			}
62329c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe			goto open_again;
62429c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe		}
62529c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe	}
6264906e0b57f2b8cbad02ef2428522281cf6038bddJens Axboe
62753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
628b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe}
629b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe
630df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboeint generic_get_file_size(struct thread_data *td, struct fio_file *f)
63121972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe{
632df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe	return get_file_size(td, f);
63321972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe}
63421972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe
6357bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe/*
6367bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * open/close all files, so that ->real_file_size gets set
6377bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */
638bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboestatic int get_file_sizes(struct thread_data *td)
6397bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe{
6407bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	struct fio_file *f;
6417bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	unsigned int i;
642bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe	int err = 0;
6437bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
6447bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	for_each_file(td, f, i) {
6455ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		dprint(FD_FILE, "get file size for %p/%d/%p\n", f, i,
6465ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe								f->file_name);
6479efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe
64899a47c6905731e53dd4d8f7ea6501f36d9329e7bJens Axboe		if (td_io_get_file_size(td, f)) {
64940b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe			if (td->error != ENOENT) {
65040b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe				log_err("%s\n", td->verror);
65140b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe				err = 1;
65234329ca61aaf3be246a4a9d69412a1f3cdccee42Andreas Gruenbacher				break;
65340b44f4aac3fa9c00ef1573ad73bfc62f760cc2cJens Axboe			}
654541d66d70b8fbe9860b31307c0760e6d5f4c78a8Jens Axboe			clear_error(td);
65507eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe		}
656409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe
657409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe		if (f->real_file_size == -1ULL && td->o.size)
658409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe			f->real_file_size = td->o.size / td->o.nr_files;
6597bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
660bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe
661bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe	return err;
6627bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe}
6637bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
6642e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboestruct fio_mount {
6652e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	struct flist_head list;
6662e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	const char *base;
6672e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	char __base[256];
6682e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	unsigned int key;
6692e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe};
6702e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
6712e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe/*
6722e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe * Get free number of bytes for each file on each unique mount.
6732e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe */
6742e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboestatic unsigned long long get_fs_free_counts(struct thread_data *td)
6752e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe{
6762e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	struct flist_head *n, *tmp;
67768b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe	unsigned long long ret = 0;
6782e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	struct fio_mount *fm;
6792e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	FLIST_HEAD(list);
6802e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	struct fio_file *f;
6812e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	unsigned int i;
6822e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
6832e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	for_each_file(td, f, i) {
6842e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		struct stat sb;
6852e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		char buf[256];
6862e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
6874ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe		if (f->filetype == FIO_TYPE_BD || f->filetype == FIO_TYPE_CHAR) {
6884ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe			if (f->real_file_size != -1ULL)
6894ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe				ret += f->real_file_size;
69068b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe			continue;
69168b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe		} else if (f->filetype != FIO_TYPE_FILE)
69268b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe			continue;
69368b0316f581c3c881d7dbf7c9dafef4a10100a66Jens Axboe
694da27a4bf0f9753fcc9da7b63f1be482fc0349907Jens Axboe		buf[255] = '\0';
695da27a4bf0f9753fcc9da7b63f1be482fc0349907Jens Axboe		strncpy(buf, f->file_name, 255);
6962e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
6972e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		if (stat(buf, &sb) < 0) {
6982e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			if (errno != ENOENT)
6992e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe				break;
7002e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			strcpy(buf, ".");
7012e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			if (stat(buf, &sb) < 0)
7022e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe				break;
7032e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		}
7042e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
7052e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		fm = NULL;
7062e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		flist_for_each(n, &list) {
7072e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			fm = flist_entry(n, struct fio_mount, list);
7082e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			if (fm->key == sb.st_dev)
7092e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe				break;
7102e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
7112e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			fm = NULL;
7122e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		}
7132e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
7142e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		if (fm)
7152e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			continue;
7162e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
7173660ceae229f08b4086279be7c82e86926f0304bJens Axboe		fm = calloc(1, sizeof(*fm));
7183660ceae229f08b4086279be7c82e86926f0304bJens Axboe		strncpy(fm->__base, buf, sizeof(fm->__base) - 1);
7192e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		fm->base = basename(fm->__base);
7202e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		fm->key = sb.st_dev;
7212e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		flist_add(&fm->list, &list);
7222e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	}
7232e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
7242e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	flist_for_each_safe(n, tmp, &list) {
7252e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		unsigned long long sz;
7262e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
7272e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		fm = flist_entry(n, struct fio_mount, list);
7282e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		flist_del(&fm->list);
7292e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
7302e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		sz = get_fs_size(fm->base);
7312e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		if (sz && sz != -1ULL)
7322e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe			ret += sz;
7332e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
7342e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		free(fm);
7352e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	}
7362e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
7372e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe	return ret;
7382e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe}
7392e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
740bedc9dc24223bb33be4120f4a57718bc54888ca5Jens Axboeuint64_t get_start_offset(struct thread_data *td, struct fio_file *f)
741ce95d651568bd5494e4c4ddc95832715c6760d56Dan Ehrenberg{
742bedc9dc24223bb33be4120f4a57718bc54888ca5Jens Axboe	struct thread_options *o = &td->o;
743bedc9dc24223bb33be4120f4a57718bc54888ca5Jens Axboe
744bedc9dc24223bb33be4120f4a57718bc54888ca5Jens Axboe	if (o->file_append && f->filetype == FIO_TYPE_FILE)
745bedc9dc24223bb33be4120f4a57718bc54888ca5Jens Axboe		return f->real_file_size;
746bedc9dc24223bb33be4120f4a57718bc54888ca5Jens Axboe
747ce95d651568bd5494e4c4ddc95832715c6760d56Dan Ehrenberg	return td->o.start_offset +
7485a65b4e4ce51be2144abaf47635e20a0ebf684ecJiri Horky		td->subjob_number * td->o.offset_increment;
749ce95d651568bd5494e4c4ddc95832715c6760d56Dan Ehrenberg}
750ce95d651568bd5494e4c4ddc95832715c6760d56Dan Ehrenberg
7517bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe/*
7527bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe * Open the files and setup files sizes, creating files if necessary.
7537bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe */
75453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboeint setup_files(struct thread_data *td)
75553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
7567bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	unsigned long long total_size, extend_size;
757de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe	struct thread_options *o = &td->o;
75853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	struct fio_file *f;
759002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe	unsigned int i, nr_fs_extra = 0;
760000b080395e45cbe0ce54e75f0e993addbdc8676Jens Axboe	int err = 0, need_extend;
761e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe	int old_state;
762002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe	const unsigned int bs = td_min_bs(td);
763002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe	uint64_t fs = 0;
76453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
765ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "setup files\n");
766ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
7678edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe	old_state = td_bump_runstate(td, TD_SETTING_UP);
768e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe
769de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe	if (o->read_iolog_file)
77025460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboe		goto done;
771691c8fb014da9dd82e999a90b5511423f4eee188Jens Axboe
77253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	/*
77353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	 * if ioengine defines a setup() method, it's responsible for
7747bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * opening the files and setting f->real_file_size to indicate
7757bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * the valid range for that file.
77653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	 */
77753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (td->io_ops->setup)
7787bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		err = td->io_ops->setup(td);
7797bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	else
780bab3fd58530027a67df288783f4a70759b3c84b7Jens Axboe		err = get_file_sizes(td);
78153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
782f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe	if (err)
783e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe		goto err_out;
784f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe
7850a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe	/*
7867bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * check sizes. if the files/devices do not exist and the size
7877bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * isn't passed to fio, abort.
7880a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe	 */
7897bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	total_size = 0;
7907bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	for_each_file(td, f, i) {
7917bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		if (f->real_file_size == -1ULL)
7927bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			total_size = -1ULL;
7937bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		else
7947bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			total_size += f->real_file_size;
7957bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
7960a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe
797de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe	if (o->fill_device)
7982e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe		td->fill_device_size = get_fs_free_counts(td);
7992e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe
8007bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	/*
8017bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * device/file sizes are zero and no size given, punt
8027bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 */
803de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe	if ((!total_size || total_size == -1ULL) && !o->size &&
804de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe	    !(td->io_ops->flags & FIO_NOIO) && !o->fill_device &&
805de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe	    !(o->nr_files && (o->file_size_low || o->file_size_high))) {
806de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe		log_err("%s: you need to specify size=\n", o->name);
807e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, EINVAL, "total_file_size");
808e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe		goto err_out;
80953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
81053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
8117bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	/*
812002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe	 * Calculate per-file size and potential extra size for the
813002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe	 * first files, if needed.
814002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe	 */
815d1e78e6b0429bac92794fb6f1c24b5078c68da6dJens Axboe	if (!o->file_size_low && o->nr_files) {
816002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe		uint64_t all_fs;
817002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe
818002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe		fs = o->size / o->nr_files;
819002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe		all_fs = fs * o->nr_files;
820002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe
821002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe		if (all_fs < o->size)
822002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe			nr_fs_extra = (o->size - all_fs) / bs;
823002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe	}
824002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe
825002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe	/*
8267bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * now file sizes are known, so we can set ->io_size. if size= is
8277bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * not given, ->io_size is just equal to ->real_file_size. if size
8287bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * is given, ->io_size is size / nr_files.
8297bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 */
8307bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	extend_size = total_size = 0;
8317bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	need_extend = 0;
8327bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	for_each_file(td, f, i) {
833bedc9dc24223bb33be4120f4a57718bc54888ca5Jens Axboe		f->file_offset = get_start_offset(td, f);
834bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang
835de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe		if (!o->file_size_low) {
8367bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			/*
8377bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * no file size range given, file size is equal to
838002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe			 * total size divided by number of files. If that is
839002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe			 * zero, set it to the real file size. If the size
840002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe			 * doesn't divide nicely with the min blocksize,
841002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe			 * make the first files bigger.
8427bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 */
843002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe			f->io_size = fs;
844002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe			if (nr_fs_extra) {
845002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe				nr_fs_extra--;
846002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe				f->io_size += bs;
847002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe			}
848002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe
84965bdb10a09222d8b5d213de74824be775772ea8fJens Axboe			if (!f->io_size)
850273f8c912d981439049d9b21aa048aaeaa323c5dJens Axboe				f->io_size = f->real_file_size - f->file_offset;
851de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe		} else if (f->real_file_size < o->file_size_low ||
852de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe			   f->real_file_size > o->file_size_high) {
853de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe			if (f->file_offset > o->file_size_low)
854bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang				goto err_offset;
8557bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			/*
8567bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * file size given. if it's fixed, use that. if it's a
8577bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 * range, generate a random size in-between.
8587bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			 */
859de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe			if (o->file_size_low == o->file_size_high)
860de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe				f->io_size = o->file_size_low - f->file_offset;
861de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe			else {
8625ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				f->io_size = get_rand_file_size(td)
8635ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe						- f->file_offset;
8645ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			}
86565bdb10a09222d8b5d213de74824be775772ea8fJens Axboe		} else
866bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang			f->io_size = f->real_file_size - f->file_offset;
86753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
8687bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		if (f->io_size == -1ULL)
8697bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			total_size = -1ULL;
8704d002569dc503474a53e824e3f72b10a09c9a2b5Shaohua Li		else {
871de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe                        if (o->size_percent)
872de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe                                f->io_size = (f->io_size * o->size_percent) / 100;
8737bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			total_size += f->io_size;
8744d002569dc503474a53e824e3f72b10a09c9a2b5Shaohua Li		}
8757bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
8767bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		if (f->filetype == FIO_TYPE_FILE &&
877bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang		    (f->io_size + f->file_offset) > f->real_file_size &&
8787bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		    !(td->io_ops->flags & FIO_DISKLESSIO)) {
879de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe			if (!o->create_on_open) {
880814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe				need_extend++;
881814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe				extend_size += (f->io_size + f->file_offset);
882814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe			} else
883814452bd47e0f2bb4825b8042b664f32de0aff8dJens Axboe				f->real_file_size = f->io_size + f->file_offset;
884d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe			fio_file_set_extend(f);
8855ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		}
8867bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
88753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
888a85066dcaf01cd3611b4c7c987357650cd7f08a6Jens Axboe	if (!o->size || (total_size && o->size > total_size))
889de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe		o->size = total_size;
89021972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe
891d1faa06dc74fcdcae02e70260c90121502ef01cfJens Axboe	if (o->size < td_min_bs(td)) {
892d1faa06dc74fcdcae02e70260c90121502ef01cfJens Axboe		log_err("fio: blocksize too large for data set\n");
893d1faa06dc74fcdcae02e70260c90121502ef01cfJens Axboe		goto err_out;
894d1faa06dc74fcdcae02e70260c90121502ef01cfJens Axboe	}
895d1faa06dc74fcdcae02e70260c90121502ef01cfJens Axboe
8967bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	/*
8977bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 * See if we need to extend some files
8987bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	 */
8997bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (need_extend) {
9007bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		temp_stall_ts = 1;
901f3afa57e36550288340f1b6c694f354ae72654b9Jens Axboe		if (output_format == FIO_OUTPUT_NORMAL)
902a7ba8c5f4c0f9fe117d529c1ad6686b2070bae51Shaozhi Shawn Ye			log_info("%s: Laying out IO file(s) (%u file(s) /"
903de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe				 " %lluMB)\n", o->name, need_extend,
904a7ba8c5f4c0f9fe117d529c1ad6686b2070bae51Shaozhi Shawn Ye					extend_size >> 20);
9057bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
9067bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		for_each_file(td, f, i) {
9075e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			unsigned long long old_len = -1ULL, extend_len = -1ULL;
9083baddf2450d811be658fb47ef883ee84478dc352Jens Axboe
909d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe			if (!fio_file_extend(f))
9107bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe				continue;
9117bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
912409b3417e46cc3ce7041f042bcc26c3feb46e9e9Jens Axboe			assert(f->filetype == FIO_TYPE_FILE);
913d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe			fio_file_clear_extend(f);
914de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe			if (!o->fill_device) {
9155e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe				old_len = f->real_file_size;
9160b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe				extend_len = f->io_size + f->file_offset -
9170b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe						old_len;
9185e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe			}
919bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang			f->real_file_size = (f->io_size + f->file_offset);
9207bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			err = extend_file(td, f);
9217bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe			if (err)
9223baddf2450d811be658fb47ef883ee84478dc352Jens Axboe				break;
9235e0074c2bfa46deddbad3b524c253a63dba05e63Jens Axboe
9243baddf2450d811be658fb47ef883ee84478dc352Jens Axboe			err = __file_invalidate_cache(td, f, old_len,
9253baddf2450d811be658fb47ef883ee84478dc352Jens Axboe								extend_len);
9269824f73be5a03e683a236eb1ebe18f4656ac06b8Jens Axboe
9279824f73be5a03e683a236eb1ebe18f4656ac06b8Jens Axboe			/*
9289824f73be5a03e683a236eb1ebe18f4656ac06b8Jens Axboe			 * Shut up static checker
9299824f73be5a03e683a236eb1ebe18f4656ac06b8Jens Axboe			 */
9309824f73be5a03e683a236eb1ebe18f4656ac06b8Jens Axboe			if (f->fd != -1)
9319824f73be5a03e683a236eb1ebe18f4656ac06b8Jens Axboe				close(f->fd);
9329824f73be5a03e683a236eb1ebe18f4656ac06b8Jens Axboe
9333baddf2450d811be658fb47ef883ee84478dc352Jens Axboe			f->fd = -1;
9343baddf2450d811be658fb47ef883ee84478dc352Jens Axboe			if (err)
9357bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe				break;
9367bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		}
9377bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe		temp_stall_ts = 0;
9387bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	}
9397bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
9407bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	if (err)
941e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboe		goto err_out;
9427bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
943de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe	if (!o->zone_size)
944de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe		o->zone_size = o->size;
9457bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe
946ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe	/*
947ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe	 * iolog already set the total io size, if we read back
948ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe	 * stored entries.
949ea966f8188915643670fd0a13d1bf37d45936da5Jens Axboe	 */
95077731b29c35286a43ca6109ebf13389169ec20e9Jens Axboe	if (!o->read_iolog_file) {
95177731b29c35286a43ca6109ebf13389169ec20e9Jens Axboe		if (o->io_limit)
95277731b29c35286a43ca6109ebf13389169ec20e9Jens Axboe			td->total_io_size = o->io_limit * o->loops;
95377731b29c35286a43ca6109ebf13389169ec20e9Jens Axboe		else
95477731b29c35286a43ca6109ebf13389169ec20e9Jens Axboe			td->total_io_size = o->size * o->loops;
95577731b29c35286a43ca6109ebf13389169ec20e9Jens Axboe	}
95625460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboe
95725460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboedone:
958de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe	if (o->create_only)
95925460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboe		td->done = 1;
96025460cf6350fb90b8a7943bb649a51d81bac13a4Jens Axboe
9618edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe	td_restore_runstate(td, old_state);
9627bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe	return 0;
963bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tangerr_offset:
964de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe	log_err("%s: you need to specify valid offset=\n", o->name);
965e90391eb56d81a2cc175c50caf6b4e5abbdb6142Jens Axboeerr_out:
9668edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe	td_restore_runstate(td, old_state);
967bcdedd0ac6e9413258b608ecb3511867b1a9c534ljzhang,Yaxin Hu,Jianchao Tang	return 1;
96853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
96953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
970afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanminint pre_read_files(struct thread_data *td)
971afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin{
972afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	struct fio_file *f;
973afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	unsigned int i;
974afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
975afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	dprint(FD_FILE, "pre_read files\n");
976afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
977afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	for_each_file(td, f, i) {
978afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin		pre_read_file(td, f);
979afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	}
980afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
981afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin	return 1;
982afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin}
983afad68f778a764cbe57d4a5d54cbea32444aaa45Zhang, Yanmin
9849c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboestatic int __init_rand_distribution(struct thread_data *td, struct fio_file *f)
9859c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe{
9862316296a514711bb388d87b34742c04bb561d986Jens Axboe	unsigned int range_size, seed;
9879c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	unsigned long nranges;
9884d6922b77db7109369f0499506cf2cf7a62aba45Jens Axboe	uint64_t fsize;
9899c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe
9909c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	range_size = min(td->o.min_bs[DDIR_READ], td->o.min_bs[DDIR_WRITE]);
9914d6922b77db7109369f0499506cf2cf7a62aba45Jens Axboe	fsize = min(f->real_file_size, f->io_size);
9929c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe
9934d6922b77db7109369f0499506cf2cf7a62aba45Jens Axboe	nranges = (fsize + range_size - 1) / range_size;
9949c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe
9952316296a514711bb388d87b34742c04bb561d986Jens Axboe	seed = jhash(f->file_name, strlen(f->file_name), 0) * td->thread_number;
9968425687edef1b2961a17bd58341686f7b598cf28Jens Axboe	if (!td->o.rand_repeatable)
9978425687edef1b2961a17bd58341686f7b598cf28Jens Axboe		seed = td->rand_seeds[4];
9988425687edef1b2961a17bd58341686f7b598cf28Jens Axboe
9999c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	if (td->o.random_distribution == FIO_RAND_DIST_ZIPF)
1000888677a428eb6ae6b54195e99734d6d6b3ee55e7Jens Axboe		zipf_init(&f->zipf, nranges, td->o.zipf_theta.u.f, seed);
10019c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	else
1002888677a428eb6ae6b54195e99734d6d6b3ee55e7Jens Axboe		pareto_init(&f->zipf, nranges, td->o.pareto_h.u.f, seed);
10039c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe
10049c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	return 1;
10059c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe}
10069c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe
10079c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboestatic int init_rand_distribution(struct thread_data *td)
10089c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe{
10099c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	struct fio_file *f;
10109c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	unsigned int i;
10119c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	int state;
10129c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe
10139c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	if (td->o.random_distribution == FIO_RAND_DIST_RANDOM)
10149c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe		return 0;
10159c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe
10168edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe	state = td_bump_runstate(td, TD_SETTING_UP);
10178edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe
10189c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	for_each_file(td, f, i)
10199c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe		__init_rand_distribution(td, f);
10208edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe
10218edd973d57a311d4c590d7385796bbdf111ed04cJens Axboe	td_restore_runstate(td, state);
10229c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe
10239c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	return 1;
10249c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe}
10259c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe
1026687270767de17dbad53c50e03e5d73d52505405cJens Axboeint init_random_map(struct thread_data *td)
1027687270767de17dbad53c50e03e5d73d52505405cJens Axboe{
102851ede0b1e9c9b570b942b50b44d0455183a0d5ecJens Axboe	unsigned long long blocks;
1029687270767de17dbad53c50e03e5d73d52505405cJens Axboe	struct fio_file *f;
1030687270767de17dbad53c50e03e5d73d52505405cJens Axboe	unsigned int i;
1031687270767de17dbad53c50e03e5d73d52505405cJens Axboe
10329c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe	if (init_rand_distribution(td))
10339c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43Jens Axboe		return 0;
10343831a843c289ab6a42a19752733d0fca4250882aJens Axboe	if (!td_random(td))
1035687270767de17dbad53c50e03e5d73d52505405cJens Axboe		return 0;
1036687270767de17dbad53c50e03e5d73d52505405cJens Axboe
1037687270767de17dbad53c50e03e5d73d52505405cJens Axboe	for_each_file(td, f, i) {
10384d6922b77db7109369f0499506cf2cf7a62aba45Jens Axboe		uint64_t fsize = min(f->real_file_size, f->io_size);
103938f30c81d8d194da047950cbbda3896bd35cd98cJens Axboe
10404d6922b77db7109369f0499506cf2cf7a62aba45Jens Axboe		blocks = fsize / (unsigned long long) td->o.rw_min_bs;
104153737ae01ca65f88089d3b8639df7be5b2f7ef0eJens Axboe
10428055e41d0ecc54770a2653427532b3e2c5fabdadJens Axboe		if (td->o.random_generator == FIO_RAND_GEN_LFSR) {
104382af46be1fa0c0e188bbb6723008fa33a510606fJens Axboe			unsigned long seed;
104482af46be1fa0c0e188bbb6723008fa33a510606fJens Axboe
104582af46be1fa0c0e188bbb6723008fa33a510606fJens Axboe			seed = td->rand_seeds[FIO_RAND_BLOCK_OFF];
10469c0f3f3279985b724c2f1358bb05cc2c795f2265Bruce Cran
1047d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe			if (!lfsr_init(&f->lfsr, blocks, seed, 0)) {
1048d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe				fio_file_set_lfsr(f);
10498055e41d0ecc54770a2653427532b3e2c5fabdadJens Axboe				continue;
1050d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe			}
10513831a843c289ab6a42a19752733d0fca4250882aJens Axboe		} else if (!td->o.norandommap) {
10527ebd796f4e50c21d652e62bf1e112755b0f338a8Jens Axboe			f->io_axmap = axmap_new(blocks);
1053d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe			if (f->io_axmap) {
1054d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe				fio_file_set_axmap(f);
10558055e41d0ecc54770a2653427532b3e2c5fabdadJens Axboe				continue;
1056d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe			}
10571cad7121e8e6c59440ae43545be05fa302e4110dJens Axboe		} else if (td->o.norandommap)
10581cad7121e8e6c59440ae43545be05fa302e4110dJens Axboe			continue;
1059ceadd59ef93421001530aa765d928e9e8c26b32eJens Axboe
10602b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe		if (!td->o.softrandommap) {
10615ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			log_err("fio: failed allocating random map. If running"
10625ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				" a large number of jobs, try the 'norandommap'"
10632b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe				" option or set 'softrandommap'. Or give"
10642b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe				" a larger --alloc-size to fio.\n");
1065687270767de17dbad53c50e03e5d73d52505405cJens Axboe			return 1;
1066687270767de17dbad53c50e03e5d73d52505405cJens Axboe		}
1067303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe
1068303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe		log_info("fio: file %s failed allocating random map. Running "
1069303032ae4e13c7ac10b8198c40df98d95a4524a6Jens Axboe			 "job without.\n", f->file_name);
1070687270767de17dbad53c50e03e5d73d52505405cJens Axboe	}
1071687270767de17dbad53c50e03e5d73d52505405cJens Axboe
1072687270767de17dbad53c50e03e5d73d52505405cJens Axboe	return 0;
1073687270767de17dbad53c50e03e5d73d52505405cJens Axboe}
1074687270767de17dbad53c50e03e5d73d52505405cJens Axboe
107553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboevoid close_files(struct thread_data *td)
107653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
10770ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe	struct fio_file *f;
1078af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	unsigned int i;
107953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
10802be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe	for_each_file(td, f, i) {
10812be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe		if (fio_file_open(f))
10822be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe			td_io_close_file(td, f);
10832be3eec330360e6735fb4e7d70907e11eaa346f8Jens Axboe	}
108424ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe}
108524ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe
108624ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboevoid close_and_free_files(struct thread_data *td)
108724ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe{
108824ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe	struct fio_file *f;
108924ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe	unsigned int i;
109024ffd2c2bca53f4de85ab6defd52a812be1f2429Jens Axboe
1091ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "close files\n");
1092ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
10930ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe	for_each_file(td, f, i) {
10949187a269bf4539fa4b5b97a9b7439ba408d6b872Castor Fu		if (td->o.unlink && f->filetype == FIO_TYPE_FILE) {
10959187a269bf4539fa4b5b97a9b7439ba408d6b872Castor Fu			dprint(FD_FILE, "free unlink %s\n", f->file_name);
10969187a269bf4539fa4b5b97a9b7439ba408d6b872Castor Fu			td_io_unlink_file(td, f);
10979187a269bf4539fa4b5b97a9b7439ba408d6b872Castor Fu		}
10989187a269bf4539fa4b5b97a9b7439ba408d6b872Castor Fu
109922a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe		if (fio_file_open(f))
110022a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe			td_io_close_file(td, f);
110122a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe
1102b9fbcf2104ab79127825e0c23ba0a147ec076087Shaozhi Shawn Ye		remove_file_hash(f);
1103b3dc7f075b85e004f8c681ebb8566475017696f3Jens Axboe
1104b5f4d8baefc6eb3e13235b7d9042b7ffecdb23ddJens Axboe		if (td->o.unlink && f->filetype == FIO_TYPE_FILE) {
1105b5f4d8baefc6eb3e13235b7d9042b7ffecdb23ddJens Axboe			dprint(FD_FILE, "free unlink %s\n", f->file_name);
11069187a269bf4539fa4b5b97a9b7439ba408d6b872Castor Fu			td_io_unlink_file(td, f);
1107b5f4d8baefc6eb3e13235b7d9042b7ffecdb23ddJens Axboe		}
1108b5f4d8baefc6eb3e13235b7d9042b7ffecdb23ddJens Axboe
1109f17c43928c202e557f2f325272c60d9050ee528eJens Axboe		sfree(f->file_name);
1110fa1da8653e2177b3cc31a91e963c389f079d4172Jens Axboe		f->file_name = NULL;
1111d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe		if (fio_file_axmap(f)) {
1112d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe			axmap_free(f->io_axmap);
1113d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe			f->io_axmap = NULL;
1114d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe		}
111578d99e6a2695d3a7936c5dd02f996f13a30309b1Jens Axboe		sfree(f);
111653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
1117b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe
11182dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	td->o.filename = NULL;
1119cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	free(td->files);
1120d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe	free(td->file_locks);
11219efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe	td->files_index = 0;
1122b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe	td->files = NULL;
1123d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe	td->file_locks = NULL;
112427ddbfa09b22911d5cefb42a44f894e6eb48216eJens Axboe	td->o.file_lock_mode = FILE_LOCK_NONE;
11252dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	td->o.nr_files = 0;
112653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
1127af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
1128e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboestatic void get_file_type(struct fio_file *f)
1129af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe{
1130af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	struct stat sb;
1131af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
1132661598287ecc3b8987f312cf8403936552ce686aJens Axboe	if (!strcmp(f->file_name, "-"))
1133661598287ecc3b8987f312cf8403936552ce686aJens Axboe		f->filetype = FIO_TYPE_PIPE;
1134661598287ecc3b8987f312cf8403936552ce686aJens Axboe	else
1135661598287ecc3b8987f312cf8403936552ce686aJens Axboe		f->filetype = FIO_TYPE_FILE;
1136af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
11373892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran	/* \\.\ is the device namespace in Windows, where every file is
11383892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran	 * a block device */
11393892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran	if (strncmp(f->file_name, "\\\\.\\", 4) == 0)
11403892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran		f->filetype = FIO_TYPE_BD;
11413892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran
1142b30d395ec288508f9c787af11d0f52e9df26e39fJens Axboe	if (!stat(f->file_name, &sb)) {
11433892182aff21486d9c38a346fe8681c9098ecb0cBruce Cran		if (S_ISBLK(sb.st_mode))
1144af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe			f->filetype = FIO_TYPE_BD;
1145af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe		else if (S_ISCHR(sb.st_mode))
1146af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe			f->filetype = FIO_TYPE_CHAR;
1147b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe		else if (S_ISFIFO(sb.st_mode))
1148b5605e9ded4188ed91faae1a43ecd333a9856f62Jens Axboe			f->filetype = FIO_TYPE_PIPE;
1149af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	}
1150af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe}
1151af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
115290426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboestatic int __is_already_allocated(const char *fname)
1153190b8f0c9c1c1a99ed26fd953f7af9023f9533eeCastor Fu{
115490426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	struct flist_head *entry;
115590426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	char *filename;
1156bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt
115790426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	if (flist_empty(&filename_list))
115890426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe		return 0;
115990426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe
116090426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	flist_for_each(entry, &filename_list) {
116190426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe		filename = flist_entry(entry, struct file_name, list)->filename;
116290426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe
116390426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe		if (strcmp(filename, fname) == 0)
116490426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe			return 1;
116590426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	}
116690426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe
116790426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	return 0;
1168bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt}
1169bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt
1170bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardtstatic int is_already_allocated(const char *fname)
1171bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt{
117290426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	int ret;
1173bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt
117490426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	fio_file_hash_lock();
117590426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	ret = __is_already_allocated(fname);
117690426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	fio_file_hash_unlock();
117790426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	return ret;
117890426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe}
1179bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt
118090426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboestatic void set_already_allocated(const char *fname)
118190426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe{
118290426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	struct file_name *fn;
118390426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe
118490426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	fn = malloc(sizeof(struct file_name));
118590426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	fn->filename = strdup(fname);
118690426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe
118790426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	fio_file_hash_lock();
118890426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	if (!__is_already_allocated(fname)) {
118990426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe		flist_add_tail(&fn->list, &filename_list);
119090426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe		fn = NULL;
1191bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt	}
119290426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	fio_file_hash_unlock();
1193bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt
119490426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	if (fn) {
119590426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe		free(fn->filename);
119690426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe		free(fn);
119790426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	}
1198bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt}
1199bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt
120090426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe
1201190b8f0c9c1c1a99ed26fd953f7af9023f9533eeCastor Fustatic void free_already_allocated(void)
1202190b8f0c9c1c1a99ed26fd953f7af9023f9533eeCastor Fu{
1203bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt	struct flist_head *entry, *tmp;
1204bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt	struct file_name *fn;
1205bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt
120690426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	if (flist_empty(&filename_list))
120790426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe		return;
120890426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe
120990426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	fio_file_hash_lock();
121090426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	flist_for_each_safe(entry, tmp, &filename_list) {
121190426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe		fn = flist_entry(entry, struct file_name, list);
121290426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe		free(fn->filename);
121390426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe		flist_del(&fn->list);
121490426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe		free(fn);
1215bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt	}
121690426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe
121790426237af4f3c9c7628aebfd4421fbe43d68c2aJens Axboe	fio_file_hash_unlock();
1218bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt}
1219bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt
12207b5cb700485518c2e7f2f49548319c89ba907195Jens Axboestatic struct fio_file *alloc_new_file(struct thread_data *td)
12217b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe{
12227b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe	struct fio_file *f;
12237b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe
12247b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe	f = smalloc(sizeof(*f));
12257b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe	if (!f) {
12267b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe		log_err("fio: smalloc OOM\n");
12277b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe		assert(0);
12287b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe		return NULL;
12297b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe	}
12307b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe
12317b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe	f->fd = -1;
12327b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe	f->shadow_fd = -1;
12337b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe	fio_file_reset(td, f);
12347b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe	return f;
12357b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe}
12367b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe
12375903e7b7907854014478b6febfc5645a203ff59eJens Axboeint add_file(struct thread_data *td, const char *fname, int numjob, int inc)
1238af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe{
12397b4e4fe5e6fa26f82f9169c18ec70c08d0805ca9Jens Axboe	int cur_files = td->files_index;
1240bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe	char file_name[PATH_MAX];
1241af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	struct fio_file *f;
1242bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe	int len = 0;
1243af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
1244ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe	dprint(FD_FILE, "add file %s\n", fname);
1245ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
1246bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt	if (td->o.directory)
1247bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt		len = set_name_idx(file_name, td->o.directory, numjob);
1248bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt
1249bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt	sprintf(file_name + len, "%s", fname);
1250bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt
1251bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt	/* clean cloned siblings using existing files */
1252bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt	if (numjob && is_already_allocated(file_name))
1253bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt		return 0;
1254bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt
12557b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe	f = alloc_new_file(td);
1256bd0ee748e96338ace7b22b6f0ac1f8934d3385c0Jens Axboe
1257fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe	if (td->files_size <= td->files_index) {
12581983e3271c20a5dca84ac1ad872e44dd9e62e6b8Jianpeng Ma		unsigned int new_size = td->o.nr_files + 1;
1259126d65c6fc97d6acdc568aa5a969c012018daf15Jens Axboe
1260fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe		dprint(FD_FILE, "resize file array to %d files\n", new_size);
1261fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe
1262fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe		td->files = realloc(td->files, new_size * sizeof(f));
1263d537c08b0eacdeb05835ee8c5f269b872239713aJianpeng Ma		if (td->files == NULL) {
1264d537c08b0eacdeb05835ee8c5f269b872239713aJianpeng Ma			log_err("fio: realloc OOM\n");
1265d537c08b0eacdeb05835ee8c5f269b872239713aJianpeng Ma			assert(0);
1266d537c08b0eacdeb05835ee8c5f269b872239713aJianpeng Ma		}
1267d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe		if (td->o.file_lock_mode != FILE_LOCK_NONE) {
1268d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe			td->file_locks = realloc(td->file_locks, new_size);
1269d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe			if (!td->file_locks) {
1270d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe				log_err("fio: realloc OOM\n");
1271d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe				assert(0);
1272d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe			}
1273d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe			td->file_locks[cur_files] = FILE_LOCK_NONE;
1274d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe		}
1275fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe		td->files_size = new_size;
1276fc99bc0d82371cc704395a7718e78abd0e0d2709Jens Axboe	}
12778bb7679e73d3086a01b9d21a650b0d7a859412b6Jens Axboe	td->files[cur_files] = f;
127889ac1d48971578ccb0645c292d4a058340aeb909Shaohua Li	f->fileno = cur_files;
1279126d65c6fc97d6acdc568aa5a969c012018daf15Jens Axboe
128007eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe	/*
128107eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe	 * init function, io engine may not be loaded yet
128207eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe	 */
128307eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe	if (td->io_ops && (td->io_ops->flags & FIO_DISKLESSIO))
128407eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe		f->real_file_size = -1ULL;
128507eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe
1286f17c43928c202e557f2f325272c60d9050ee528eJens Axboe	f->file_name = smalloc_strdup(file_name);
1287c48c0be79173897824d8f439c39374f2588931dcJens Axboe	if (!f->file_name) {
1288c48c0be79173897824d8f439c39374f2588931dcJens Axboe		log_err("fio: smalloc OOM\n");
1289c48c0be79173897824d8f439c39374f2588931dcJens Axboe		assert(0);
1290c48c0be79173897824d8f439c39374f2588931dcJens Axboe	}
12910b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe
1292e3bab463d4397e3378d8c7437e31de8aaf861a4fJens Axboe	get_file_type(f);
1293af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe
12944d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	switch (td->o.file_lock_mode) {
12954d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	case FILE_LOCK_NONE:
12964d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		break;
12974d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	case FILE_LOCK_READWRITE:
1298d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe		f->rwlock = fio_rwlock_init();
12994d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		break;
13004d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	case FILE_LOCK_EXCLUSIVE:
1301521da527743088a9bd2ab882f8b64799d49d5848Jens Axboe		f->lock = fio_mutex_init(FIO_MUTEX_UNLOCKED);
13024d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		break;
13034d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	default:
13044d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		log_err("fio: unknown lock mode: %d\n", td->o.file_lock_mode);
13054d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		assert(0);
13064d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	}
130729c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe
13087b4e4fe5e6fa26f82f9169c18ec70c08d0805ca9Jens Axboe	td->files_index++;
13091549441cdfecb2c1a4a8b8d494253859d67b4344Jens Axboe	if (f->filetype == FIO_TYPE_FILE)
13101549441cdfecb2c1a4a8b8d494253859d67b4344Jens Axboe		td->nr_normal_files++;
1311f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
1312bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt	set_already_allocated(file_name);
1313bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt
13145903e7b7907854014478b6febfc5645a203ff59eJens Axboe	if (inc)
13155903e7b7907854014478b6febfc5645a203ff59eJens Axboe		td->o.nr_files++;
13165903e7b7907854014478b6febfc5645a203ff59eJens Axboe
13175ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe	dprint(FD_FILE, "file %p \"%s\" added at %d\n", f, f->file_name,
13185ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe							cur_files);
13199efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe
1320f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	return cur_files;
1321af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe}
13220ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe
132349ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboeint add_file_exclusive(struct thread_data *td, const char *fname)
132449ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe{
132549ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe	struct fio_file *f;
132649ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe	unsigned int i;
132749ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe
132849ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe	for_each_file(td, f, i) {
132949ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe		if (!strcmp(f->file_name, fname))
133049ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe			return i;
133149ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe	}
133249ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe
13335903e7b7907854014478b6febfc5645a203ff59eJens Axboe	return add_file(td, fname, 0, 1);
133449ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe}
133549ffb4a2e1ac3026d77d9e1c03edc2753fcec41bJens Axboe
13360ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboevoid get_file(struct fio_file *f)
13370ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe{
13388172fe972f3a79d42f34d7f6e259ed3f7f800316Jens Axboe	dprint(FD_FILE, "get file %s, ref=%d\n", f->file_name, f->references);
1339d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe	assert(fio_file_open(f));
13400ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	f->references++;
13410ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe}
13420ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe
13436977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboeint put_file(struct thread_data *td, struct fio_file *f)
13440ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe{
134598e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe	int f_ret = 0, ret = 0;
13466977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe
13478172fe972f3a79d42f34d7f6e259ed3f7f800316Jens Axboe	dprint(FD_FILE, "put file %s, ref=%d\n", f->file_name, f->references);
1348ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
134922a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe	if (!fio_file_open(f)) {
135022a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe		assert(f->fd == -1);
13516977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe		return 0;
135222a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe	}
13530ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe
13540ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	assert(f->references);
13550ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	if (--f->references)
13566977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe		return 0;
13570ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe
135871b84caab6ef5ddbc7893e3268887b8ff0516f75Jens Axboe	if (should_fsync(td) && td->o.fsync_on_close) {
135998e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe		f_ret = fsync(f->fd);
136071b84caab6ef5ddbc7893e3268887b8ff0516f75Jens Axboe		if (f_ret < 0)
136171b84caab6ef5ddbc7893e3268887b8ff0516f75Jens Axboe			f_ret = errno;
136271b84caab6ef5ddbc7893e3268887b8ff0516f75Jens Axboe	}
1363ebb1415f729c123b8a13bcbd667bf4b4cc95b4d4Jens Axboe
13640ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	if (td->io_ops->close_file)
13656977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe		ret = td->io_ops->close_file(td, f);
13661020a139beff50faf1bb18f761b024b664a09e14Jens Axboe
136798e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe	if (!ret)
1368a5fb461fdff86c442daeebbd28e07984be9f3807Jens Axboe		ret = f_ret;
136998e1ac4e1a2c7386a1064277f7e67c4736fb6e65Jens Axboe
13700ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe	td->nr_open_files--;
1371d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe	fio_file_clear_open(f);
137222a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe	assert(f->fd == -1);
13736977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe	return ret;
13740ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe}
1375bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
13764d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid lock_file(struct thread_data *td, struct fio_file *f, enum fio_ddir ddir)
1377b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe{
13784d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (!f->lock || td->o.file_lock_mode == FILE_LOCK_NONE)
13794d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		return;
138029c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe
13814d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (td->o.file_lock_mode == FILE_LOCK_READWRITE) {
13824d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		if (ddir == DDIR_READ)
1383d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe			fio_rwlock_read(f->rwlock);
13844d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		else
1385d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe			fio_rwlock_write(f->rwlock);
13864d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	} else if (td->o.file_lock_mode == FILE_LOCK_EXCLUSIVE)
13874d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		fio_mutex_down(f->lock);
13884d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
1389d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe	td->file_locks[f->fileno] = td->o.file_lock_mode;
1390b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe}
1391b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe
13924d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid unlock_file(struct thread_data *td, struct fio_file *f)
1393b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe{
13944d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe	if (!f->lock || td->o.file_lock_mode == FILE_LOCK_NONE)
13954d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		return;
13964d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
1397d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe	if (td->o.file_lock_mode == FILE_LOCK_READWRITE)
1398d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe		fio_rwlock_unlock(f->rwlock);
1399d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe	else if (td->o.file_lock_mode == FILE_LOCK_EXCLUSIVE)
14004d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe		fio_mutex_up(f->lock);
1401d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe
1402d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe	td->file_locks[f->fileno] = FILE_LOCK_NONE;
1403b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe}
1404b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe
14054d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboevoid unlock_file_all(struct thread_data *td, struct fio_file *f)
14064d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe{
1407f2a2803a4982a1516eb75d9f98de68cf21d1ae7dJens Axboe	if (td->o.file_lock_mode == FILE_LOCK_NONE || !td->file_locks)
140827ddbfa09b22911d5cefb42a44f894e6eb48216eJens Axboe		return;
1409d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe	if (td->file_locks[f->fileno] != FILE_LOCK_NONE)
1410d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe		unlock_file(td, f);
14114d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe}
14124d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe
1413bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboestatic int recurse_dir(struct thread_data *td, const char *dirname)
1414bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe{
1415bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	struct dirent *dir;
1416bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	int ret = 0;
1417bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	DIR *D;
1418bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1419bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	D = opendir(dirname);
1420bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	if (!D) {
14210ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		char buf[FIO_VERROR_SIZE];
14220ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe
142398ffb8f3ecebed9984d1744f142eb8be10c14dbdKen Raeburn		snprintf(buf, FIO_VERROR_SIZE, "opendir(%s)", dirname);
14240ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		td_verror(td, errno, buf);
1425bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		return 1;
1426bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	}
1427bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1428bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	while ((dir = readdir(D)) != NULL) {
1429bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		char full_path[PATH_MAX];
1430bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		struct stat sb;
1431bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1432e85b2b83e39b64ba5cb73fbfddbf3902b6e84925Jens Axboe		if (!strcmp(dir->d_name, ".") || !strcmp(dir->d_name, ".."))
1433e85b2b83e39b64ba5cb73fbfddbf3902b6e84925Jens Axboe			continue;
143496d32d518a0743a6c050057bc1562e4883e51c5dJens Axboe
1435b9fd788f0e8adacc33316107594e9eb0463743d7Bruce Cran		sprintf(full_path, "%s%s%s", dirname, FIO_OS_PATH_SEPARATOR, dir->d_name);
1436bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1437bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		if (lstat(full_path, &sb) == -1) {
1438bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			if (errno != ENOENT) {
1439bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe				td_verror(td, errno, "stat");
144068ace9e00ca481d101f9937461402b83e8895ba2Jens Axboe				ret = 1;
144168ace9e00ca481d101f9937461402b83e8895ba2Jens Axboe				break;
1442bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			}
1443bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		}
1444bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1445bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		if (S_ISREG(sb.st_mode)) {
14465903e7b7907854014478b6febfc5645a203ff59eJens Axboe			add_file(td, full_path, 0, 1);
1447bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			continue;
1448bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe		}
14490ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		if (!S_ISDIR(sb.st_mode))
14500ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe			continue;
1451bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
14525ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		ret = recurse_dir(td, full_path);
14535ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		if (ret)
1454bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe			break;
1455bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	}
1456bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1457bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	closedir(D);
1458bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe	return ret;
1459bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe}
1460bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe
1461bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboeint add_dir_files(struct thread_data *td, const char *path)
1462bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe{
14630ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe	int ret = recurse_dir(td, path);
14640ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe
14650ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe	if (!ret)
14660ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe		log_info("fio: opendir added %d files\n", td->o.nr_files);
14670ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe
14680ddb270c21adffa45cd9d215f29aafd8a9c5b15aJens Axboe	return ret;
1469bbf6b5401cdc0b20c405a064356ab0abb27c52d0Jens Axboe}
1470cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe
1471cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboevoid dup_files(struct thread_data *td, struct thread_data *org)
1472cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe{
1473cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	struct fio_file *f;
1474cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	unsigned int i;
14759efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe
14769efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe	dprint(FD_FILE, "dup files: %d\n", org->files_index);
1477cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe
1478cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	if (!org->files)
1479cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe		return;
1480cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe
14819efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe	td->files = malloc(org->files_index * sizeof(f));
1482cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe
1483d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe	if (td->o.file_lock_mode != FILE_LOCK_NONE)
1484d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe		td->file_locks = malloc(org->files_index);
1485d7df1d133b0c3daad4ae4c731e0dae7b0181fd62Jens Axboe
14869efef3c4bd6a032a2a9f7a9aab1c29436525d781Jens Axboe	for_each_file(org, f, i) {
1487b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe		struct fio_file *__f;
1488b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe
14897b5cb700485518c2e7f2f49548319c89ba907195Jens Axboe		__f = alloc_new_file(td);
14900b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe
1491bc3456fa06cc7777c4764da8c7b1c0fd0a3c3772Aaron Carroll		if (f->file_name) {
1492f17c43928c202e557f2f325272c60d9050ee528eJens Axboe			__f->file_name = smalloc_strdup(f->file_name);
1493c48c0be79173897824d8f439c39374f2588931dcJens Axboe			if (!__f->file_name) {
1494c48c0be79173897824d8f439c39374f2588931dcJens Axboe				log_err("fio: smalloc OOM\n");
1495c48c0be79173897824d8f439c39374f2588931dcJens Axboe				assert(0);
1496c48c0be79173897824d8f439c39374f2588931dcJens Axboe			}
14970b9d69ecb14045cf3b2622ae922756b9889b25e6Jens Axboe
1498bc3456fa06cc7777c4764da8c7b1c0fd0a3c3772Aaron Carroll			__f->filetype = f->filetype;
1499bc3456fa06cc7777c4764da8c7b1c0fd0a3c3772Aaron Carroll		}
1500b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe
150167ad92428bb19008354ca20e614050241e9f17e7Jens Axboe		if (td->o.file_lock_mode == FILE_LOCK_EXCLUSIVE)
150267ad92428bb19008354ca20e614050241e9f17e7Jens Axboe			__f->lock = f->lock;
150367ad92428bb19008354ca20e614050241e9f17e7Jens Axboe		else if (td->o.file_lock_mode == FILE_LOCK_READWRITE)
150467ad92428bb19008354ca20e614050241e9f17e7Jens Axboe			__f->rwlock = f->rwlock;
150567ad92428bb19008354ca20e614050241e9f17e7Jens Axboe
1506b0fe421a6a0487ff71f6f903908f666d9ca1b327Jens Axboe		td->files[i] = __f;
1507cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe	}
1508cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe}
1509f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
1510f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe/*
1511f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe * Returns the index that matches the filename, or -1 if not there
1512f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe */
1513f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboeint get_fileno(struct thread_data *td, const char *fname)
1514f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe{
1515f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	struct fio_file *f;
1516f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	unsigned int i;
1517f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
1518f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	for_each_file(td, f, i)
1519f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe		if (!strcmp(f->file_name, fname))
1520f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe			return i;
1521f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
1522f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	return -1;
1523f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe}
1524f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
1525f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe/*
1526f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe * For log usage, where we add/open/close files automatically
1527f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe */
1528f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboevoid free_release_files(struct thread_data *td)
1529f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe{
1530f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	close_files(td);
15314c8e9f3a32ad0a1bc8bbc85b0cfe43e73a120753Jens Axboe	td->o.nr_files = 0;
15324c8e9f3a32ad0a1bc8bbc85b0cfe43e73a120753Jens Axboe	td->o.open_files = 0;
1533f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	td->files_index = 0;
1534f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	td->nr_normal_files = 0;
1535f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe}
153633c48814e08cf961801bf37f759da2748eb3431bJens Axboe
153733c48814e08cf961801bf37f759da2748eb3431bJens Axboevoid fio_file_reset(struct thread_data *td, struct fio_file *f)
153833c48814e08cf961801bf37f759da2748eb3431bJens Axboe{
153908a99bed133fdd5dd6ef87c8638b45b135b10a8eJens Axboe	int i;
154008a99bed133fdd5dd6ef87c8638b45b135b10a8eJens Axboe
154108a99bed133fdd5dd6ef87c8638b45b135b10a8eJens Axboe	for (i = 0; i < DDIR_RWDIR_CNT; i++) {
154208a99bed133fdd5dd6ef87c8638b45b135b10a8eJens Axboe		f->last_pos[i] = f->file_offset;
154308a99bed133fdd5dd6ef87c8638b45b135b10a8eJens Axboe		f->last_start[i] = -1ULL;
154408a99bed133fdd5dd6ef87c8638b45b135b10a8eJens Axboe	}
154508a99bed133fdd5dd6ef87c8638b45b135b10a8eJens Axboe
1546d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe	if (fio_file_axmap(f))
154733c48814e08cf961801bf37f759da2748eb3431bJens Axboe		axmap_reset(f->io_axmap);
1548d55dd0413b5f2df5e637c9c6e752b4272e4a1e5fJens Axboe	else if (fio_file_lfsr(f))
154933c48814e08cf961801bf37f759da2748eb3431bJens Axboe		lfsr_reset(&f->lfsr, td->rand_seeds[FIO_RAND_BLOCK_OFF]);
155033c48814e08cf961801bf37f759da2748eb3431bJens Axboe}
1551002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe
1552002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboeint fio_files_done(struct thread_data *td)
1553002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe{
1554002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe	struct fio_file *f;
1555002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe	unsigned int i;
1556002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe
1557002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe	for_each_file(td, f, i)
1558002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe		if (!fio_file_done(f))
1559002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe			return 0;
1560002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe
1561002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe	return 1;
1562002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe}
1563bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt
1564bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt/* free memory used in initialization phase only */
1565190b8f0c9c1c1a99ed26fd953f7af9023f9533eeCastor Fuvoid filesetup_mem_free(void)
1566190b8f0c9c1c1a99ed26fd953f7af9023f9533eeCastor Fu{
1567bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt	free_already_allocated();
1568bcbfeefa7bce8383cf85fe59ced91f54821dfbd2Christian Ehrhardt}
1569