From 4a04ec6ca1a0e013d857ac8993d38752a6223fc2 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Mon, 16 Jun 2008 15:36:40 -0700 Subject: [PATCH] imsm: ->getinfo_super set raid_disk to disk.number A spare device by definition will have raid_disk set to -1, but when assembling the container we want this disk to by included. Fixes a SIGSEGV when doing: mdadm -A /dev/imsm -e imsm /dev/sd[b-e] ...where /dev/sde is marked as a global spare device Signed-off-by: Dan Williams --- super-intel.c | 34 ++++++++-------------------------- 1 file changed, 8 insertions(+), 26 deletions(-) diff --git a/super-intel.c b/super-intel.c index 87971103..77892dd2 100644 --- a/super-intel.c +++ b/super-intel.c @@ -494,7 +494,6 @@ static void getinfo_super_imsm(struct supertype *st, struct mdinfo *info) struct imsm_super *mpb = super->mpb; struct imsm_disk *disk; __u32 s; - int i, j; info->array.major_version = 2000; get_imsm_numerical_version(mpb, &info->array.minor_version, @@ -515,32 +514,15 @@ static void getinfo_super_imsm(struct supertype *st, struct mdinfo *info) info->disk.number = -1; info->disk.state = 0; - if (!super->disks) - return; - - info->disk.number = super->disks->index; - /* is this disk a member of a raid device? */ - for (i = 0; i < mpb->num_raid_devs; i++) { - struct imsm_dev *dev = get_imsm_dev(mpb, i); - struct imsm_map *map = dev->vol.map; - - for (j = 0; j < map->num_members; j++) { - __u32 index = get_imsm_disk_idx(map, j); - - if (index == super->disks->index) { - info->disk.raid_disk = super->disks->index; - break; - } - } - if (info->disk.raid_disk != -1) - break; + if (super->disks) { + info->disk.number = super->disks->index; + info->disk.raid_disk = super->disks->index; + disk = get_imsm_disk(mpb, super->disks->index); + s = __le32_to_cpu(disk->status); + info->disk.state = s & CONFIGURED_DISK ? (1 << MD_DISK_ACTIVE) : 0; + info->disk.state |= s & FAILED_DISK ? (1 << MD_DISK_FAULTY) : 0; + info->disk.state |= s & USABLE_DISK ? (1 << MD_DISK_SYNC) : 0; } - disk = get_imsm_disk(mpb, super->disks->index); - s = __le32_to_cpu(disk->status); - info->disk.state = s & CONFIGURED_DISK ? (1 << MD_DISK_ACTIVE) : 0; - info->disk.state |= s & FAILED_DISK ? (1 << MD_DISK_FAULTY) : 0; - info->disk.state |= s & USABLE_DISK ? (1 << MD_DISK_SYNC) : 0; - } static void getinfo_super_imsm_volume(struct supertype *st, struct mdinfo *info) -- 2.39.2