diff --git a/multipath-fix.patch b/multipath-fix.patch deleted file mode 100644 index 1b441ef..0000000 --- a/multipath-fix.patch +++ /dev/null @@ -1,13 +0,0 @@ -Index: kpartx/kpartx.c -=================================================================== ---- kpartx/kpartx.c.orig -+++ kpartx/kpartx.c -@@ -578,7 +578,7 @@ main(int argc, char **argv){ - continue; - - if (!dm_simplecmd(DM_DEVICE_REMOVE, -- partname)) { -+ partname, 1)) { - r++; - continue; - } diff --git a/multipath-tools-0.4.8-opensuse-11.2.diff.bz2 b/multipath-tools-0.4.8-opensuse-11.2.diff.bz2 index e55f7ec..b2535b6 100644 --- a/multipath-tools-0.4.8-opensuse-11.2.diff.bz2 +++ b/multipath-tools-0.4.8-opensuse-11.2.diff.bz2 @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:507361270bd9d1c703a265834334ba5d39f3d2d4677dd531ab23611c845fb381 -size 131381 +oid sha256:6ee2872ba8dd45be1f365c3e1cc76fc1e4294eca617e6830cf9a51b60173403b +size 131574 diff --git a/multipath-tools.changes b/multipath-tools.changes index 1d98954..0636dff 100644 --- a/multipath-tools.changes +++ b/multipath-tools.changes @@ -1,3 +1,14 @@ +------------------------------------------------------------------- +Wed Jan 27 16:16:12 CST 2010 - cmeng@novell.com + +- Fix 'multipath -F' can't remove logical partitions (bnc#551827) + +------------------------------------------------------------------- +Thu Oct 22 16:29:35 CEST 2009 - hare@suse.de + +- Make 'param' local (bnc#548708) +- Include multipath-fix.patch in git tree. + ------------------------------------------------------------------- Tue Sep 8 20:56:53 UTC 2009 - aj@suse.de diff --git a/multipath-tools.spec b/multipath-tools.spec index 231aef5..2a7c4cf 100644 --- a/multipath-tools.spec +++ b/multipath-tools.spec @@ -27,12 +27,12 @@ Requires: device-mapper kpartx PreReq: %insserv_prereq %fillup_prereq coreutils grep AutoReqProv: on Version: 0.4.8 -Release: 43 +Release: 44. Summary: Tools to Manage Multipathed Devices with the device-mapper Source: multipath-tools-%{version}.tar.bz2 BuildRoot: %{_tmppath}/%{name}-%{version}-build Patch0: %{name}-%{version}-opensuse-11.2.diff.bz2 -Patch1: multipath-fix.patch +Patch1: remove-stacked-partitions.diff %description This package provides the tools to manage multipathed devices by @@ -74,7 +74,7 @@ Authors: %prep %setup -q -n multipath-tools-%{version} %patch0 -p1 -%patch1 +%patch1 -p1 %build # This package failed when testing with -Wl,-as-needed being default. diff --git a/remove-stacked-partitions.diff b/remove-stacked-partitions.diff new file mode 100644 index 0000000..aac78bc --- /dev/null +++ b/remove-stacked-partitions.diff @@ -0,0 +1,104 @@ +Index: multipath-tools-0.4.8/libmultipath/devmapper.c +=================================================================== +--- multipath-tools-0.4.8.orig/libmultipath/devmapper.c ++++ multipath-tools-0.4.8/libmultipath/devmapper.c +@@ -912,6 +912,60 @@ bad: + return NULL; + } + ++dm_get_full_uuid(char *name, char *uuid) ++{ ++ struct dm_task *dmt; ++ const char *uuidtmp; ++ int r = 1; ++ ++ dmt = dm_task_create(DM_DEVICE_INFO); ++ if (!dmt) ++ return 1; ++ ++ if (!dm_task_set_name (dmt, name)) ++ goto uuidout; ++ ++ if (!dm_task_run(dmt)) ++ goto uuidout; ++ ++ uuidtmp = dm_task_get_uuid(dmt); ++ if (uuidtmp) { ++ strcpy(uuid, uuidtmp); ++ } ++ else ++ uuid[0] = '\0'; ++ ++ r = 0; ++uuidout: ++ dm_task_destroy(dmt); ++ return r; ++} ++ ++/* ++ * returns: ++ * 0 : if both uuids end with same suffix which starts with UUID_PREFIX ++ * 1 : otherwise ++ */ ++int ++dm_compare_uuid(const char* mapname1, const char* mapname2) ++{ ++ char *p1, *p2; ++ char uuid1[WWID_SIZE], uuid2[WWID_SIZE]; ++ ++ if (dm_get_full_uuid(mapname1, uuid1)) ++ return 1; ++ ++ if (dm_get_full_uuid(mapname2, uuid2)) ++ return 1; ++ ++ p1 = strstr(uuid1, UUID_PREFIX); ++ p2 = strstr(uuid2, UUID_PREFIX); ++ if (p1 && p2 && !strcmp(p1, p2)) ++ return 0; ++ ++ return 1; ++} ++ + int + dm_remove_partmaps (const char * mapname) + { +@@ -950,15 +1004,10 @@ dm_remove_partmaps (const char * mapname + (dm_type(names->name, TGT_PART) > 0) && + + /* +- * and the multipath mapname and the part mapname start +- * the same ++ * and the both uuid end with same suffix which ++ * starts with UUID_PREFIX + */ +- !strncmp(names->name, mapname, strlen(mapname)) && +- +- /* +- * and the opencount is 0 for us to allow removal +- */ +- !dm_get_opencount(names->name) && ++ !dm_compare_uuid(names->name, mapname) && + + /* + * and we can fetch the map table from the kernel +@@ -974,6 +1023,19 @@ dm_remove_partmaps (const char * mapname + * then it's a kpartx generated partition. + * remove it. + */ ++ ++ /* ++ * if the opencount is not 0, maybe some other ++ * partitons depend on it. ++ */ ++ if (dm_get_opencount(names->name)) { ++ dm_remove_partmaps(names->name); ++ if (dm_get_opencount(names->name)) { ++ condlog(2, "%s: map in use", names->name); ++ goto out; ++ } ++ } ++ + condlog(4, "partition map %s removed", + names->name); + dm_simplecmd_flush(DM_DEVICE_REMOVE, names->name);