Minor fixup for "Layint out IO file..." message
[fio.git] / filesetup.c
index 793b08d07549c895944f406e7afcdb7d7765e840..b240891d1daf86b89bc734b1a71968fe8d25caa8 100644 (file)
@@ -377,12 +377,8 @@ static int get_file_size(struct thread_data *td, struct fio_file *f)
                ret = bdev_size(td, f);
        else if (f->filetype == FIO_TYPE_CHAR)
                ret = char_size(td, f);
-       else {
-               f->real_file_size = -1;
-               log_info("%s: failed to get file size of %s\n", td->o.name,
-                                       f->file_name);
-               return 1; /* avoid offset extends end error message */
-       }
+       else
+               f->real_file_size = -1ULL;
 
        /*
         * Leave ->real_file_size with 0 since it could be expectation
@@ -391,11 +387,23 @@ static int get_file_size(struct thread_data *td, struct fio_file *f)
        if (ret)
                return ret;
 
+       /*
+        * If ->real_file_size is -1, a conditional for the message
+        * "offset extends end" is always true, but it makes no sense,
+        * so just return the same value here.
+        */
+       if (f->real_file_size == -1ULL) {
+               log_info("%s: failed to get file size of %s\n", td->o.name,
+                                       f->file_name);
+               return 1;
+       }
+
+       if (td->o.start_offset && f->file_offset == 0)
+               dprint(FD_FILE, "offset of file %s not initialized yet\n",
+                                       f->file_name);
        /*
         * ->file_offset normally hasn't been initialized yet, so this
-        * is basically always false unless ->real_file_size is -1, but
-        * if ->real_file_size is -1 this message doesn't make sense.
-        * As a result, this message is basically useless.
+        * is basically always false.
         */
        if (f->file_offset > f->real_file_size) {
                log_err("%s: offset extends end (%llu > %llu)\n", td->o.name,
@@ -611,7 +619,8 @@ open_again:
                        f->fd = dup(STDIN_FILENO);
                else
                        from_hash = file_lookup_open(f, flags);
-       } else { //td trim
+       } else if (td_trim(td)) {
+               assert(!td_rw(td)); /* should have matched above */
                flags |= O_RDWR;
                from_hash = file_lookup_open(f, flags);
        }
@@ -685,7 +694,7 @@ static int get_file_sizes(struct thread_data *td)
        int err = 0;
 
        for_each_file(td, f, i) {
-               dprint(FD_FILE, "get file size for %p/%d/%p\n", f, i,
+               dprint(FD_FILE, "get file size for %p/%d/%s\n", f, i,
                                                                f->file_name);
 
                if (td_io_get_file_size(td, f)) {
@@ -896,8 +905,7 @@ int setup_files(struct thread_data *td)
                if (!o->file_size_low) {
                        /*
                         * no file size or range given, file size is equal to
-                        * total size divided by number of files. If that is
-                        * zero, set it to the real file size. If the size
+                        * total size divided by number of files. If the size
                         * doesn't divide nicely with the min blocksize,
                         * make the first files bigger.
                         */
@@ -907,8 +915,24 @@ int setup_files(struct thread_data *td)
                                f->io_size += bs;
                        }
 
-                       if (!f->io_size)
+                       /*
+                        * We normally don't come here, but if the result is 0,
+                        * set it to the real file size. This could be size of
+                        * the existing one if it already exists, but otherwise
+                        * will be set to 0. A new file won't be created because
+                        * ->io_size + ->file_offset equals ->real_file_size.
+                        */
+                       if (!f->io_size) {
+                               if (f->file_offset > f->real_file_size)
+                                       goto err_offset;
                                f->io_size = f->real_file_size - f->file_offset;
+                               log_info("fio: forcing file %s size to %llu\n",
+                                       f->file_name,
+                                       (unsigned long long)f->io_size);
+                               if (!f->io_size)
+                                       log_info("fio: file %s may be ignored\n",
+                                               f->file_name);
+                       }
                } else if (f->real_file_size < o->file_size_low ||
                           f->real_file_size > o->file_size_high) {
                        if (f->file_offset > o->file_size_low)
@@ -942,9 +966,9 @@ int setup_files(struct thread_data *td)
                        if (!o->create_on_open) {
                                need_extend++;
                                extend_size += (f->io_size + f->file_offset);
+                               fio_file_set_extend(f);
                        } else
                                f->real_file_size = f->io_size + f->file_offset;
-                       fio_file_set_extend(f);
                }
        }
 
@@ -984,9 +1008,15 @@ int setup_files(struct thread_data *td)
         */
        if (need_extend) {
                temp_stall_ts = 1;
-               if (output_format & FIO_OUTPUT_NORMAL)
-                       log_info("%s: Laying out IO file(s) (%u file(s) / %lluMiB)\n",
-                                o->name, need_extend, extend_size >> 20);
+               if (output_format & FIO_OUTPUT_NORMAL) {
+                       log_info("%s: Laying out IO file%s (%u file%s / %s%lluMiB)\n",
+                                o->name,
+                                need_extend > 1 ? "s" : "",
+                                need_extend,
+                                need_extend > 1 ? "s" : "",
+                                need_extend > 1 ? "total " : "",
+                                extend_size >> 20);
+               }
 
                for_each_file(td, f, i) {
                        unsigned long long old_len = -1ULL, extend_len = -1ULL;