return sector_count(__le32_to_cpu(mpb->mpb_size));
}
+static struct superswitch super_imsm_volume;
+
/* internal representation of IMSM metadata */
struct intel_super {
union {
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;
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;
printf("%s\n", __FUNCTION__);
}
+#if 0
static void
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)
{
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;
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;
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);
close(dfd);
}
+ if (st->subarray[0]) {
+ /* FIXME */
+ }
+
*sbp = super;
if (st->ss == NULL) {
st->ss = &super_imsm_container;
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) {
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)
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);
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);
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;
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));
.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 */
.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
.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,
.validate_geometry = validate_geometry_imsm_volume,
- .major = 2001,
- .swapuuid = 0,
.external = 2,
};