]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - super-intel.c
Remove getinfo_super_n and do some other cleaning up.
[thirdparty/mdadm.git] / super-intel.c
index 77892dd25cb088351c3ef317f8f247364181559e..dee107cd65d2721e8db37d82c33bd423b58274b6 100644 (file)
@@ -124,6 +124,8 @@ static unsigned int mpb_sectors(struct imsm_super *mpb)
        return sector_count(__le32_to_cpu(mpb->mpb_size));
 }
 
+static struct superswitch super_imsm_volume;
+
 /* internal representation of IMSM metadata */
 struct intel_super {
        union {
@@ -157,6 +159,7 @@ static struct supertype *match_metadata_desc_imsm(char *arg)
                return NULL;
 
        st = malloc(sizeof(*st));
+       memset(st, 0, sizeof(*st));
        st->ss = &super_imsm;
        st->max_devs = IMSM_MAX_DEVICES;
        st->minor_version = 0;
@@ -175,6 +178,7 @@ static struct supertype *match_metadata_desc_imsm_volume(char *arg)
                return NULL;
 
        st = malloc(sizeof(*st));
+       memset(st, 0, sizeof(*st));
        st->ss = &super_imsm_volume;
        st->max_devs = IMSM_MAX_DEVICES;
        st->minor_version = 0;
@@ -447,6 +451,7 @@ static void uuid_from_super_imsm(struct supertype *st, int uuid[4])
        printf("%s\n", __FUNCTION__);
 }
 
+#if 0
 static void
 get_imsm_numerical_version(struct imsm_super *mpb, int *m, int *p)
 {
@@ -472,6 +477,7 @@ get_imsm_numerical_version(struct imsm_super *mpb, int *m, int *p)
        *m = strtol(minor, NULL, 0);
        *p = strtol(patch, NULL, 0);
 }
+#endif
 
 static int imsm_level_to_layout(int level)
 {
@@ -493,11 +499,9 @@ static void getinfo_super_imsm(struct supertype *st, struct mdinfo *info)
        struct intel_super *super = st->sb;
        struct imsm_super *mpb = super->mpb;
        struct imsm_disk *disk;
+       int sect = mpb_sectors(mpb);
        __u32 s;
 
-       info->array.major_version = 2000;
-       get_imsm_numerical_version(mpb, &info->array.minor_version,
-                                  &info->array.patch_version);
        info->array.raid_disks    = mpb->num_disks;
        info->array.level         = LEVEL_CONTAINER;
        info->array.layout        = 0;
@@ -514,6 +518,11 @@ static void getinfo_super_imsm(struct supertype *st, struct mdinfo *info)
        info->disk.number = -1;
        info->disk.state = 0;
 
+       info->data_offset = __le32_to_cpu(get_imsm_disk(super->mpb,
+                                                       super->disks->index)
+                                         ->total_blocks) - (2 + sect - 1);
+       info->component_size = sect;
+
        if (super->disks) {
                info->disk.number = super->disks->index;
                info->disk.raid_disk = super->disks->index;
@@ -532,9 +541,6 @@ static void getinfo_super_imsm_volume(struct supertype *st, struct mdinfo *info)
        struct imsm_dev *dev = get_imsm_dev(mpb, info->container_member);
        struct imsm_map *map = &dev->vol.map[0];
 
-       info->array.major_version = 2000;
-       get_imsm_numerical_version(mpb, &info->array.minor_version,
-                                  &info->array.patch_version);
        info->array.raid_disks    = map->num_members;
        info->array.level         = get_imsm_raid_level(map);
        info->array.layout        = imsm_level_to_layout(info->array.level);
@@ -976,6 +982,10 @@ static int load_super_imsm_all(struct supertype *st, int fd, void **sbp,
                        close(dfd);
        }
 
+       if (st->subarray[0]) {
+               /* FIXME */
+       }
+
        *sbp = super;
        if (st->ss == NULL) {
                st->ss = &super_imsm_container;
@@ -997,6 +1007,8 @@ static int load_super_imsm(struct supertype *st, int fd, char *devname)
        if (load_super_imsm_all(st, fd, &st->sb, devname, 1) == 0)
                return 0;
 #endif
+       if (st->subarray[0])
+               return 1; /* FIXME */
 
        super = alloc_super(0);
        if (!super) {
@@ -1031,8 +1043,7 @@ static int init_zero_imsm(struct supertype *st, mdu_array_info_t *info,
                          unsigned long long size, char *name,
                          char *homehost, int *uuid)
 {
-       printf("%s\n", __FUNCTION__);
-
+       st->sb = NULL;
        return 0;
 }
 
@@ -1269,37 +1280,19 @@ static int write_init_super_imsm(struct supertype *st)
 
 static int store_zero_imsm(struct supertype *st, int fd)
 {
-       printf("%s\n", __FUNCTION__);
-
-       return 0;
-}
-
-static void getinfo_super_n_imsm_container(struct supertype *st, struct mdinfo *info)
-{
-       /* just need offset and size...
-        * of the metadata
-        */
-       struct intel_super *super = st->sb;
-       struct imsm_super *mpb = super->mpb;
-       struct imsm_disk *disk = get_imsm_disk(mpb, info->disk.number);
+       unsigned long long dsize;
+       char buf[512];
 
-       info->data_offset = __le32_to_cpu(disk->total_blocks) -
-                           (MPB_SECTOR_CNT + IMSM_RESERVED_SECTORS);
-       info->component_size = MPB_SECTOR_CNT + IMSM_RESERVED_SECTORS;
-}
+       get_dev_size(fd, NULL, &dsize);
 
-static void getinfo_super_n_imsm_volume(struct supertype *st, struct mdinfo *info)
-{
-       /* Find the particular details for info->disk.raid_disk.
-        * This includes data_offset, component_size,
-        */
-       struct intel_super *super = st->sb;
-       struct imsm_super *mpb = super->mpb;
-       struct imsm_dev *dev = get_imsm_dev(mpb, super->creating_dev);
-       struct imsm_map *map = &dev->vol.map[0];
+       /* first block is stored on second to last sector of the disk */
+       if (lseek64(fd, dsize - (512 * 2), SEEK_SET) < 0)
+               return 1;
 
-       info->data_offset = __le32_to_cpu(map->pba_of_lba0);
-       info->component_size = __le32_to_cpu(map->blocks_per_member);
+       memset(buf, 0, sizeof(buf));
+       if (write(fd, buf, sizeof(buf)) != sizeof(buf))
+               return 1;
+       return 0;
 }
 
 static int validate_geometry_imsm(struct supertype *st, int level, int layout,
@@ -1552,9 +1545,6 @@ static struct mdinfo *container_content_imsm(struct supertype *st)
                this->next = rest;
                rest = this;
 
-               this->array.major_version = 2000;
-               get_imsm_numerical_version(mpb, &this->array.minor_version,
-                                          &this->array.patch_version);
                this->array.level = get_imsm_raid_level(map);
                this->array.raid_disks = map->num_members;
                this->array.layout = imsm_level_to_layout(this->array.level);
@@ -1634,27 +1624,11 @@ static struct mdinfo *container_content_imsm(struct supertype *st)
 static int imsm_open_new(struct supertype *c, struct active_array *a,
                         char *inst)
 {
-       fprintf(stderr, "imsm: open_new %s\n", inst);
+       dprintf("imsm: open_new %s\n", inst);
        a->info.container_member = atoi(inst);
        return 0;
 }
 
-static void imsm_set_array_state(struct active_array *a, int consistent)
-{
-       int inst = a->info.container_member;
-       struct intel_super *super = a->container->sb;
-       struct imsm_dev *dev = get_imsm_dev(super->mpb, inst);
-       int dirty = !consistent || (a->resync_start != ~0ULL);
-
-       if (dev->vol.dirty != dirty) {
-               fprintf(stderr, "imsm: mark '%s' (%llu)\n",
-                       dirty?"dirty":"clean", a->resync_start);
-
-               dev->vol.dirty = dirty;
-               super->updates_pending++;
-       }
-}
-
 static __u8 imsm_check_degraded(struct imsm_super *mpb, int n, int failed)
 {
        struct imsm_dev *dev = get_imsm_dev(mpb, n);
@@ -1732,6 +1706,38 @@ static int imsm_count_failed(struct imsm_super *mpb, struct imsm_map *map)
        return failed;
 }
 
+static void imsm_set_array_state(struct active_array *a, int consistent)
+{
+       int inst = a->info.container_member;
+       struct intel_super *super = a->container->sb;
+       struct imsm_dev *dev = get_imsm_dev(super->mpb, inst);
+       struct imsm_map *map = &dev->vol.map[0];
+       int dirty = !consistent;
+       int failed;
+       __u8 map_state;
+
+       if (a->resync_start == ~0ULL) {
+               failed = imsm_count_failed(super->mpb, map);
+               map_state = imsm_check_degraded(super->mpb, inst, failed);
+               if (!failed)
+                       map_state = IMSM_T_STATE_NORMAL;
+               if (map->map_state != map_state) {
+                       dprintf("imsm: map_state %d: %d\n",
+                               inst, map_state);
+                       map->map_state = map_state;
+                       super->updates_pending++;
+               }
+       }
+
+       if (dev->vol.dirty != dirty) {
+               dprintf("imsm: mark '%s' (%llu)\n",
+                       dirty?"dirty":"clean", a->resync_start);
+
+               dev->vol.dirty = dirty;
+               super->updates_pending++;
+       }
+}
+
 static void imsm_set_disk(struct active_array *a, int n, int state)
 {
        int inst = a->info.container_member;
@@ -1750,7 +1756,7 @@ static void imsm_set_disk(struct active_array *a, int n, int state)
        if (n < 0)
                return;
 
-       fprintf(stderr, "imsm: set_disk %d:%x\n", n, state);
+       dprintf("imsm: set_disk %d:%x\n", n, state);
 
        disk = get_imsm_disk(super->mpb, get_imsm_disk_idx(map, n));
 
@@ -1785,24 +1791,23 @@ static int store_imsm_mpb(int fd, struct intel_super *super)
 
        get_dev_size(fd, NULL, &dsize);
 
-       /* first block is stored on second to last sector of the disk */
-       if (lseek64(fd, dsize - (512 * 2), SEEK_SET) < 0)
-               return 1;
+       if (mpb_size > 512) {
+               /* -1 to account for anchor */
+               sectors = mpb_sectors(mpb) - 1;
 
-       if (write(fd, super->buf, 512) != 512)
-               return 1;
-
-       if (mpb_size <= 512)
-               return 0;
+               /* write the extended mpb to the sectors preceeding the anchor */
+               if (lseek64(fd, dsize - (512 * (2 + sectors)), SEEK_SET) < 0)
+                       return 1;
 
-       /* -1 because we already wrote a sector */
-       sectors = mpb_sectors(mpb) - 1;
+               if (write(fd, super->buf + 512, mpb_size - 512) != mpb_size - 512)
+                       return 1;
+       }
 
-       /* write the extended mpb to the sectors preceeding the anchor */
-       if (lseek64(fd, dsize - (512 * (2 + sectors)), SEEK_SET) < 0)
+       /* first block is stored on second to last sector of the disk */
+       if (lseek64(fd, dsize - (512 * 2), SEEK_SET) < 0)
                return 1;
 
-       if (write(fd, super->buf + 512, mpb_size - 512) != mpb_size - 512)
+       if (write(fd, super->buf, 512) != 512)
                return 1;
 
        fsync(fd);
@@ -1843,11 +1848,8 @@ struct superswitch super_imsm = {
        .store_super    = store_zero_imsm,
        .free_super     = free_super_imsm,
        .match_metadata_desc = match_metadata_desc_imsm,
-       .getinfo_super_n  = getinfo_super_n_imsm_container,
 
        .validate_geometry = validate_geometry_imsm,
-       .major          = 2000,
-       .swapuuid       = 0,
        .external       = 1,
 
 /* for mdmon */
@@ -1868,7 +1870,6 @@ struct superswitch super_imsm_container = {
        .add_to_super   = add_to_super_imsm,
        .write_init_super = write_init_super_imsm,
        .getinfo_super  = getinfo_super_imsm,
-       .getinfo_super_n  = getinfo_super_n_imsm_container,
        .load_super     = load_super_imsm,
 
 #ifndef MDASSEMBLE
@@ -1882,17 +1883,14 @@ struct superswitch super_imsm_container = {
 
        .container_content = container_content_imsm,
 
-       .major          = 2000,
-       .swapuuid       = 0,
        .external       = 1,
 };
 
-struct superswitch super_imsm_volume = {
+static struct superswitch super_imsm_volume = {
        .update_super   = update_super_imsm,
        .init_super     = init_super_imsm_volume,
        .add_to_super   = add_to_super_imsm_volume,
        .getinfo_super  = getinfo_super_imsm_volume,
-       .getinfo_super_n  = getinfo_super_n_imsm_volume,
        .write_init_super = write_init_super_imsm,
 
        .load_super     = load_super_imsm,
@@ -1901,7 +1899,5 @@ struct superswitch super_imsm_volume = {
 
 
        .validate_geometry = validate_geometry_imsm_volume,
-       .major          = 2001,
-       .swapuuid       = 0,
        .external       = 2,
 };