int updates_pending; /* count of pending updates for mdmon */
int creating_imsm; /* flag to indicate container creation */
int current_vol; /* index of raid device undergoing creation */
- #define IMSM_MAX_DISKS 6
- struct imsm_disk *disk_tbl[IMSM_MAX_DISKS];
#define IMSM_MAX_RAID_DEVS 2
struct imsm_dev *dev_tbl[IMSM_MAX_RAID_DEVS];
struct dl {
__u8 serial[MAX_RAID_SERIAL_LEN];
int major, minor;
char *devname;
+ struct imsm_disk disk;
int fd;
} *disks;
struct bbm_log *bbm_log;
return &mpb->disk[index];
}
+/* retrieve a disk from the parsed metadata */
static struct imsm_disk *get_imsm_disk(struct intel_super *super, __u8 index)
{
- if (index >= super->anchor->num_disks)
- return NULL;
- return super->disk_tbl[index];
+ struct dl *d;
+
+ for (d = super->disks; d; d = d->next)
+ if (d->index == index)
+ return &d->disk;
+
+ return NULL;
}
/* generate a checksum directly from the anchor when the anchor is known to be
static struct extent *get_extents(struct intel_super *super, struct dl *dl)
{
/* find a list of used extents on the given physical device */
- struct imsm_disk *disk;
struct extent *rv, *e;
int i, j;
int memberships = 0;
- disk = get_imsm_disk(super, dl->index);
- if (!disk)
- return NULL;
-
for (i = 0; i < super->anchor->num_raid_devs; i++) {
struct imsm_dev *dev = get_imsm_dev(super, i);
struct imsm_map *map = dev->vol.map;
}
qsort(rv, memberships, sizeof(*rv), cmp_extent);
- e->start = __le32_to_cpu(disk->total_blocks) -
+ e->start = __le32_to_cpu(dl->disk.total_blocks) -
(MPB_SECTOR_CNT + IMSM_RESERVED_SECTORS);
e->size = 0;
return rv;
info->disk.state = 0;
if (super->disks) {
- disk = get_imsm_disk(super, super->disks->index);
- if (!disk) {
- info->disk.number = -1;
- info->disk.raid_disk = -1;
- return;
- }
+ disk = &super->disks->disk;
info->disk.number = super->disks->index;
info->disk.raid_disk = super->disks->index;
info->data_offset = __le32_to_cpu(disk->total_blocks) -
{
struct dl *dl;
struct stat stb;
- struct imsm_disk *disk;
int rv;
int i;
dl = malloc(sizeof(*dl));
- disk = malloc(sizeof(*disk));
- if (!dl || !disk) {
+ if (!dl) {
if (devname)
fprintf(stderr,
Name ": failed to allocate disk buffer for %s\n",
devname);
- if (disk)
- free(disk);
- if (dl)
- free(dl);
return 2;
}
memset(dl, 0, sizeof(*dl));
- memset(disk, 0, sizeof(*disk));
fstat(fd, &stb);
dl->major = major(stb.st_rdev);
if (memcmp(disk_iter->serial, dl->serial,
MAX_RAID_SERIAL_LEN) == 0) {
- *disk = *disk_iter;
- super->disk_tbl[i] = disk;
+ dl->disk = *disk_iter;
dl->index = i;
break;
}
fprintf(stderr,
Name ": failed to match serial \'%s\' for %s\n",
dl->serial, devname);
- free(disk);
return 0;
}
static void free_imsm_disks(struct intel_super *super)
{
- int i;
-
while (super->disks) {
struct dl *d = super->disks;
free(d->devname);
free(d);
}
- for (i = 0; i < IMSM_MAX_DISKS; i++)
- if (super->disk_tbl[i]) {
- free(super->disk_tbl[i]);
- super->disk_tbl[i] = NULL;
- }
}
/* free all the pieces hanging off of a super pointer */
fstat(fd, &stb);
dd = malloc(sizeof(*dd));
- disk = malloc(sizeof(*disk));
- if (!dd || !disk) {
+ if (!dd) {
fprintf(stderr,
Name ": malloc failed %s:%d.\n", __func__, __LINE__);
- if (!dd)
- free(dd);
- if (!disk)
- free(disk);
abort();
}
memset(dd, 0, sizeof(*dd));
- memset(disk, 0, sizeof(*disk));
dd->major = major(stb.st_rdev);
dd->minor = minor(stb.st_rdev);
- dd->index = dk->number;
+ dd->index = -1;
dd->devname = devname ? strdup(devname) : NULL;
dd->next = super->disks;
dd->fd = fd;
fprintf(stderr,
Name ": failed to retrieve scsi serial, aborting\n");
free(dd);
- free(disk);
abort();
}
get_dev_size(fd, NULL, &size);
size /= 512;
status = USABLE_DISK | SPARE_DISK;
- strcpy((char *) disk->serial, (char *) dd->serial);
- disk->total_blocks = __cpu_to_le32(size);
- disk->status = __cpu_to_le32(status);
+ strcpy((char *) dd->disk.serial, (char *) dd->serial);
+ dd->disk.total_blocks = __cpu_to_le32(size);
+ dd->disk.status = __cpu_to_le32(status);
if (sysfs_disk_to_scsi_id(fd, &id) == 0)
- disk->scsi_id = __cpu_to_le32(id);
+ dd->disk.scsi_id = __cpu_to_le32(id);
else
- disk->scsi_id = __cpu_to_le32(0);
- super->disk_tbl[dd->index] = disk;
+ dd->disk.scsi_id = __cpu_to_le32(0);
/* update the family number if we are creating a container */
if (super->creating_imsm) {
disk = __get_imsm_disk(mpb, dd->index);
- *disk = *super->disk_tbl[dd->index]; /* copy in new disk */
+ *disk = dd->disk;
mpb->family_num = __cpu_to_le32(__gen_imsm_checksum(mpb));
}
generation++;
mpb->generation_num = __cpu_to_le32(generation);
- for (i = 0; i < mpb->num_disks; i++)
- mpb->disk[i] = *super->disk_tbl[i];
+ for (d = super->disks; d; d = d->next)
+ mpb->disk[d->index] = d->disk;
+
for (i = 0; i < mpb->num_raid_devs; i++) {
struct imsm_dev *dev = __get_imsm_dev(mpb, i);
this->component_size = __le32_to_cpu(map->blocks_per_member);
for (slot = 0 ; slot < map->num_members; slot++) {
- struct imsm_disk *disk;
struct mdinfo *info_d;
struct dl *d;
int idx;
info_d->next = this->devs;
this->devs = info_d;
- disk = get_imsm_disk(super, idx);
- s = __le32_to_cpu(disk->status);
+ s = __le32_to_cpu(d->disk.status);
info_d->disk.number = d->index;
info_d->disk.major = d->major;