Merge branch 'master' into gfio
[fio.git] / fio.h
diff --git a/fio.h b/fio.h
index 4b3c63b7271b115c2ed927dac102186294b8416a..7f11861d074bb6855d6690fc4c0a8b1f765ea7e9 100644 (file)
--- a/fio.h
+++ b/fio.h
@@ -344,15 +344,32 @@ static inline void fio_ro_check(struct thread_data *td, struct io_u *io_u)
 
 #define REAL_MAX_JOBS          2048
 
-#define td_non_fatal_error(e)  ((e) == EIO || (e) == EILSEQ)
-
 static inline enum error_type td_error_type(enum fio_ddir ddir, int err)
 {
        if (err == EILSEQ)
-               return ERROR_TYPE_VERIFY;
+               return ERROR_TYPE_VERIFY_BIT;
        if (ddir == DDIR_READ)
-               return ERROR_TYPE_READ;
-       return ERROR_TYPE_WRITE;
+               return ERROR_TYPE_READ_BIT;
+       return ERROR_TYPE_WRITE_BIT;
+}
+
+static int __NON_FATAL_ERR[] = {EIO, EILSEQ};
+static inline int td_non_fatal_error(struct thread_data *td,
+                                    enum error_type_bit etype, int err)
+{
+       int i;
+       if (!td->o.ignore_error[etype]) {
+               td->o.ignore_error[etype] = __NON_FATAL_ERR;
+               td->o.ignore_error_nr[etype] = sizeof(__NON_FATAL_ERR)
+                       / sizeof(int);
+       }
+
+       if (!(td->o.continue_on_error & (1 << etype)))
+               return 0;
+       for (i = 0; i < td->o.ignore_error_nr[etype]; i++)
+               if (td->o.ignore_error[etype][i] == err)
+                       return 1;
+       return 0;
 }
 
 static inline void update_error_count(struct thread_data *td, int err)