projects
/
fio.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Unlink a writeable file, if overwrite isn't set
[fio.git]
/
filesetup.c
diff --git
a/filesetup.c
b/filesetup.c
index 5ad626a9df38a9b77bf6360eeabc4cebd42f760a..e3478f582ac2c81405457546f6b8a15634521baa 100644
(file)
--- a/
filesetup.c
+++ b/
filesetup.c
@@
-12,7
+12,7
@@
static int extend_file(struct thread_data *td, struct fio_file *f)
{
static int extend_file(struct thread_data *td, struct fio_file *f)
{
- int r, new_layout = 0, flags;
+ int r, new_layout = 0,
unlink_file = 0,
flags;
unsigned long long left;
unsigned int bs;
char *b;
unsigned long long left;
unsigned int bs;
char *b;
@@
-24,8
+24,10
@@
static int extend_file(struct thread_data *td, struct fio_file *f)
*/
if (td_read(td) || (td_write(td) && td->o.overwrite))
new_layout = 1;
*/
if (td_read(td) || (td_write(td) && td->o.overwrite))
new_layout = 1;
+ if (td_write(td) && !td->o.overwrite)
+ unlink_file = 1;
- if (
new_layout
&& (f->flags & FIO_FILE_EXISTS)) {
+ if (
(unlink_file || new_layout)
&& (f->flags & FIO_FILE_EXISTS)) {
if (unlink(f->file_name) < 0) {
td_verror(td, errno, "unlink");
return 1;
if (unlink(f->file_name) < 0) {
td_verror(td, errno, "unlink");
return 1;
@@
-47,14
+49,14
@@
static int extend_file(struct thread_data *td, struct fio_file *f)
goto err;
}
goto err;
}
+ if (!new_layout)
+ goto done;
+
if (posix_fallocate(f->fd, 0, f->real_file_size) < 0) {
td_verror(td, errno, "posix_fallocate");
goto err;
}
if (posix_fallocate(f->fd, 0, f->real_file_size) < 0) {
td_verror(td, errno, "posix_fallocate");
goto err;
}
- if (!new_layout)
- goto done;
-
b = malloc(td->o.max_bs[DDIR_WRITE]);
memset(b, 0, td->o.max_bs[DDIR_WRITE]);
b = malloc(td->o.max_bs[DDIR_WRITE]);
memset(b, 0, td->o.max_bs[DDIR_WRITE]);
@@
-138,6
+140,9
@@
static int get_file_size(struct thread_data *td, struct fio_file *f)
{
int ret = 0;
{
int ret = 0;
+ if (f->flags & FIO_SIZE_KNOWN)
+ return 0;
+
if (f->filetype == FIO_TYPE_FILE)
ret = file_size(td, f);
else if (f->filetype == FIO_TYPE_BD)
if (f->filetype == FIO_TYPE_FILE)
ret = file_size(td, f);
else if (f->filetype == FIO_TYPE_BD)
@@
-153,6
+158,7
@@
static int get_file_size(struct thread_data *td, struct fio_file *f)
return 1;
}
return 1;
}
+ f->flags |= FIO_SIZE_KNOWN;
return 0;
}
return 0;
}
@@
-244,8
+250,15
@@
int open_files(struct thread_data *td)
for_each_file(td, f, i) {
err = td_io_open_file(td, f);
for_each_file(td, f, i) {
err = td_io_open_file(td, f);
- if (err)
+ if (err) {
+ if (td->error == EMFILE) {
+ log_err("fio: limited open files to: %d\n", td->nr_open_files);
+ td->o.open_files = td->nr_open_files;
+ err = 0;
+ clear_error(td);
+ }
break;
break;
+ }
if (td->o.open_files == td->nr_open_files)
break;
if (td->o.open_files == td->nr_open_files)
break;
@@
-269,11
+282,13
@@
static void get_file_sizes(struct thread_data *td)
unsigned int i;
for_each_file(td, f, i) {
unsigned int i;
for_each_file(td, f, i) {
- if (td->io_ops->open_file(td, f)) {
- td->error = 0;
- memset(td->verror, 0, sizeof(td->verror));
- } else
+ if (td->io_ops->open_file(td, f))
+ clear_error(td);
+ else
td->io_ops->close_file(td, f);
td->io_ops->close_file(td, f);
+
+ if (f->real_file_size == -1ULL && td->o.size)
+ f->real_file_size = td->o.size / td->o.nr_files;
}
}
}
}
@@
-315,7
+330,7
@@
int setup_files(struct thread_data *td)
/*
* device/file sizes are zero and no size given, punt
*/
/*
* device/file sizes are zero and no size given, punt
*/
- if (
!total_size
&& !td->o.size) {
+ if (
(!total_size || total_size == -1ULL)
&& !td->o.size) {
log_err("%s: you need to specify size=\n", td->o.name);
td_verror(td, EINVAL, "total_file_size");
return 1;
log_err("%s: you need to specify size=\n", td->o.name);
td_verror(td, EINVAL, "total_file_size");
return 1;
@@
-380,6
+395,7
@@
int setup_files(struct thread_data *td)
if (!(f->flags & FIO_FILE_EXTEND))
continue;
if (!(f->flags & FIO_FILE_EXTEND))
continue;
+ assert(f->filetype == FIO_TYPE_FILE);
f->flags &= ~FIO_FILE_EXTEND;
f->real_file_size = f->io_size;
err = extend_file(td, f);
f->flags &= ~FIO_FILE_EXTEND;
f->real_file_size = f->io_size;
err = extend_file(td, f);
@@
-509,6
+525,7
@@
void put_file(struct thread_data *td, struct fio_file *f)
if (td->io_ops->close_file)
td->io_ops->close_file(td, f);
if (td->io_ops->close_file)
td->io_ops->close_file(td, f);
+
td->nr_open_files--;
f->flags &= ~FIO_FILE_OPEN;
}
td->nr_open_files--;
f->flags &= ~FIO_FILE_OPEN;
}
@@
-521,7
+538,10
@@
static int recurse_dir(struct thread_data *td, const char *dirname)
D = opendir(dirname);
if (!D) {
D = opendir(dirname);
if (!D) {
- td_verror(td, errno, "opendir");
+ char buf[FIO_VERROR_SIZE];
+
+ snprintf(buf, FIO_VERROR_SIZE - 1, "opendir(%s)", dirname);
+ td_verror(td, errno, buf);
return 1;
}
return 1;
}
@@
-546,6
+566,8
@@
static int recurse_dir(struct thread_data *td, const char *dirname)
td->o.nr_files++;
continue;
}
td->o.nr_files++;
continue;
}
+ if (!S_ISDIR(sb.st_mode))
+ continue;
if ((ret = recurse_dir(td, full_path)) != 0)
break;
if ((ret = recurse_dir(td, full_path)) != 0)
break;
@@
-557,7
+579,12
@@
static int recurse_dir(struct thread_data *td, const char *dirname)
int add_dir_files(struct thread_data *td, const char *path)
{
int add_dir_files(struct thread_data *td, const char *path)
{
- return recurse_dir(td, path);
+ int ret = recurse_dir(td, path);
+
+ if (!ret)
+ log_info("fio: opendir added %d files\n", td->o.nr_files);
+
+ return ret;
}
void dup_files(struct thread_data *td, struct thread_data *org)
}
void dup_files(struct thread_data *td, struct thread_data *org)