libmultipath: fix suspended devs from failed reloads
authorBenjamin Marzinski <bmarzins@redhat.com>
Tue, 9 May 2017 16:57:03 +0000 (11:57 -0500)
committerChristophe Varoqui <christophe.varoqui@opensvc.com>
Wed, 17 May 2017 22:01:51 +0000 (00:01 +0200)
When multipath reloads a device, it can either fail while loading the
new table or while resuming the device. If it fails while resuming the
device, the device can get stuck in the suspended state.  To fix this,
multipath needs to resume the device again so that it can continue using
the old table.

Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
libmultipath/devmapper.c
libmultipath/devmapper.h

index 2c4a13a..69b634b 100644 (file)
@@ -396,7 +396,13 @@ int dm_addmap_reload(struct multipath *mpp, char *params, int flush)
        if (r)
                r = dm_simplecmd(DM_DEVICE_RESUME, mpp->alias, !flush,
                                 1, udev_flags, 0);
-       return r;
+       if (r)
+               return r;
+
+       if (dm_is_suspended(mpp->alias))
+               dm_simplecmd(DM_DEVICE_RESUME, mpp->alias, !flush, 1,
+                            udev_flags, 0);
+       return 0;
 }
 
 static int
@@ -1030,6 +1036,17 @@ dm_geteventnr (char *name)
        return info.event_nr;
 }
 
+int
+dm_is_suspended(const char *name)
+{
+       struct dm_info info;
+
+       if (do_get_info(name, &info) != 0)
+               return -1;
+
+       return info.suspended;
+}
+
 char *
 dm_mapname(int major, int minor)
 {
index 5b66865..fa739bc 100644 (file)
@@ -52,6 +52,7 @@ int dm_enablegroup(char * mapname, int index);
 int dm_disablegroup(char * mapname, int index);
 int dm_get_maps (vector mp);
 int dm_geteventnr (char *name);
+int dm_is_suspended(const char *name);
 int dm_get_major_minor (const char *name, int *major, int *minor);
 char * dm_mapname(int major, int minor);
 int dm_remove_partmaps (const char * mapname, int need_sync,