multipathd: fix reservation_key check
[multipath-tools/.git] / libmultipath / checkers.h
index e62b52f..52154ca 100644 (file)
@@ -3,6 +3,7 @@
 
 #include "list.h"
 #include "memory.h"
+#include "defaults.h"
 
 /*
  *
@@ -10,7 +11,7 @@
  *
  * PATH_WILD:
  * - Use: None of the checkers (returned if we don't have an fd)
- * - Description: Corner case where "fd <= 0" for path fd (see checker_check())
+ * - Description: Corner case where "fd < 0" for path fd (see checker_check())
  *
  * PATH_UNCHECKED:
  * - Use: Only in directio checker
  * PATH REMOVED:
  * - Use: All checkers
  * - Description: Device has been removed from the system
+ *
+ * PATH_DELAYED:
+ * - Use: None of the checkers (returned if the path is being delayed before
+ *   reintegration.
+ * - Description: If a path fails after being up for less than
+ *   delay_watch_checks checks, when it comes back up again, it will not
+ *   be marked as up until it has been up for delay_wait_checks checks.
+ *   During this time, it is marked as "delayed"
  */
 enum path_check_state {
        PATH_WILD,
@@ -65,6 +74,7 @@ enum path_check_state {
        PATH_PENDING,
        PATH_TIMEOUT,
        PATH_REMOVED,
+       PATH_DELAYED,
        PATH_MAX_STATE
 };
 
@@ -75,8 +85,8 @@ enum path_check_state {
 #define EMC_CLARIION "emc_clariion"
 #define READSECTOR0  "readsector0"
 #define CCISS_TUR    "cciss_tur"
-
-#define DEFAULT_CHECKER DIRECTIO
+#define NONE         "none"
+#define RBD          "rbd"
 
 #define ASYNC_TIMEOUT_SEC      30
 
@@ -103,6 +113,9 @@ struct checker {
                                                multipath-wide. Use MALLOC if
                                                you want to stuff data in. */
        int (*check)(struct checker *);
+       void (*repair)(struct checker *);    /* called if check returns
+                                               PATH_DOWN to bring path into
+                                               usable state */
        int (*init)(struct checker *);       /* to allocate the context */
        void (*free)(struct checker *);      /* to free the context */
 };
@@ -110,11 +123,12 @@ struct checker {
 #define MSG(c, fmt, args...) snprintf((c)->message, CHECKER_MSG_LEN, fmt, ##args);
 
 char * checker_state_name (int);
-int init_checkers (void);
+int init_checkers (char *);
 void cleanup_checkers (void);
-struct checker * add_checker (char *);
+struct checker * add_checker (char *, char *);
 struct checker * checker_lookup (char *);
 int checker_init (struct checker *, void **);
+void checker_clear (struct checker *);
 void checker_put (struct checker *);
 void checker_reset (struct checker *);
 void checker_set_sync (struct checker *);
@@ -122,11 +136,18 @@ void checker_set_async (struct checker *);
 void checker_set_fd (struct checker *, int);
 void checker_enable (struct checker *);
 void checker_disable (struct checker *);
-int checker_check (struct checker *);
+void checker_repair (struct checker *);
+int checker_check (struct checker *, int);
 int checker_selected (struct checker *);
 char * checker_name (struct checker *);
 char * checker_message (struct checker *);
 void checker_clear_message (struct checker *c);
-void checker_get (struct checker *, char *);
+void checker_get (char *, struct checker *, char *);
+
+/* Functions exported by path checker dynamic libraries (.so) */
+int libcheck_check(struct checker *);
+int libcheck_init(struct checker *);
+void libcheck_free(struct checker *);
+void libcheck_repair(struct checker *);
 
 #endif /* _CHECKERS_H */