This flag can used to avoid any IO on the device itself. Useful
for getting the path state without the risk of hanging or running
into IO errors.

Signed-off-by: Martin Wilck <[email protected]>
---
 libmultipath/discovery.c | 8 ++++++++
 libmultipath/discovery.h | 2 ++
 2 files changed, 10 insertions(+)

diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c
index 3a912d76..0ff2faa7 100644
--- a/libmultipath/discovery.c
+++ b/libmultipath/discovery.c
@@ -1926,6 +1926,14 @@ int pathinfo(struct path *pp, struct config *conf, int 
mask)
        path_state = path_offline(pp);
        if (path_state == PATH_REMOVED)
                goto blank;
+       else if (mask & DI_NOIO) {
+               /*
+                * Avoid any IO on the device itself.
+                * Behave like DI_CHECKER in the "path unavailable" case.
+                */
+               pp->chkrstate = pp->state = path_state;
+               return PATHINFO_OK;
+       }
 
        /*
         * fetch info not available through sysfs
diff --git a/libmultipath/discovery.h b/libmultipath/discovery.h
index 51c23d6f..65352881 100644
--- a/libmultipath/discovery.h
+++ b/libmultipath/discovery.h
@@ -62,6 +62,7 @@ enum discovery_mode {
        __DI_PRIO,
        __DI_WWID,
        __DI_BLACKLIST,
+       __DI_NOIO,
 };
 
 #define DI_SYSFS       (1 << __DI_SYSFS)
@@ -70,6 +71,7 @@ enum discovery_mode {
 #define DI_PRIO                (1 << __DI_PRIO)
 #define DI_WWID                (1 << __DI_WWID)
 #define DI_BLACKLIST   (1 << __DI_BLACKLIST)
+#define DI_NOIO                (1 << __DI_NOIO) /* Avoid IO on the device */
 
 #define DI_ALL         (DI_SYSFS  | DI_SERIAL | DI_CHECKER | DI_PRIO | \
                         DI_WWID)
-- 
2.14.0

--
dm-devel mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/dm-devel

Reply via email to