Error out if the set blocksize is larger than the file size
[fio.git] / filesetup.c
index c132c326e33afe5766cb2fbe15e1d031b8a30fa3..79eea9f879fb42b1f21607e5fe4df1fe4d498cd5 100644 (file)
@@ -711,8 +711,8 @@ static unsigned long long get_fs_free_counts(struct thread_data *td)
                if (fm)
                        continue;
 
-               fm = malloc(sizeof(*fm));
-               strcpy(fm->__base, buf);
+               fm = calloc(1, sizeof(*fm));
+               strncpy(fm->__base, buf, sizeof(fm->__base) - 1);
                fm->base = basename(fm->__base);
                fm->key = sb.st_dev;
                flist_add(&fm->list, &list);
@@ -885,6 +885,11 @@ int setup_files(struct thread_data *td)
        if (!o->size || o->size > total_size)
                o->size = total_size;
 
+       if (o->size < td_min_bs(td)) {
+               log_err("fio: blocksize too large for data set\n");
+               goto err_out;
+       }
+
        /*
         * See if we need to extend some files
         */
@@ -915,7 +920,13 @@ int setup_files(struct thread_data *td)
 
                        err = __file_invalidate_cache(td, f, old_len,
                                                                extend_len);
-                       close(f->fd);
+
+                       /*
+                        * Shut up static checker
+                        */
+                       if (f->fd != -1)
+                               close(f->fd);
+
                        f->fd = -1;
                        if (err)
                                break;
@@ -1326,8 +1337,11 @@ int put_file(struct thread_data *td, struct fio_file *f)
        if (--f->references)
                return 0;
 
-       if (should_fsync(td) && td->o.fsync_on_close)
+       if (should_fsync(td) && td->o.fsync_on_close) {
                f_ret = fsync(f->fd);
+               if (f_ret < 0)
+                       f_ret = errno;
+       }
 
        if (td->io_ops->close_file)
                ret = td->io_ops->close_file(td, f);