From 057fb70bf4e4b284cc06299853122273815b1d6e Mon Sep 17 00:00:00 2001 From: NeilBrown 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 --- 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