---
libmultipath/devmapper.c | 10 ++++++----
libmultipath/structs.h | 1 +
multipathd/main.c | 5 +++--
3 files changed, 10 insertions(+), 6 deletions(-)
Index: multipath-tools-130222/libmultipath/devmapper.c
===================================================================
--- multipath-tools-130222.orig/libmultipath/devmapper.c
+++ multipath-tools-130222/libmultipath/devmapper.c
@@ -358,10 +358,12 @@ dm_addmap_create (struct multipath *mpp,
extern int
dm_addmap_reload (struct multipath *mpp, char *params) {
sysfs_set_max_sectors_kb(mpp, 1);
- if (dm_addmap(DM_DEVICE_RELOAD, TGT_MPATH, mpp, params, 0, ADDMAP_RW, SKIP_KPARTX_OFF))
- return 1;
- if (errno != EROFS)
- return 0;
+ 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)
+ return 0;
+ }
return dm_addmap(DM_DEVICE_RELOAD, TGT_MPATH, mpp, params, 0, ADDMAP_RO, SKIP_KPARTX_OFF);
}
Index: multipath-tools-130222/libmultipath/structs.h
===================================================================
--- multipath-tools-130222.orig/libmultipath/structs.h
+++ multipath-tools-130222/libmultipath/structs.h
@@ -259,6 +259,7 @@ struct multipath {
int force_udev_reload;
int skip_kpartx;
int max_sectors_kb;
+ int force_readonly;
unsigned int dev_loss;
uid_t uid;
gid_t gid;
Index: multipath-tools-130222/multipathd/main.c
===================================================================
--- multipath-tools-130222.orig/multipathd/main.c
+++ multipath-tools-130222/multipathd/main.c
@@ -831,9 +831,10 @@ uev_update_path (struct uevent *uev, str
pp->mpp->wait_for_udev = 2;
return 0;
}
-
+ if (ro == 1)
+ pp->mpp->force_readonly = 1;
retval = reload_map(vecs, pp->mpp, 0);
-
+ pp->mpp->force_readonly = 0;
condlog(2, "%s: map %s reloaded (retval %d)",
uev->kernel, pp->mpp->alias, retval);
}