filesetup.c revision 21972cdef7db6b557c2d56138f8434658a9d1e49
153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include <unistd.h>
253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include <fcntl.h>
353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include <string.h>
453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include <assert.h>
553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include <sys/stat.h>
653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include <sys/mman.h>
753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include "fio.h"
953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe#include "os.h"
1053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
1125205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe/*
1225205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe * Check if the file exists and it's large enough.
1325205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe */
1425205e975e6dce6079a4b94d656724011f1aabd0Jens Axboestatic int file_ok(struct thread_data *td, struct fio_file *f)
1553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
16b2a151925a91f38aeb298d693687a47269ad4e94Jens Axboe	struct stat st;
1753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
18b2a151925a91f38aeb298d693687a47269ad4e94Jens Axboe	if (td->filetype != FIO_TYPE_FILE)
19b2a151925a91f38aeb298d693687a47269ad4e94Jens Axboe		return 0;
20b2a151925a91f38aeb298d693687a47269ad4e94Jens Axboe
2125205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe	if (stat(f->file_name, &st) == -1)
2225205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe		return 1;
2325205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe	else if (st.st_size < (off_t) f->file_size)
2425205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe		return 1;
2525205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe
2625205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe	return 0;
2725205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe}
2825205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe
2925205e975e6dce6079a4b94d656724011f1aabd0Jens Axboestatic int create_file(struct thread_data *td, struct fio_file *f)
3025205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe{
3125205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe	unsigned long long left;
3225205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe	unsigned int bs;
3325205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe	char *b;
3425205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe	int r;
35b2a151925a91f38aeb298d693687a47269ad4e94Jens Axboe
3653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	f->fd = open(f->file_name, O_WRONLY | O_CREAT | O_TRUNC, 0644);
3753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (f->fd < 0) {
3853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		td_verror(td, errno);
3953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return 1;
4053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
4153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
4253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (ftruncate(f->fd, f->file_size) == -1) {
4353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		td_verror(td, errno);
4453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		goto err;
4553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
4653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
4740f8298cd252157fa15d93f8eb470116a94069a0Jens Axboe	if (posix_fallocate(f->fd, 0, f->file_size) < 0) {
4840f8298cd252157fa15d93f8eb470116a94069a0Jens Axboe		td_verror(td, errno);
4940f8298cd252157fa15d93f8eb470116a94069a0Jens Axboe		goto err;
5040f8298cd252157fa15d93f8eb470116a94069a0Jens Axboe	}
5140f8298cd252157fa15d93f8eb470116a94069a0Jens Axboe
52a00735e66f9ec42549da94eba3170e543b542904Jens Axboe	b = malloc(td->max_bs[DDIR_WRITE]);
53a00735e66f9ec42549da94eba3170e543b542904Jens Axboe	memset(b, 0, td->max_bs[DDIR_WRITE]);
5453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
5553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	left = f->file_size;
5653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	while (left && !td->terminate) {
57a00735e66f9ec42549da94eba3170e543b542904Jens Axboe		bs = td->max_bs[DDIR_WRITE];
5853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		if (bs > left)
5953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			bs = left;
6053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
6153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		r = write(f->fd, b, bs);
6253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
6353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		if (r == (int) bs) {
6453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			left -= bs;
6553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			continue;
6653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		} else {
6753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			if (r < 0)
6853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe				td_verror(td, errno);
6953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			else
7053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe				td_verror(td, EIO);
7153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
7253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			break;
7353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		}
7453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
7553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
7653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (td->terminate)
7753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		unlink(f->file_name);
7853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	else if (td->create_fsync)
7953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		fsync(f->fd);
8053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
8153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	free(b);
8253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	close(f->fd);
8353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	f->fd = -1;
8453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
8553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboeerr:
8653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	close(f->fd);
8753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	f->fd = -1;
8853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 1;
8953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
9053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
9153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int create_files(struct thread_data *td)
9253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
9353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	struct fio_file *f;
9425205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe	int i, err, need_create;
9553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
96f697125ab9003d358a37186d610e09799afd190fJens Axboe	for_each_file(td, f, i)
97f697125ab9003d358a37186d610e09799afd190fJens Axboe		f->file_size = td->total_file_size / td->nr_files;
98f697125ab9003d358a37186d610e09799afd190fJens Axboe
9953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	/*
10053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	 * unless specifically asked for overwrite, let normal io extend it
10153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	 */
102f697125ab9003d358a37186d610e09799afd190fJens Axboe	if (!td->overwrite)
10353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return 0;
10453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
10525205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe	need_create = 0;
1060a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe	if (td->filetype == FIO_TYPE_FILE)
1070a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe		for_each_file(td, f, i)
108f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe			need_create += file_ok(td, f);
10925205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe
11025205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe	if (!need_create)
11125205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe		return 0;
11225205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe
113f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe	if (!td->total_file_size) {
114f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe		log_err("Need size for create\n");
115f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe		td_verror(td, EINVAL);
116f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe		return 1;
117f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe	}
118f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe
11953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	temp_stall_ts = 1;
12025205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe	fprintf(f_out, "%s: Laying out IO file(s) (%d x %LuMiB == %LuMiB)\n",
12113f8e2d2e3e5ec7d8c18b70fb2a2e2a026190020Jens Axboe				td->name, td->nr_uniq_files,
12213f8e2d2e3e5ec7d8c18b70fb2a2e2a026190020Jens Axboe				(td->total_file_size >> 20) / td->nr_uniq_files,
12325205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe				td->total_file_size >> 20);
12453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
12553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	err = 0;
12653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	for_each_file(td, f, i) {
12725205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe		if (file_ok(td, f)) {
12825205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe			err = create_file(td, f);
12925205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe			if (err)
13025205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe				break;
13125205e975e6dce6079a4b94d656724011f1aabd0Jens Axboe		}
13253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
13353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
13453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	temp_stall_ts = 0;
13553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return err;
13653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
13753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
13853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int file_size(struct thread_data *td, struct fio_file *f)
13953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
14053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	struct stat st;
14153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
14253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (td->overwrite) {
14353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		if (fstat(f->fd, &st) == -1) {
14453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			td_verror(td, errno);
14553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			return 1;
14653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		}
14753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
14853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		f->real_file_size = st.st_size;
14953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
15053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		if (!f->file_size || f->file_size > f->real_file_size)
15153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			f->file_size = f->real_file_size;
15253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
15353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
15453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	f->file_size -= f->file_offset;
15553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
15653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
15753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
15853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int bdev_size(struct thread_data *td, struct fio_file *f)
15953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
16053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	unsigned long long bytes;
16153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	int r;
16253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
16353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	r = blockdev_size(f->fd, &bytes);
16453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (r) {
16553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		td_verror(td, r);
16653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return 1;
16753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
16853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
16953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	f->real_file_size = bytes;
17053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
17153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	/*
17253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	 * no extend possibilities, so limit size to device size if too large
17353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	 */
17453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (!f->file_size || f->file_size > f->real_file_size)
17553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		f->file_size = f->real_file_size;
17653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
17753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	f->file_size -= f->file_offset;
17853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
17953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
18053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
18153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int get_file_size(struct thread_data *td, struct fio_file *f)
18253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
18353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	int ret = 0;
18453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
18553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (td->filetype == FIO_TYPE_FILE)
18653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		ret = file_size(td, f);
18753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	else if (td->filetype == FIO_TYPE_BD)
18853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		ret = bdev_size(td, f);
18953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	else
19053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		f->real_file_size = -1;
19153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
19253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (ret)
19353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return ret;
19453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
19553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (f->file_offset > f->real_file_size) {
19653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		log_err("%s: offset extends end (%Lu > %Lu)\n", td->name, f->file_offset, f->real_file_size);
19753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return 1;
19853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
19953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
20053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
20153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
20253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
203e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboeint file_invalidate_cache(struct thread_data *td, struct fio_file *f)
204e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe{
205e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	int ret = 0;
206e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
207e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	/*
208e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	 * FIXME: add blockdev flushing too
209e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	 */
210e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	if (td->io_ops->flags & FIO_MMAPIO)
211e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe		ret = madvise(f->mmap, f->file_size, MADV_DONTNEED);
212e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	else if (td->filetype == FIO_TYPE_FILE)
213e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe		ret = fadvise(f->fd, f->file_offset, f->file_size, POSIX_FADV_DONTNEED);
214e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	else if (td->filetype == FIO_TYPE_BD)
215e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe		ret = blockdev_invalidate_cache(f->fd);
216e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	else if (td->filetype == FIO_TYPE_CHAR)
217e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe		ret = 0;
218e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
219e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	if (ret < 0) {
220e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe		td_verror(td, errno);
221e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe		return 1;
222e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	}
223e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
224e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	return 0;
225e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe}
226e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
22753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int __setup_file_mmap(struct thread_data *td, struct fio_file *f)
22853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
22953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	int flags;
23053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
23153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (td_rw(td))
23253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		flags = PROT_READ | PROT_WRITE;
23353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	else if (td_write(td)) {
23453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		flags = PROT_WRITE;
23553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
23653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		if (td->verify != VERIFY_NONE)
23753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			flags |= PROT_READ;
23853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	} else
23953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		flags = PROT_READ;
24053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
24153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	f->mmap = mmap(NULL, f->file_size, flags, MAP_SHARED, f->fd, f->file_offset);
24253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (f->mmap == MAP_FAILED) {
24353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		f->mmap = NULL;
24453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		td_verror(td, errno);
24553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return 1;
24653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
24753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
248e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	if (td->invalidate_cache && file_invalidate_cache(td, f))
249e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe		return 1;
25053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
25153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (td->sequential) {
25253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		if (madvise(f->mmap, f->file_size, MADV_SEQUENTIAL) < 0) {
25353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			td_verror(td, errno);
25453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			return 1;
25553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		}
25653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	} else {
25753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		if (madvise(f->mmap, f->file_size, MADV_RANDOM) < 0) {
25853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			td_verror(td, errno);
25953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			return 1;
26053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		}
26153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
26253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
26353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
26453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
26553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
26653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int setup_files_mmap(struct thread_data *td)
26753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
26853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	struct fio_file *f;
26953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	int i, err = 0;
27053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
27153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	for_each_file(td, f, i) {
27253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		err = __setup_file_mmap(td, f);
27353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		if (err)
27453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			break;
27553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
27653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
27753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return err;
27853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
27953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
28053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int __setup_file_plain(struct thread_data *td, struct fio_file *f)
28153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
282e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe	if (td->invalidate_cache && file_invalidate_cache(td, f))
283e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe		return 1;
28453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
28553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (td->sequential) {
28653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		if (fadvise(f->fd, f->file_offset, f->file_size, POSIX_FADV_SEQUENTIAL) < 0) {
28753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			td_verror(td, errno);
28853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			return 1;
28953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		}
29053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	} else {
29153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		if (fadvise(f->fd, f->file_offset, f->file_size, POSIX_FADV_RANDOM) < 0) {
29253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			td_verror(td, errno);
29353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			return 1;
29453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		}
29553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
29653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
29753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
29853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
29953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
30053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int setup_files_plain(struct thread_data *td)
30153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
30253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	struct fio_file *f;
30353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	int i, err = 0;
30453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
30553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	for_each_file(td, f, i) {
30653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		err = __setup_file_plain(td, f);
30753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		if (err)
30853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			break;
30953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
31053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
31153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return err;
31253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
31353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
31453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboestatic int setup_file(struct thread_data *td, struct fio_file *f)
31553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
31653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	int flags = 0;
31753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
31853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (td->odirect)
31953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		flags |= OS_O_DIRECT;
32053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
32153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (td_write(td) || td_rw(td)) {
32253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		if (td->filetype == FIO_TYPE_FILE) {
32353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			if (!td->overwrite)
32453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe				flags |= O_TRUNC;
32553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
32653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			flags |= O_CREAT;
32753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		}
32853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		if (td->sync_io)
32953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			flags |= O_SYNC;
33053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
33153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		flags |= O_RDWR;
33253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
33353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		f->fd = open(f->file_name, flags, 0600);
33453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	} else {
33553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		if (td->filetype == FIO_TYPE_CHAR)
33653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			flags |= O_RDWR;
33753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		else
33853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			flags |= O_RDONLY;
33953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
34053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		f->fd = open(f->file_name, flags);
34153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
34253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
34353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (f->fd == -1) {
34453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		td_verror(td, errno);
34553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return 1;
34653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
34753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
34853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (get_file_size(td, f))
34953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return 1;
35053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
35153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	return 0;
35253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
35353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
35421972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboeint open_files(struct thread_data *td)
35521972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe{
35621972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe	struct fio_file *f;
35721972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe	int i, err = 0;
35821972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe
35921972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe	for_each_file(td, f, i) {
36021972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe		err = setup_file(td, f);
36121972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe		if (err)
36221972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe			break;
36321972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe	}
36421972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe
36521972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe	return err;
36621972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe}
36721972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe
36853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboeint setup_files(struct thread_data *td)
36953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
37053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	struct fio_file *f;
37121972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe	int err, i;
37253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
37353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	/*
37453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	 * if ioengine defines a setup() method, it's responsible for
37553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	 * setting up everything in the td->files[] area.
37653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	 */
37753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (td->io_ops->setup)
37853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return td->io_ops->setup(td);
37953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
38053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (create_files(td))
38153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return 1;
38253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
38321972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe	err = open_files(td);
384f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe	if (err)
385f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe		return err;
386f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe
3870a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe	/*
3880a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe	 * Recalculate the total file size now that files are set up.
3890a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe	 */
3900a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe	td->total_file_size = 0;
3910a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe	for_each_file(td, f, i)
3920a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe		td->total_file_size += f->file_size;
3930a7eb121ecb2e4279e9eb8178aa1e554dda40191Jens Axboe
394f102706350093e60617cc271b128e56c57ab3ce7Jens Axboe	td->io_size = td->total_file_size;
39553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (td->io_size == 0) {
39653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		log_err("%s: no io blocks\n", td->name);
39753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		td_verror(td, EINVAL);
39853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		return 1;
39953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
40053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
40153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (!td->zone_size)
40253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		td->zone_size = td->io_size;
40353cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
40453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	td->total_io_size = td->io_size * td->loops;
40553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
40653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	if (td->io_ops->flags & FIO_MMAPIO)
40721972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe		err = setup_files_mmap(td);
40853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	else
40921972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe		err = setup_files_plain(td);
41021972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe
41121972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe	for_each_file(td, f, i) {
41221972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe		if (f->fd != -1) {
41321972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe			close(f->fd);
41421972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe			f->fd = -1;
41521972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe		}
41621972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe	}
41721972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe
41821972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe	return err;
41953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
42053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
42153cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboevoid close_files(struct thread_data *td)
42253cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe{
4230ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe	struct fio_file *f;
42453cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	int i;
42553cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe
4260ab8db8943acc6b9ea778735563bfad2a79e8dddJens Axboe	for_each_file(td, f, i) {
427132ad46d22bcf12da95ad69e03c1b6f23f5e60a9Jens Axboe		if (td->unlink && td->filetype == FIO_TYPE_FILE) {
428132ad46d22bcf12da95ad69e03c1b6f23f5e60a9Jens Axboe			unlink(f->file_name);
429132ad46d22bcf12da95ad69e03c1b6f23f5e60a9Jens Axboe			free(f->file_name);
430132ad46d22bcf12da95ad69e03c1b6f23f5e60a9Jens Axboe			f->file_name = NULL;
431132ad46d22bcf12da95ad69e03c1b6f23f5e60a9Jens Axboe		}
43221972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe		if (f->fd != -1) {
43321972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe			close(f->fd);
43421972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe			f->fd = -1;
43521972cdef7db6b557c2d56138f8434658a9d1e49Jens Axboe		}
43653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		if (f->mmap) {
43753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			munmap(f->mmap, f->file_size);
43853cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe			f->mmap = NULL;
43953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe		}
44053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe	}
441b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe
442132ad46d22bcf12da95ad69e03c1b6f23f5e60a9Jens Axboe	td->filename = NULL;
443b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe	free(td->files);
444b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe	td->files = NULL;
445b4a6a59a939f0e6554632de311e7d1d1b7633ccfJens Axboe	td->nr_files = 0;
44653cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe}
447