From f35f25259279573c6274e2783536c0b0a399bdd4 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Thu, 18 Sep 2008 16:01:55 +1000 Subject: Move calls to SET_ARRAY_INFO to common helper. When we assemble an array, there are three different approaches depending on whether metadata is internal or external, and on kernel version. Move all this to a common helper instead of duplicating in 3 places. Signed-off-by: NeilBrown --- util.c | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) (limited to 'util.c') diff --git a/util.c b/util.c index 7469fca4..b63251f4 100644 --- a/util.c +++ b/util.c @@ -1009,10 +1009,15 @@ int add_disk(int mdfd, struct supertype *st, rv = sysfs_add_disk(sra, info); if (! rv) { struct mdinfo *sd2; - sd2 = malloc(sizeof(*sd2)); - *sd2 = *info; - sd2->next = sra->devs; - sra->devs = sd2; + for (sd2 = sra->devs; sd2; sd2=sd2->next) + if (sd2 == info) + break; + if (sd2 == NULL) { + sd2 = malloc(sizeof(*sd2)); + *sd2 = *info; + sd2->next = sra->devs; + sra->devs = sd2; + } } } else #endif @@ -1020,6 +1025,31 @@ int add_disk(int mdfd, struct supertype *st, return rv; } +int set_array_info(int mdfd, struct supertype *st, struct mdinfo *info) +{ + /* Initialise kernel's knowledge of array. + * This varies between externally managed arrays + * and older kernels + */ + int vers = md_get_version(mdfd); + int rv; + +#ifndef MDASSEMBLE + if (st->ss->external) + rv = sysfs_set_array(info, vers); + else +#endif + if ((vers % 100) >= 1) { /* can use different versions */ + mdu_array_info_t inf; + memset(&inf, 0, sizeof(inf)); + inf.major_version = info->array.major_version; + inf.minor_version = info->array.minor_version; + rv = ioctl(mdfd, SET_ARRAY_INFO, &inf); + } else + rv = ioctl(mdfd, SET_ARRAY_INFO, NULL); + return rv; +} + char *devnum2devname(int num) { char name[100]; -- cgit v1.2.3