X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fmdadm.git;a=blobdiff_plain;f=super-intel.c;h=dee107cd65d2721e8db37d82c33bd423b58274b6;hp=8ca491bd035e104ef52321745bc97fd5f345dca7;hb=d2ca644994d642c31b41242140e1fe819711c8f7;hpb=4e6e574a3e8eb2351ba1d850369630bf8879dfaf diff --git a/super-intel.c b/super-intel.c index 8ca491bd..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) { @@ -1280,38 +1292,9 @@ static int store_zero_imsm(struct supertype *st, int fd) memset(buf, 0, sizeof(buf)); if (write(fd, buf, sizeof(buf)) != sizeof(buf)) return 1; - 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); - - info->data_offset = __le32_to_cpu(disk->total_blocks) - - (MPB_SECTOR_CNT + IMSM_RESERVED_SECTORS); - info->component_size = MPB_SECTOR_CNT + IMSM_RESERVED_SECTORS; -} - -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]; - - info->data_offset = __le32_to_cpu(map->pba_of_lba0); - info->component_size = __le32_to_cpu(map->blocks_per_member); -} - static int validate_geometry_imsm(struct supertype *st, int level, int layout, int raiddisks, int chunk, unsigned long long size, char *dev, unsigned long long *freesize) @@ -1562,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); @@ -1868,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 */ @@ -1893,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 @@ -1907,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, @@ -1926,7 +1899,5 @@ struct superswitch super_imsm_volume = { .validate_geometry = validate_geometry_imsm_volume, - .major = 2001, - .swapuuid = 0, .external = 2, };