Check if sysfs ioscheduler entry is "none"
[fio.git] / backend.c
index 8a71490e9a59424e6e243afc1f1eb8356443b3e2..6bf5d679a5898d998f8d5efeb0ce3b9b46b99d81 100644 (file)
--- a/backend.c
+++ b/backend.c
@@ -571,6 +571,28 @@ static inline bool io_in_polling(struct thread_data *td)
        return !td->o.iodepth_batch_complete_min &&
                   !td->o.iodepth_batch_complete_max;
 }
+/*
+ * Unlinks files from thread data fio_file structure
+ */
+static int unlink_all_files(struct thread_data *td)
+{
+       struct fio_file *f;
+       unsigned int i;
+       int ret = 0;
+
+       for_each_file(td, f, i) {
+               if (f->filetype != FIO_TYPE_FILE)
+                       continue;
+               ret = td_io_unlink_file(td, f);
+               if (ret)
+                       break;
+       }
+
+       if (ret)
+               td_verror(td, ret, "unlink_all_files");
+
+       return ret;
+}
 
 /*
  * The main verify engine. Runs over the writes we previously submitted,
@@ -652,7 +674,7 @@ static void do_verify(struct thread_data *td, uint64_t verify_bytes)
                                break;
 
                        while ((io_u = get_io_u(td)) != NULL) {
-                               if (IS_ERR(io_u)) {
+                               if (IS_ERR_OR_NULL(io_u)) {
                                        io_u = NULL;
                                        ret = FIO_Q_BUSY;
                                        goto reap;
@@ -1309,6 +1331,14 @@ static int switch_ioscheduler(struct thread_data *td)
         */
        tmp[strlen(tmp) - 1] = '\0';
 
+       /*
+        * Write to "none" entry doesn't fail, so check the result here.
+        */
+       if (!strcmp(tmp, "none")) {
+               log_err("fio: io scheduler is not tunable\n");
+               fclose(f);
+               return 0;
+       }
 
        sprintf(tmp2, "[%s]", td->o.ioscheduler);
        if (!strstr(tmp, tmp2)) {
@@ -1667,9 +1697,13 @@ static void *thread_main(void *data)
                fio_gettime(&td->start, NULL);
                memcpy(&td->tv_cache, &td->start, sizeof(td->start));
 
-               if (clear_state)
+               if (clear_state) {
                        clear_io_state(td, 0);
 
+                       if (o->unlink_each_loop && unlink_all_files(td))
+                               break;
+               }
+
                prune_io_piece_log(td);
 
                if (td->o.verify_only && (td_write(td) || td_rw(td)))