X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fmdadm.git;a=blobdiff_plain;f=super-intel.c;h=dee107cd65d2721e8db37d82c33bd423b58274b6;hp=77892dd25cb088351c3ef317f8f247364181559e;hb=d2ca644994d642c31b41242140e1fe819711c8f7;hpb=4a04ec6ca1a0e013d857ac8993d38752a6223fc2 diff --git a/super-intel.c b/super-intel.c index 77892dd2..dee107cd 100644 --- a/super-intel.c +++ b/super-intel.c @@ -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, };