RE: [AUTOREBUILD 5/8] imsm: create mdinfo list of disks in a container from supertype

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



>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


[Index of Archives]     [Linux RAID Wiki]     [ATA RAID]     [Linux SCSI Target Infrastructure]     [Linux Block]     [Linux IDE]     [Linux SCSI]     [Linux Hams]     [Device Mapper]     [Device Mapper Cryptographics]     [Kernel]     [Linux Admin]     [Linux Net]     [GFS]     [RPM]     [git]     [Yosemite Forum]


  Powered by Linux