File Start-kpartx-for-imsm-devices.patch of Package mdadm

From 057fb70bf4e4b284cc06299853122273815b1d6e Mon Sep 17 00:00:00 2001
From: NeilBrown <neilb@suse.de>
Date: Fri, 7 Nov 2008 22:22:41 +1100
Subject: [PATCH] Start kpartx for imsm devices.

This probably wont get into mainline, but is need on SLES
to create partitions that the YaST partitioner has a chance
of recognising.

Signed-off-by: NeilBrown <neilb@suse.de>
---
 Assemble.c    |    4 +++-
 Create.c      |    3 +++
 Manage.c      |    4 ++++
 mdadm.h       |    1 +
 super-intel.c |    2 +-
 util.c        |   25 +++++++++++++++++++++++++
 6 files changed, 37 insertions(+), 2 deletions(-)

diff --git a/Assemble.c b/Assemble.c
index 20c4be7..c597526 100644
--- a/Assemble.c
+++ b/Assemble.c
@@ -1251,8 +1251,10 @@ int assemble_container_content(struct supertype *st, int mdfd,
 				fprintf(stderr, " (%d new)", working);
 			fprintf(stderr, "\n");
 		}
-		wait_for(chosen_name);
 		close(mdfd);
+		wait_for(chosen_name);
+		if (st->ss->match_metadata_desc("imsm"))
+			run_kpartx('a', chosen_name);
 		return 0;
 		/* FIXME should have an O_EXCL and wait for read-auto */
 	} else {
diff --git a/Create.c b/Create.c
index 783ab09..4368107 100644
--- a/Create.c
+++ b/Create.c
@@ -780,7 +780,10 @@ int Create(struct supertype *st, char *mddev,
 			ping_monitor(devnum2devname(st->container_dev));
 			close(container_fd);
 		}
+		close(mdfd);
 		wait_for(chosen_name);
+		if (st->ss->match_metadata_desc("imsm"))
+			run_kpartx('a', chosen_name);
 	} else {
 		fprintf(stderr, Name ": not starting array - not enough devices.\n");
 	}
diff --git a/Manage.c b/Manage.c
index 9424650..06f9e05 100644
--- a/Manage.c
+++ b/Manage.c
@@ -219,8 +219,12 @@ int Manage_runstop(char *devname, int fd, int runstop, int quiet)
 		if (mdi &&
 		    mdi->array.level > 0 &&
 		    is_subarray(mdi->text_version)) {
+			struct map_ent *me = map_by_devnum(&map, devnum);
 			/* This is mdmon managed. */
 			close(fd);
+			
+			/* Delete any kpartx partitions */
+			run_kpartx('d', me->path);
 			if (sysfs_set_str(mdi, NULL,
 					  "array_state", "inactive") < 0) {
 				if (quiet == 0)
diff --git a/mdadm.h b/mdadm.h
index 2b34acf..9d819f9 100644
--- a/mdadm.h
+++ b/mdadm.h
@@ -833,6 +833,7 @@ extern char *devnum2devname(int num);
 extern int devname2devnum(char *name);
 extern int stat2devnum(struct stat *st);
 extern int fd2devnum(int fd);
+extern void run_kpartx(char mode, char *dev);
 
 static inline int dev2major(int d)
 {
diff --git a/super-intel.c b/super-intel.c
index a2b9bd2..5f06f30 100644
--- a/super-intel.c
+++ b/super-intel.c
@@ -636,7 +636,7 @@ static void brief_examine_super_imsm(struct supertype *st)
 		getinfo_super_imsm(st, &info);
 		fname_from_uuid(st, &info, nbuf1,'-');
 		printf("ARRAY /dev/md/%.16s container=%s\n"
-		       "   member=%d auto=mdp UUID=%s\n",
+		       "   member=%d auto=md UUID=%s\n",
 		       dev->volume, nbuf + 5, i, nbuf1 + 5);
 	}
 }
diff --git a/util.c b/util.c
index 8845a0f..f21d2bb 100644
--- a/util.c
+++ b/util.c
@@ -1327,6 +1327,31 @@ void append_metadata_update(struct supertype *st, void *buf, int len)
 }
 #endif /* MDASSEMBLE */
 
+void run_kpartx(char mode, char *dev)
+{
+	char buf[1024];
+	char *cp;
+
+	sprintf(buf, "/sbin/kpartx > /dev/null 2>&1 -%c '", mode);
+
+	cp = buf + strlen(buf);
+	while (cp < buf+sizeof(buf)-10 &&
+	       *dev) {
+		if (*dev == '\'') {
+			*cp++ = '\'';
+			*cp++ = '\\';
+			*cp++ = '\'';
+			/* *cp++ = '\''; */
+		}
+		*cp ++ = *dev++;
+	}
+	*cp++ = '\'';
+	*cp++ = 0;
+	system(buf);
+}
+	
+
+
 #ifdef __TINYC__
 /* tinyc doesn't optimize this check in ioctl.h out ... */
 unsigned int __invalid_size_argument_for_IOC = 0;
-- 
1.5.6.5

openSUSE Build Service is sponsored by