Test malloc result when allocation size is tunable
[fio.git] / filesetup.c
index 085d0c89fc9e6381fcc4c3dd05c6e2ddb0864a66..ce19cf0b127d294e6d8d4c012595863552598b30 100644 (file)
@@ -160,6 +160,10 @@ static int extend_file(struct thread_data *td, struct fio_file *f)
        }
 
        b = malloc(td->o.max_bs[DDIR_WRITE]);
        }
 
        b = malloc(td->o.max_bs[DDIR_WRITE]);
+       if (!b) {
+               td_verror(td, errno, "malloc");
+               goto err;
+       }
 
        left = f->real_file_size;
        while (left && !td->terminate) {
 
        left = f->real_file_size;
        while (left && !td->terminate) {
@@ -243,6 +247,11 @@ static int pre_read_file(struct thread_data *td, struct fio_file *f)
 
        bs = td->o.max_bs[DDIR_READ];
        b = malloc(bs);
 
        bs = td->o.max_bs[DDIR_READ];
        b = malloc(bs);
+       if (!b) {
+               td_verror(td, errno, "malloc");
+               ret = 1;
+               goto error;
+       }
        memset(b, 0, bs);
 
        if (lseek(f->fd, f->file_offset, SEEK_SET) < 0) {
        memset(b, 0, bs);
 
        if (lseek(f->fd, f->file_offset, SEEK_SET) < 0) {
@@ -447,7 +456,7 @@ static int __file_invalidate_cache(struct thread_data *td, struct fio_file *f,
                        f->file_name);
                ret = td->io_ops->invalidate(td, f);
                if (ret < 0)
                        f->file_name);
                ret = td->io_ops->invalidate(td, f);
                if (ret < 0)
-                       errval = ret;
+                       errval = -ret;
        } else if (f->filetype == FIO_TYPE_FILE) {
                dprint(FD_IO, "declare unneeded cache %s: %llu/%llu\n",
                        f->file_name, off, len);
        } else if (f->filetype == FIO_TYPE_FILE) {
                dprint(FD_IO, "declare unneeded cache %s: %llu/%llu\n",
                        f->file_name, off, len);
@@ -479,6 +488,8 @@ static int __file_invalidate_cache(struct thread_data *td, struct fio_file *f,
                }
                if (ret < 0)
                        errval = errno;
                }
                if (ret < 0)
                        errval = errno;
+               else if (ret) /* probably not supported */
+                       errval = ret;
        } else if (f->filetype == FIO_TYPE_CHAR ||
                   f->filetype == FIO_TYPE_PIPE) {
                dprint(FD_IO, "invalidate not supported %s\n", f->file_name);
        } else if (f->filetype == FIO_TYPE_CHAR ||
                   f->filetype == FIO_TYPE_PIPE) {
                dprint(FD_IO, "invalidate not supported %s\n", f->file_name);
@@ -492,7 +503,8 @@ static int __file_invalidate_cache(struct thread_data *td, struct fio_file *f,
         * continue on our way.
         */
        if (errval)
         * continue on our way.
         */
        if (errval)
-               log_info("fio: cache invalidation of %s failed: %s\n", f->file_name, strerror(errval));
+               log_info("fio: cache invalidation of %s failed: %s\n",
+                        f->file_name, strerror(errval));
 
        return 0;
 
 
        return 0;
 
@@ -929,19 +941,17 @@ int setup_files(struct thread_data *td)
                        }
 
                        /*
                        }
 
                        /*
-                        * 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
+                        * We normally don't come here for regular files, but
+                        * if the result is 0 for a regular file, 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;
                         * ->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);
                                if (!f->io_size)
                                        log_info("fio: file %s may be ignored\n",
                                                f->file_name);