syslet: we have fls(), use it for rounding ring size up
[fio.git] / filesetup.c
index 58c5015c97f1ddbe5150fad0ef11af006de58d9f..6c241516ff9424f526e587b9acd620b817c9cdfb 100644 (file)
@@ -18,6 +18,11 @@ static int extend_file(struct thread_data *td, struct fio_file *f)
        unsigned int bs;
        char *b;
 
+       if (read_only) {
+               log_err("fio: refusing extend of file due to read-only\n");
+               return 0;
+       }
+
        /*
         * check if we need to lay the file out complete again. fio
         * does that for operations involving reads, or for writes
@@ -226,8 +231,13 @@ int generic_open_file(struct thread_data *td, struct fio_file *f)
                flags |= OS_O_DIRECT;
        if (td->o.sync_io)
                flags |= O_SYNC;
+       if (f->filetype != FIO_TYPE_FILE)
+               flags |= O_NOATIME;
 
+open_again:
        if (td_write(td)) {
+               assert(!read_only);
+
                flags |= O_RDWR;
 
                if (f->filetype == FIO_TYPE_FILE)
@@ -238,7 +248,7 @@ int generic_open_file(struct thread_data *td, struct fio_file *f)
                else
                        f->fd = open(f->file_name, flags, 0600);
        } else {
-               if (f->filetype == FIO_TYPE_CHAR)
+               if (f->filetype == FIO_TYPE_CHAR && !read_only)
                        flags |= O_RDWR;
                else
                        flags |= O_RDONLY;
@@ -253,6 +263,11 @@ int generic_open_file(struct thread_data *td, struct fio_file *f)
                char buf[FIO_VERROR_SIZE];
                int __e = errno;
 
+               if (errno == EPERM && (flags & O_NOATIME)) {
+                       flags &= ~O_NOATIME;
+                       goto open_again;
+               }
+
                snprintf(buf, sizeof(buf) - 1, "open(%s)", f->file_name);
 
                td_verror(td, __e, buf);
@@ -364,7 +379,8 @@ int setup_files(struct thread_data *td)
        /*
         * device/file sizes are zero and no size given, punt
         */
-       if ((!total_size || total_size == -1ULL) && !td->o.size) {
+       if ((!total_size || total_size == -1ULL) && !td->o.size &&
+           !(td->io_ops->flags & FIO_NOIO)) {
                log_err("%s: you need to specify size=\n", td->o.name);
                td_verror(td, EINVAL, "total_file_size");
                return 1;
@@ -431,7 +447,7 @@ int setup_files(struct thread_data *td)
         */
        if (need_extend) {
                temp_stall_ts = 1;
-               log_info("%s: Laying out IO file(s) (%u files / %LuMiB)\n",
+               log_info("%s: Laying out IO file(s) (%u file(s) / %LuMiB)\n",
                        td->o.name, need_extend, extend_size >> 20);
 
                for_each_file(td, f, i) {
@@ -454,7 +470,12 @@ int setup_files(struct thread_data *td)
        if (!td->o.zone_size)
                td->o.zone_size = td->o.size;
 
-       td->total_io_size = td->o.size * td->o.loops;
+       /*
+        * iolog already set the total io size, if we read back
+        * stored entries.
+        */
+       if (!td->o.read_iolog_file)
+               td->total_io_size = td->o.size * td->o.loops;
        return 0;
 err_offset:
        log_err("%s: you need to specify valid offset=\n", td->o.name);