Expand continue_on_error to select which type of error to allow
[fio.git] / fio.c
diff --git a/fio.c b/fio.c
index 5b58ab82252258a072d841c09c69a23f034f1cd2..87020863bf8c86c5f0096a440e66dd00b660da16 100644 (file)
--- a/fio.c
+++ b/fio.c
@@ -452,21 +452,22 @@ static inline void update_tv_cache(struct thread_data *td)
                __update_tv_cache(td);
 }
 
-static int break_on_this_error(struct thread_data *td, int *retptr)
+static int break_on_this_error(struct thread_data *td, enum fio_ddir ddir,
+                              int *retptr)
 {
        int ret = *retptr;
 
        if (ret < 0 || td->error) {
                int err;
 
-               if (!td->o.continue_on_error)
-                       return 1;
-
                if (ret < 0)
                        err = -ret;
                else
                        err = td->error;
 
+               if (!(td->o.continue_on_error & td_error_type(ddir, err)))
+                       return 1;
+
                if (td_non_fatal_error(err)) {
                        /*
                         * Continue with the I/Os in case of
@@ -612,7 +613,7 @@ sync_done:
                        break;
                }
 
-               if (break_on_this_error(td, &ret))
+               if (break_on_this_error(td, io_u->ddir, &ret))
                        break;
 
                /*
@@ -678,6 +679,7 @@ static void do_io(struct thread_data *td)
                int min_evts = 0;
                struct io_u *io_u;
                int ret2, full;
+               enum fio_ddir ddir;
 
                if (td->terminate)
                        break;
@@ -696,6 +698,8 @@ static void do_io(struct thread_data *td)
                if (!io_u)
                        break;
 
+               ddir = io_u->ddir;
+
                /*
                 * Add verification end_io handler, if asked to verify
                 * a previously written file.
@@ -774,7 +778,7 @@ sync_done:
                        break;
                }
 
-               if (break_on_this_error(td, &ret))
+               if (break_on_this_error(td, ddir, &ret))
                        break;
 
                /*