>From 904cdb060dadb748b264dc99585f44065b3e66c9 Mon Sep 17 00:00:00 2001 From: Anna Czarnowska <anna.czarnowska@xxxxxxxxx> Date: Tue, 28 Sep 2010 07:43:40 +0200 Subject: [AUTOREBUILD 5/8] imsm: create mdinfo list of disks in a container from supertype If getinfo_super is called on a container supertype we only get information on first disk. As a parameter it uses reference to preallocated mdinfo structure. Amending getinfo_super to return full list of disks would require amending all previous calls and subsequently freeing memory allocated for mdinfo list. As an alternative a new function getinfo_super_disks is created to obtain information about all disks in container. Existing function sysfs_free is used to free memory allocated by getinfo_super_disks. Signed-off-by: Anna Czarnowska <anna.czarnowska@xxxxxxxxx> Signed-off-by: Marcin Labun <marcin.labun@xxxxxxxxx> --- mdadm.h | 2 +- super-intel.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletions(-) diff --git a/mdadm.h b/mdadm.h index 56452bb..ca4b12b 100644 --- a/mdadm.h +++ b/mdadm.h @@ -546,7 +546,7 @@ extern struct superswitch { * The device the metadata was loaded from by load_super */ void (*getinfo_super)(struct supertype *st, struct mdinfo *info); - + struct mdinfo *(*getinfo_super_disks)(struct supertype *st); /* Check if the given metadata is flagged as belonging to "this" * host. 0 for 'no', 1 for 'yes', -1 for "Don't record homehost" */ diff --git a/super-intel.c b/super-intel.c index 38d0ae3..02480f2 100644 --- a/super-intel.c +++ b/super-intel.c @@ -1666,6 +1666,58 @@ static void getinfo_super_imsm(struct supertype *st, struct mdinfo *info) } } +/* allocates memory and fills disk in mdinfo structure + * for each disk in container + * returns number of created elements of mdinfo list + * this memory must be later freed by sysfs_free */ +struct mdinfo *getinfo_super_disks_imsm(struct supertype *st) +{ + struct mdinfo *mddev = NULL; + struct intel_super *super = st->sb; + struct imsm_disk *disk; + int count = 0; + struct dl *dl; + if ((!super) || !st->loaded_container || !(super->disks) ) + return NULL; + dl = super->disks; + mddev = malloc(sizeof(*mddev)); + if (!mddev) { + fprintf(stderr, Name ": Failed to allocate memory.\n"); + return NULL; + } + memset(mddev, 0, sizeof(*mddev)); + + while (dl) { + struct mdinfo *tmp; + disk = &dl->disk; + tmp = malloc(sizeof(*tmp)); + if (!tmp) { + fprintf(stderr, Name ": Failed to allocate memory.\n"); + if (mddev) + sysfs_free(mddev); + return NULL; + } + memset(tmp, 0, sizeof(*tmp)); + + if (mddev->devs) + tmp->next = mddev->devs; + else + mddev->devs = tmp; + + tmp->disk.number = count++; + tmp->disk.major = dl->major; + tmp->disk.minor = dl->minor; + tmp->disk.state = is_configured(disk) ? + (1 << MD_DISK_ACTIVE) : 0; + tmp->disk.state |= is_failed(disk) ? (1 << MD_DISK_FAULTY) : 0; + tmp->disk.state |= is_spare(disk) ? 0 : (1 << MD_DISK_SYNC); + tmp->disk.raid_disk = -1; + + dl = dl->next; + } + return mddev; +} + static int update_super_imsm(struct supertype *st, struct mdinfo *info, char *update, char *devname, int verbose, int uuid_set, char *homehost) @@ -5580,6 +5632,7 @@ struct superswitch super_imsm = { .match_home = match_home_imsm, .uuid_from_super= uuid_from_super_imsm, .getinfo_super = getinfo_super_imsm, + .getinfo_super_disks = getinfo_super_disks_imsm, .update_super = update_super_imsm, .avail_size = avail_size_imsm, -- 1.6.4.2 -- To unsubscribe from this list: send the line "unsubscribe linux-raid" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html