You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
149 lines
4.7 KiB
149 lines
4.7 KiB
--- |
|
libmultipath/configure.c | 18 +++------------ |
|
libmultipath/devmapper.c | 55 +++++++++++++++++++++++++++++++++++++++++------ |
|
libmultipath/devmapper.h | 3 +- |
|
3 files changed, 55 insertions(+), 21 deletions(-) |
|
|
|
Index: multipath-tools-130222/libmultipath/configure.c |
|
=================================================================== |
|
--- multipath-tools-130222.orig/libmultipath/configure.c |
|
+++ multipath-tools-130222/libmultipath/configure.c |
|
@@ -616,7 +616,6 @@ extern int |
|
domap (struct multipath * mpp, char * params) |
|
{ |
|
int r = 0; |
|
- uint16_t udev_flags = ((mpp->force_udev_reload)? 0 : MPATH_UDEV_RELOAD_FLAG) | ((mpp->skip_kpartx == SKIP_KPARTX_ON)? MPATH_UDEV_NO_KPARTX_FLAG : 0) | ((mpp->nr_active)? 0 : MPATH_UDEV_NO_PATHS_FLAG); |
|
|
|
/* |
|
* last chance to quit before touching the devmaps |
|
@@ -660,17 +659,11 @@ domap (struct multipath * mpp, char * pa |
|
break; |
|
|
|
case ACT_RELOAD: |
|
- r = dm_addmap_reload(mpp, params); |
|
- if (r) |
|
- r = dm_simplecmd_noflush(DM_DEVICE_RESUME, mpp->alias, |
|
- udev_flags); |
|
+ r = dm_addmap_reload(mpp, params, 0); |
|
break; |
|
|
|
case ACT_RESIZE: |
|
- r = dm_addmap_reload(mpp, params); |
|
- if (r) |
|
- r = dm_simplecmd_flush(DM_DEVICE_RESUME, mpp->alias, 1, |
|
- udev_flags); |
|
+ r = dm_addmap_reload(mpp, params, 1); |
|
break; |
|
|
|
case ACT_RENAME: |
|
@@ -679,11 +672,8 @@ domap (struct multipath * mpp, char * pa |
|
|
|
case ACT_RENAME2: |
|
r = dm_rename(mpp->alias_old, mpp->alias, mpp->skip_kpartx); |
|
- if (r) { |
|
- r = dm_addmap_reload(mpp, params); |
|
- if (r) |
|
- r = dm_simplecmd_noflush(DM_DEVICE_RESUME, mpp->alias, udev_flags); |
|
- } |
|
+ if (r) |
|
+ r = dm_addmap_reload(mpp, params, 0); |
|
break; |
|
|
|
default: |
|
Index: multipath-tools-130222/libmultipath/devmapper.c |
|
=================================================================== |
|
--- multipath-tools-130222.orig/libmultipath/devmapper.c |
|
+++ multipath-tools-130222/libmultipath/devmapper.c |
|
@@ -356,15 +356,33 @@ dm_addmap_create (struct multipath *mpp, |
|
#define ADDMAP_RO 1 |
|
|
|
extern int |
|
-dm_addmap_reload (struct multipath *mpp, char *params) { |
|
+dm_addmap_reload (struct multipath *mpp, char *params, int flush) { |
|
+ int r = 0; |
|
+ uint16_t udev_flags = ((mpp->force_udev_reload)? |
|
+ 0 : MPATH_UDEV_RELOAD_FLAG) | |
|
+ ((mpp->skip_kpartx == SKIP_KPARTX_ON)? |
|
+ MPATH_UDEV_NO_KPARTX_FLAG : 0) | |
|
+ ((mpp->nr_active)? 0 : MPATH_UDEV_NO_PATHS_FLAG); |
|
+ |
|
sysfs_set_max_sectors_kb(mpp, 1); |
|
- if (!mpp->force_readonly) { |
|
- if (dm_addmap(DM_DEVICE_RELOAD, TGT_MPATH, mpp, params, 0, ADDMAP_RW, SKIP_KPARTX_OFF)) |
|
- return 1; |
|
- if (errno != EROFS) |
|
+ if (!mpp->force_readonly) |
|
+ r = dm_addmap(DM_DEVICE_RELOAD, TGT_MPATH, mpp, params, 0, |
|
+ ADDMAP_RW, SKIP_KPARTX_OFF); |
|
+ if (!r) { |
|
+ if (!mpp->force_readonly && errno != EROFS) |
|
return 0; |
|
+ r = dm_addmap(DM_DEVICE_RELOAD, TGT_MPATH, mpp, params, 0, |
|
+ ADDMAP_RO, SKIP_KPARTX_OFF); |
|
} |
|
- return dm_addmap(DM_DEVICE_RELOAD, TGT_MPATH, mpp, params, 0, ADDMAP_RO, SKIP_KPARTX_OFF); |
|
+ if (r) |
|
+ r = dm_simplecmd(DM_DEVICE_RESUME, mpp->alias, !flush, |
|
+ 1, udev_flags, 0); |
|
+ if (r) |
|
+ return r; |
|
+ if (dm_is_suspended(mpp->alias)) |
|
+ dm_simplecmd(DM_DEVICE_RESUME, mpp->alias, !flush, 1, |
|
+ udev_flags, 0); |
|
+ return 0; |
|
} |
|
|
|
extern int |
|
@@ -613,6 +631,31 @@ dm_is_mpath(const char * name) |
|
out: |
|
dm_task_destroy(dmt); |
|
return r; |
|
+} |
|
+ |
|
+int |
|
+dm_is_suspended(const char *mapname) |
|
+{ |
|
+ int r = -1; |
|
+ struct dm_task *dmt; |
|
+ struct dm_info info; |
|
+ |
|
+ if (!(dmt = dm_task_create(DM_DEVICE_INFO))) |
|
+ return r; |
|
+ |
|
+ if (!dm_task_set_name(dmt, mapname)) |
|
+ goto out; |
|
+ |
|
+ if (!dm_task_run(dmt)) |
|
+ goto out; |
|
+ |
|
+ if (!dm_task_get_info(dmt, &info) || !info.exists) |
|
+ goto out; |
|
+ |
|
+ r = info.suspended; |
|
+out: |
|
+ dm_task_destroy(dmt); |
|
+ return r; |
|
} |
|
|
|
static int |
|
Index: multipath-tools-130222/libmultipath/devmapper.h |
|
=================================================================== |
|
--- multipath-tools-130222.orig/libmultipath/devmapper.h |
|
+++ multipath-tools-130222/libmultipath/devmapper.h |
|
@@ -30,7 +30,7 @@ int dm_drv_version (unsigned int * versi |
|
int dm_simplecmd_flush (int, const char *, int, uint16_t); |
|
int dm_simplecmd_noflush (int, const char *, uint16_t); |
|
int dm_addmap_create (struct multipath *mpp, char *params); |
|
-int dm_addmap_reload (struct multipath *mpp, char *params); |
|
+int dm_addmap_reload (struct multipath *mpp, char *params, int flush); |
|
int dm_map_present (const char *); |
|
int dm_get_map(const char *, unsigned long long *, char *); |
|
int dm_get_status(char *, char *); |
|
@@ -51,6 +51,7 @@ int dm_switchgroup(char * mapname, int i |
|
int dm_enablegroup(char * mapname, int index); |
|
int dm_disablegroup(char * mapname, int index); |
|
int dm_get_maps (vector mp); |
|
+int dm_is_suspended(const char *mapname); |
|
int dm_geteventnr (char *name); |
|
int dm_get_major (char *name); |
|
int dm_get_minor (char *name);
|
|
|