summaryrefslogtreecommitdiffstats
path: root/0103-RH-cleanup-partmaps-code.patch
diff options
context:
space:
mode:
Diffstat (limited to '0103-RH-cleanup-partmaps-code.patch')
-rw-r--r--0103-RH-cleanup-partmaps-code.patch199
1 files changed, 199 insertions, 0 deletions
diff --git a/0103-RH-cleanup-partmaps-code.patch b/0103-RH-cleanup-partmaps-code.patch
new file mode 100644
index 0000000..57fb402
--- /dev/null
+++ b/0103-RH-cleanup-partmaps-code.patch
@@ -0,0 +1,199 @@
+---
+ libmultipath/devmapper.c | 155 ++++++++++++++++++-----------------------------
+ 1 file changed, 61 insertions(+), 94 deletions(-)
+
+Index: multipath-tools-130222/libmultipath/devmapper.c
+===================================================================
+--- multipath-tools-130222.orig/libmultipath/devmapper.c
++++ multipath-tools-130222/libmultipath/devmapper.c
+@@ -1006,8 +1006,9 @@ bad:
+ return NULL;
+ }
+
+-int
+-dm_remove_partmaps (const char * mapname, int need_sync)
++static int
++do_foreach_partmaps (const char * mapname, int (*partmap_func)(char *, void *),
++ void *data)
+ {
+ struct dm_task *dmt;
+ struct dm_names *names;
+@@ -1059,26 +1060,8 @@ dm_remove_partmaps (const char * mapname
+ */
+ strstr(params, dev_t)
+ ) {
+- /*
+- * then it's a kpartx generated partition.
+- * remove it.
+- */
+- /*
+- * if the opencount is 0 maybe some other
+- * partitions depend on it.
+- */
+- if (dm_get_opencount(names->name)) {
+- dm_remove_partmaps(names->name, need_sync);
+- 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,
+- need_sync, 0);
++ if (partmap_func(names->name, data) != 0)
++ goto out;
+ }
+
+ next = names->next;
+@@ -1091,6 +1074,35 @@ out:
+ return r;
+ }
+
++struct remove_data {
++ int need_sync;
++};
++
++static int
++remove_partmap(char *name, void *data)
++{
++ struct remove_data *rd = (struct remove_data *)data;
++
++ if (dm_get_opencount(name)) {
++ dm_remove_partmaps(name, rd->need_sync);
++ if (dm_get_opencount(name)) {
++ condlog(2, "%s: map in use", name);
++ return 1;
++ }
++ }
++ condlog(4, "partition map %s removed", name);
++ dm_simplecmd_flush(DM_DEVICE_REMOVE, name,
++ rd->need_sync, 0);
++ return 0;
++}
++
++int
++dm_remove_partmaps (const char * mapname, int need_sync)
++{
++ struct remove_data rd = { need_sync };
++ return do_foreach_partmaps(mapname, remove_partmap, &rd);
++}
++
+ static struct dm_info *
+ alloc_dminfo (void)
+ {
+@@ -1140,86 +1152,41 @@ out:
+ return r;
+ }
+
+-int
+-dm_rename_partmaps (char * old, char * new)
++struct rename_data {
++ char *old;
++ char *new;
++ char *delim;
++};
++
++static int
++rename_partmap (char *name, void *data)
+ {
+- struct dm_task *dmt;
+- struct dm_names *names;
+- unsigned next = 0;
+ char buff[PARAMS_SIZE];
+- unsigned long long size;
+- char dev_t[32];
+- int r = 1;
+ int offset;
+- char *delim;
+-
+- if (!(dmt = dm_task_create(DM_DEVICE_LIST)))
+- return 1;
++ struct rename_data *rd = (struct rename_data *)data;
+
+- dm_task_no_open_count(dmt);
+-
+- if (!dm_task_run(dmt))
+- goto out;
+-
+- if (!(names = dm_task_get_names(dmt)))
+- goto out;
+-
+- if (!names->dev) {
+- r = 0; /* this is perfectly valid */
+- goto out;
+- }
++ if (strncmp(name, rd->old, strlen(rd->old)) != 0)
++ return 0;
++ for (offset = strlen(rd->old); name[offset] && !(isdigit(name[offset])); offset++); /* do nothing */
++ snprintf(buff, PARAMS_SIZE, "%s%s%s", rd->new, rd->delim,
++ name + offset);
++ dm_rename(name, buff);
++ condlog(4, "partition map %s renamed", name);
++ return 0;
++}
+
+- if (dm_dev_t(old, &dev_t[0], 32))
+- goto out;
++int
++dm_rename_partmaps (char * old, char * new)
++{
++ struct rename_data rd;
+
++ rd.old = old;
++ rd.new = new;
+ if (isdigit(new[strlen(new)-1]))
+- delim = "p";
++ rd.delim = "p";
+ else
+- delim = "";
+-
+- do {
+- if (
+- /*
+- * if devmap target is "linear"
+- */
+- (dm_type(names->name, TGT_PART) > 0) &&
+-
+- /*
+- * and the multipath mapname and the part mapname start
+- * the same
+- */
+- !strncmp(names->name, old, strlen(old)) &&
+-
+- /*
+- * and we can fetch the map table from the kernel
+- */
+- !dm_get_map(names->name, &size, &buff[0]) &&
+-
+- /*
+- * and the table maps over the multipath map
+- */
+- strstr(buff, dev_t)
+- ) {
+- /*
+- * then it's a kpartx generated partition.
+- * Rename it.
+- */
+- for (offset = strlen(old); names->name[offset] && !(isdigit(names->name[offset])); offset++); /* do nothing */
+- snprintf(buff, PARAMS_SIZE, "%s%s%s",
+- new, delim, names->name + offset);
+- dm_rename(names->name, buff);
+- condlog(4, "partition map %s renamed",
+- names->name);
+- }
+-
+- next = names->next;
+- names = (void *) names + next;
+- } while (next);
+-
+- r = 0;
+-out:
+- dm_task_destroy (dmt);
+- return r;
++ rd.delim = "";
++ return do_foreach_partmaps(old, rename_partmap, &rd);
+ }
+
+ int