Hello community, here is the log from the commit of package multipath-tools for openSUSE:Factory checked in at Thu Dec 4 18:05:24 CET 2008. -------- --- multipath-tools/multipath-tools.changes 2008-11-21 14:23:37.000000000 +0100 +++ /mounts/work_src_done/STABLE/multipath-tools/multipath-tools.changes 2008-12-04 15:05:52.462619000 +0100 @@ -1,0 +2,6 @@ +Thu Dec 4 15:05:08 CET 2008 - hare@suse.de + +- Split off IBM ESS hwtable entries (bnc#439763) +- Reload map when device R/O setting changes (bnc#440959) + +------------------------------------------------------------------- calling whatdependson for head-i586 New: ---- multipath-tools-reload-map-for-ro-changes multipath-tools-split-off-IBM-ESS ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ multipath-tools.spec ++++++ --- /var/tmp/diff_new_pack.B26804/_old 2008-12-04 18:05:01.000000000 +0100 +++ /var/tmp/diff_new_pack.B26804/_new 2008-12-04 18:05:01.000000000 +0100 @@ -27,7 +27,7 @@ PreReq: %insserv_prereq %fillup_prereq coreutils grep diffutils AutoReqProv: on Version: 0.4.8 -Release: 26 +Release: 27 Summary: Tools to Manage Multipathed Devices with the device-mapper Source: multipath-tools-%{version}.tar.bz2 BuildRoot: %{_tmppath}/%{name}-%{version}-build @@ -69,6 +69,8 @@ Patch35: %{name}-allow-zero-paths Patch36: %{name}-prio-weightedpath Patch37: %{name}-crash-in-update-multipath +Patch38: %{name}-split-off-IBM-ESS +Patch39: %{name}-reload-map-for-ro-changes %description This package provides the tools to manage multipathed devices by @@ -147,6 +149,8 @@ %patch35 -p1 %patch36 -p1 %patch37 -p1 +%patch38 -p1 +%patch39 -p1 %build make OPTFLAGS="$RPM_OPT_FLAGS" @@ -208,6 +212,9 @@ %{_mandir}/man8/kpartx.8* %changelog +* Thu Dec 04 2008 hare@suse.de +- Split off IBM ESS hwtable entries (bnc#439763) +- Reload map when device R/O setting changes (bnc#440959) * Fri Nov 21 2008 hare@suse.de - Add 'Weighted Paths' prioritizer (bnc#441007) - Fix crashes in update_multipath ++++++ multipath-tools-reload-map-for-ro-changes ++++++ commit 3b88c4374cf2a204e14ffdaf85b2dbfdc4a1391a Author: Hannes Reinecke <hare@suse.de> Date: Thu Dec 4 14:20:06 2008 +0100 Reload map for device read-only setting changes Whenever the read-only setting for a device changes we have to reload the map. This patch implements the required cli command and also a uevent handler if a uevent with 'DISK_RO=' setting has been received. References: 440959 Signed-off-by: Hannes Reinecke <hare@suse.de> diff --git a/libmultipath/configure.c b/libmultipath/configure.c index 3903b28..68178c3 100644 --- a/libmultipath/configure.c +++ b/libmultipath/configure.c @@ -672,3 +672,40 @@ out: return NULL; } +extern int reload_map(struct vectors *vecs, struct multipath *mpp) +{ + char params[PARAMS_SIZE]; + int r; + + update_mpp_paths(mpp, vecs->pathvec); + + params[0] = '\0'; + if (setup_map(mpp, params, PARAMS_SIZE)) { + condlog(0, "%s: failed to setup map", mpp->alias); + return 1; + } + select_action(mpp, vecs->mpvec, 1); + + r = domap(mpp, params); + if (r == DOMAP_FAIL || r == DOMAP_RETRY) { + condlog(3, "%s: domap (%u) failure " + "for reload map", mpp->alias, r); + return 1; + } + if (mpp->no_path_retry != NO_PATH_RETRY_UNDEF) { + if (mpp->no_path_retry == NO_PATH_RETRY_FAIL) + dm_queue_if_no_path(mpp->alias, 0); + else + dm_queue_if_no_path(mpp->alias, 1); + } + if (mpp->pg_timeout != PGTIMEOUT_UNDEF) { + if (mpp->pg_timeout == -PGTIMEOUT_NONE) + dm_set_pg_timeout(mpp->alias, 0); + else + dm_set_pg_timeout(mpp->alias, mpp->pg_timeout); + } + + return 0; +} + + diff --git a/libmultipath/configure.h b/libmultipath/configure.h index ec2800d..d0c06f2 100644 --- a/libmultipath/configure.h +++ b/libmultipath/configure.h @@ -28,4 +28,5 @@ int domap (struct multipath * mpp, char * params); int reinstate_paths (struct multipath *mpp); int coalesce_paths (struct vectors *vecs, vector curmp, char * refwwid, int force_reload); char * get_refwwid (char * dev, enum devtypes dev_type, vector pathvec); +int reload_map(struct vectors *vecs, struct multipath *mpp); diff --git a/libmultipath/uevent.c b/libmultipath/uevent.c index 13986da..19a71ad 100644 --- a/libmultipath/uevent.c +++ b/libmultipath/uevent.c @@ -341,3 +341,23 @@ uevent_get_minor(struct uevent *uev) return minor; } +extern int +uevent_get_disk_ro(struct uevent *uev) +{ + char *p, *q; + int i, ro = -1; + + for (i = 0; uev->envp[i] != NULL; i++) { + if (!strncmp(uev->envp[i], "DISK_RO", 6) && strlen(uev->envp[i]) > 7) { + p = uev->envp[i] + 8; + ro = strtoul(p, &q, 10); + if (p == q) { + condlog(2, "invalid read_only setting '%s'", p); + ro = -1; + } + break; + } + } + return ro; +} + diff --git a/libmultipath/uevent.h b/libmultipath/uevent.h index 43d163b..ec6450b 100644 --- a/libmultipath/uevent.h +++ b/libmultipath/uevent.h @@ -23,5 +23,6 @@ int uevent_listen(int (*store_uev)(struct uevent *, void * trigger_data), void * trigger_data); int uevent_get_major(struct uevent *uev); int uevent_get_minor(struct uevent *uev); +int uevent_get_disk_ro(struct uevent *uev); #endif /* _UEVENT_H */ diff --git a/multipathd/cli.c b/multipathd/cli.c index 2545e89..acc8cab 100644 --- a/multipathd/cli.c +++ b/multipathd/cli.c @@ -156,6 +156,7 @@ load_keys (void) r += add_key(keys, "reinstate", REINSTATE, 0); r += add_key(keys, "fail", FAIL, 0); r += add_key(keys, "resize", RESIZE, 0); + r += add_key(keys, "reload", RELOAD, 0); r += add_key(keys, "paths", PATHS, 0); r += add_key(keys, "maps", MAPS, 0); r += add_key(keys, "multipaths", MAPS, 0); @@ -427,6 +428,8 @@ cli_init (void) { add_handler(RECONFIGURE, NULL); add_handler(SUSPEND+MAP, NULL); add_handler(RESUME+MAP, NULL); + add_handler(RESIZE+MAP, NULL); + add_handler(RELOAD+MAP, NULL); add_handler(REINSTATE+PATH, NULL); add_handler(FAIL+PATH, NULL); diff --git a/multipathd/cli.h b/multipathd/cli.h index be14395..1fa4862 100644 --- a/multipathd/cli.h +++ b/multipathd/cli.h @@ -8,6 +8,7 @@ enum { __REINSTATE, __FAIL, __RESIZE, + __RELOAD, __PATHS, __MAPS, __PATH, @@ -33,6 +34,7 @@ enum { #define REINSTATE (1 << __REINSTATE) #define FAIL (1 << __FAIL) #define RESIZE (1 << __RESIZE) +#define RELOAD (1 << __RELOAD) #define PATHS (1 << __PATHS) #define MAPS (1 << __MAPS) #define PATH (1 << __PATH) diff --git a/multipathd/cli_handlers.c b/multipathd/cli_handlers.c index 4f639b6..819dd87 100644 --- a/multipathd/cli_handlers.c +++ b/multipathd/cli_handlers.c @@ -460,6 +460,28 @@ out: return err; } +int +cli_reload(void *v, char **reply, int *len, void *data) +{ + struct vectors * vecs = (struct vectors *)data; + char * mapname = get_keyparam(v, MAP); + struct multipath *mpp; + int minor; + + condlog(2, "%s: reload map (operator)", mapname); + if (sscanf(mapname, "dm-%d", &minor) == 1) + mpp = find_mp_by_minor(vecs->mpvec, minor); + else + mpp = find_mp_by_alias(vecs->mpvec, mapname); + + if (!mpp) { + condlog(0, "%s: invalid map name. cannot reload", mapname); + return 1; + } + + return reload_map(vecs, mpp); +} + int resize_map(struct multipath *mpp, unsigned long long size, struct vectors * vecs) { diff --git a/multipathd/cli_handlers.h b/multipathd/cli_handlers.h index b65f259..6e92a07 100644 --- a/multipathd/cli_handlers.h +++ b/multipathd/cli_handlers.h @@ -17,6 +17,7 @@ int cli_del_map (void * v, char ** reply, int * len, void * data); int cli_switch_group(void * v, char ** reply, int * len, void * data); int cli_reconfigure(void * v, char ** reply, int * len, void * data); int cli_resize(void * v, char ** reply, int * len, void * data); +int cli_reload(void * v, char ** reply, int * len, void * data); int cli_suspend(void * v, char ** reply, int * len, void * data); int cli_resume(void * v, char ** reply, int * len, void * data); int cli_reinstate(void * v, char ** reply, int * len, void * data); diff --git a/multipathd/main.c b/multipathd/main.c index 444494e..c60d075 100644 --- a/multipathd/main.c +++ b/multipathd/main.c @@ -572,6 +572,43 @@ out: } static int +uev_update_path (struct uevent *uev, struct vectors * vecs) +{ + struct sysfs_device * dev; + int retval, ro; + + dev = sysfs_device_get(uev->devpath); + if (!dev) { + condlog(2, "%s: not found in sysfs", uev->devpath); + return 1; + } + ro = uevent_get_disk_ro(uev); + + if (ro >= 0) { + struct path * pp; + + condlog(2, "%s: update path write_protect to '%d' (uevent)", + uev->kernel, ro); + pp = find_path_by_dev(vecs->pathvec, uev->kernel); + if (!pp) { + condlog(0, "%s: spurious uevent, path not found", + uev->kernel); + return 1; + } + if (pp->mpp) + retval = reload_map(vecs, pp->mpp); + + condlog(2, "%s: map %s reloaded (retval %d)", + uev->kernel, pp->mpp->alias, retval); + + } + + sysfs_device_put(dev); + + return retval; +} + +static int map_discovery (struct vectors * vecs) { struct multipath * mpp; @@ -688,6 +725,10 @@ uev_trigger (struct uevent * uev, void * trigger_data) r = uev_remove_path(uev, vecs); goto out; } + if (!strncmp(uev->action, "change", 6)) { + r = uev_update_path(uev, vecs); + goto out; + } out: unlock(vecs->lock); @@ -731,6 +772,7 @@ uxlsnrloop (void * ap) set_handler_callback(SUSPEND+MAP, cli_suspend); set_handler_callback(RESUME+MAP, cli_resume); set_handler_callback(RESIZE+MAP, cli_resize); + set_handler_callback(RELOAD+MAP, cli_reload); set_handler_callback(REINSTATE+PATH, cli_reinstate); set_handler_callback(FAIL+PATH, cli_fail); ++++++ multipath-tools-split-off-IBM-ESS ++++++ commit 38a29e437712a01dcb027371a948b110cd54196e Author: Hannes Reinecke <hare@suse.de> Date: Wed Dec 3 10:38:04 2008 +0100 Split off IBM ESS entries For some reason the regular expression doesn't work properly. So split off the two entries. References: bnc#439763 Signed-off-by: Hannes Reinecke <hare@suse.de> diff --git a/libmultipath/hwtable.c b/libmultipath/hwtable.c index bf8c611..d742d6d 100644 --- a/libmultipath/hwtable.c +++ b/libmultipath/hwtable.c @@ -507,7 +507,23 @@ static struct hwentry default_hw[] = { { /* IBM ESS F20 aka Shark */ .vendor = "IBM", - .product = "2105(800|F20)", + .product = "2105800", + .getuid = DEFAULT_GETUID, + .features = "1 queue_if_no_path", + .hwhandler = DEFAULT_HWHANDLER, + .selector = DEFAULT_SELECTOR, + .pgpolicy = GROUP_BY_SERIAL, + .pgfailback = FAILBACK_UNDEF, + .rr_weight = RR_WEIGHT_NONE, + .no_path_retry = NO_PATH_RETRY_UNDEF, + .minio = DEFAULT_MINIO, + .checker_name = TUR, + .prio_name = DEFAULT_PRIO, + }, + { + /* IBM ESS F20 aka Shark */ + .vendor = "IBM", + .product = "2105F20", .getuid = DEFAULT_GETUID, .features = "1 queue_if_no_path", .hwhandler = DEFAULT_HWHANDLER, ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Remember to have fun... -- To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-commit+help@opensuse.org