Merge branch 'master' of git://github.com/djbw/mdadm
This commit is contained in:
commit
ae80545ac3
15
Detail.c
15
Detail.c
|
@ -122,12 +122,25 @@ int Detail(char *dev, int brief, int export, int test, char *homehost)
|
||||||
disk.minor == 0)
|
disk.minor == 0)
|
||||||
continue;
|
continue;
|
||||||
if ((dv=map_dev(disk.major, disk.minor, 1))) {
|
if ((dv=map_dev(disk.major, disk.minor, 1))) {
|
||||||
if ((!st || !st->sb) &&
|
/* some formats (imsm) have free-floating-spares
|
||||||
|
* with a uuid of uuid_match_any, they don't
|
||||||
|
* have very good info about the rest of the
|
||||||
|
* container, so keep searching when
|
||||||
|
* encountering such a device. Otherwise, stop
|
||||||
|
* after the first successful call to
|
||||||
|
* ->load_super.
|
||||||
|
*/
|
||||||
|
int free_spare = memcmp(uuid_match_any,
|
||||||
|
info.uuid,
|
||||||
|
sizeof(uuid_match_any)) == 0;
|
||||||
|
if ((!st || !st->sb || free_spare) &&
|
||||||
(array.raid_disks == 0 ||
|
(array.raid_disks == 0 ||
|
||||||
(disk.state & (1<<MD_DISK_ACTIVE)))) {
|
(disk.state & (1<<MD_DISK_ACTIVE)))) {
|
||||||
/* try to read the superblock from this device
|
/* try to read the superblock from this device
|
||||||
* to get more info
|
* to get more info
|
||||||
*/
|
*/
|
||||||
|
if (free_spare)
|
||||||
|
st->ss->free_super(st);
|
||||||
int fd2 = dev_open(dv, O_RDONLY);
|
int fd2 = dev_open(dv, O_RDONLY);
|
||||||
if (fd2 >=0 && st &&
|
if (fd2 >=0 && st &&
|
||||||
st->ss->load_super(st, fd2, NULL) == 0) {
|
st->ss->load_super(st, fd2, NULL) == 0) {
|
||||||
|
|
15
Examine.c
15
Examine.c
|
@ -118,7 +118,8 @@ int Examine(mddev_dev_t devlist, int brief, int export, int scan,
|
||||||
st->ss->getinfo_super(st, &ap->info);
|
st->ss->getinfo_super(st, &ap->info);
|
||||||
} else
|
} else
|
||||||
st->ss->getinfo_super(st, &ap->info);
|
st->ss->getinfo_super(st, &ap->info);
|
||||||
if (!(ap->info.disk.state & (1<<MD_DISK_SYNC)))
|
if (!st->loaded_container &&
|
||||||
|
!(ap->info.disk.state & (1<<MD_DISK_SYNC)))
|
||||||
ap->spares++;
|
ap->spares++;
|
||||||
d = dl_strdup(devlist->devname);
|
d = dl_strdup(devlist->devname);
|
||||||
dl_add(ap->devs, d);
|
dl_add(ap->devs, d);
|
||||||
|
@ -136,17 +137,23 @@ int Examine(mddev_dev_t devlist, int brief, int export, int scan,
|
||||||
for (ap=arrays; ap; ap=ap->next) {
|
for (ap=arrays; ap; ap=ap->next) {
|
||||||
char sep='=';
|
char sep='=';
|
||||||
char *d;
|
char *d;
|
||||||
|
int newline = 0;
|
||||||
|
|
||||||
ap->st->ss->brief_examine_super(ap->st, brief > 1);
|
ap->st->ss->brief_examine_super(ap->st, brief > 1);
|
||||||
if (ap->spares) printf(" spares=%d", ap->spares);
|
if (ap->spares)
|
||||||
|
newline += printf(" spares=%d", ap->spares);
|
||||||
if (brief > 1) {
|
if (brief > 1) {
|
||||||
printf(" devices");
|
newline += printf(" devices");
|
||||||
for (d=dl_next(ap->devs); d!= ap->devs; d=dl_next(d)) {
|
for (d=dl_next(ap->devs); d!= ap->devs; d=dl_next(d)) {
|
||||||
printf("%c%s", sep, d);
|
printf("%c%s", sep, d);
|
||||||
sep=',';
|
sep=',';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (ap->st->ss->brief_examine_subarrays)
|
if (ap->st->ss->brief_examine_subarrays) {
|
||||||
|
if (newline)
|
||||||
|
printf("\n");
|
||||||
ap->st->ss->brief_examine_subarrays(ap->st, brief > 1);
|
ap->st->ss->brief_examine_subarrays(ap->st, brief > 1);
|
||||||
|
}
|
||||||
ap->st->ss->free_super(ap->st);
|
ap->st->ss->free_super(ap->st);
|
||||||
/* FIXME free ap */
|
/* FIXME free ap */
|
||||||
if (ap->spares || brief > 1)
|
if (ap->spares || brief > 1)
|
||||||
|
|
2
mdmon.c
2
mdmon.c
|
@ -395,7 +395,7 @@ int mdmon(char *devname, int devnum, int scan, char *switchroot)
|
||||||
} else
|
} else
|
||||||
pfd[0] = pfd[1] = -1;
|
pfd[0] = pfd[1] = -1;
|
||||||
|
|
||||||
container = malloc(sizeof(*container));
|
container = calloc(1, sizeof(*container));
|
||||||
container->devnum = devnum;
|
container->devnum = devnum;
|
||||||
container->devname = devname;
|
container->devname = devname;
|
||||||
container->arrays = NULL;
|
container->arrays = NULL;
|
||||||
|
|
|
@ -64,7 +64,6 @@ struct imsm_disk {
|
||||||
#define SPARE_DISK __cpu_to_le32(0x01) /* Spare */
|
#define SPARE_DISK __cpu_to_le32(0x01) /* Spare */
|
||||||
#define CONFIGURED_DISK __cpu_to_le32(0x02) /* Member of some RaidDev */
|
#define CONFIGURED_DISK __cpu_to_le32(0x02) /* Member of some RaidDev */
|
||||||
#define FAILED_DISK __cpu_to_le32(0x04) /* Permanent failure */
|
#define FAILED_DISK __cpu_to_le32(0x04) /* Permanent failure */
|
||||||
#define USABLE_DISK __cpu_to_le32(0x08) /* Fully usable unless FAILED_DISK is set */
|
|
||||||
__u32 status; /* 0xF0 - 0xF3 */
|
__u32 status; /* 0xF0 - 0xF3 */
|
||||||
__u32 owner_cfg_num; /* which config 0,1,2... owns this disk */
|
__u32 owner_cfg_num; /* which config 0,1,2... owns this disk */
|
||||||
#define IMSM_DISK_FILLERS 4
|
#define IMSM_DISK_FILLERS 4
|
||||||
|
@ -687,10 +686,9 @@ static void print_imsm_disk(struct imsm_super *mpb, int index, __u32 reserved)
|
||||||
snprintf(str, MAX_RAID_SERIAL_LEN + 1, "%s", disk->serial);
|
snprintf(str, MAX_RAID_SERIAL_LEN + 1, "%s", disk->serial);
|
||||||
printf(" Disk%02d Serial : %s\n", index, str);
|
printf(" Disk%02d Serial : %s\n", index, str);
|
||||||
s = disk->status;
|
s = disk->status;
|
||||||
printf(" State :%s%s%s%s\n", s&SPARE_DISK ? " spare" : "",
|
printf(" State :%s%s%s\n", s&SPARE_DISK ? " spare" : "",
|
||||||
s&CONFIGURED_DISK ? " active" : "",
|
s&CONFIGURED_DISK ? " active" : "",
|
||||||
s&FAILED_DISK ? " failed" : "",
|
s&FAILED_DISK ? " failed" : "");
|
||||||
s&USABLE_DISK ? " usable" : "");
|
|
||||||
printf(" Id : %08x\n", __le32_to_cpu(disk->scsi_id));
|
printf(" Id : %08x\n", __le32_to_cpu(disk->scsi_id));
|
||||||
sz = __le32_to_cpu(disk->total_blocks) - reserved;
|
sz = __le32_to_cpu(disk->total_blocks) - reserved;
|
||||||
printf(" Usable Size : %llu%s\n", (unsigned long long)sz,
|
printf(" Usable Size : %llu%s\n", (unsigned long long)sz,
|
||||||
|
@ -1499,18 +1497,17 @@ static int compare_super_imsm(struct supertype *st, struct supertype *tst)
|
||||||
dv->next = first->devlist;
|
dv->next = first->devlist;
|
||||||
first->devlist = dv;
|
first->devlist = dv;
|
||||||
}
|
}
|
||||||
if (i <= sec->anchor->num_raid_devs) {
|
if (i < sec->anchor->num_raid_devs) {
|
||||||
/* allocation failure */
|
/* allocation failure */
|
||||||
free_devlist(first);
|
free_devlist(first);
|
||||||
fprintf(stderr, "imsm: failed to associate spare\n");
|
fprintf(stderr, "imsm: failed to associate spare\n");
|
||||||
return 3;
|
return 3;
|
||||||
}
|
}
|
||||||
for (i = 0; i < sec->anchor->num_raid_devs; i++)
|
|
||||||
imsm_copy_dev(get_imsm_dev(first, i), get_imsm_dev(sec, i));
|
|
||||||
|
|
||||||
first->anchor->num_raid_devs = sec->anchor->num_raid_devs;
|
first->anchor->num_raid_devs = sec->anchor->num_raid_devs;
|
||||||
first->anchor->orig_family_num = sec->anchor->orig_family_num;
|
first->anchor->orig_family_num = sec->anchor->orig_family_num;
|
||||||
first->anchor->family_num = sec->anchor->family_num;
|
first->anchor->family_num = sec->anchor->family_num;
|
||||||
|
for (i = 0; i < sec->anchor->num_raid_devs; i++)
|
||||||
|
imsm_copy_dev(get_imsm_dev(first, i), get_imsm_dev(sec, i));
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -2569,7 +2566,7 @@ static int add_to_super_imsm_volume(struct supertype *st, mdu_disk_info_t *dk,
|
||||||
super->anchor->num_disks++;
|
super->anchor->num_disks++;
|
||||||
}
|
}
|
||||||
set_imsm_ord_tbl_ent(map, dk->number, dl->index);
|
set_imsm_ord_tbl_ent(map, dk->number, dl->index);
|
||||||
dl->disk.status = CONFIGURED_DISK | USABLE_DISK;
|
dl->disk.status = CONFIGURED_DISK;
|
||||||
|
|
||||||
/* if we are creating the first raid device update the family number */
|
/* if we are creating the first raid device update the family number */
|
||||||
if (super->current_vol == 0) {
|
if (super->current_vol == 0) {
|
||||||
|
@ -2637,7 +2634,7 @@ static int add_to_super_imsm(struct supertype *st, mdu_disk_info_t *dk,
|
||||||
size /= 512;
|
size /= 512;
|
||||||
serialcpy(dd->disk.serial, dd->serial);
|
serialcpy(dd->disk.serial, dd->serial);
|
||||||
dd->disk.total_blocks = __cpu_to_le32(size);
|
dd->disk.total_blocks = __cpu_to_le32(size);
|
||||||
dd->disk.status = USABLE_DISK | SPARE_DISK;
|
dd->disk.status = SPARE_DISK;
|
||||||
if (sysfs_disk_to_scsi_id(fd, &id) == 0)
|
if (sysfs_disk_to_scsi_id(fd, &id) == 0)
|
||||||
dd->disk.scsi_id = __cpu_to_le32(id);
|
dd->disk.scsi_id = __cpu_to_le32(id);
|
||||||
else
|
else
|
||||||
|
@ -3463,8 +3460,6 @@ static struct mdinfo *container_content_imsm(struct supertype *st)
|
||||||
s = d ? d->disk.status : 0;
|
s = d ? d->disk.status : 0;
|
||||||
if (s & FAILED_DISK)
|
if (s & FAILED_DISK)
|
||||||
skip = 1;
|
skip = 1;
|
||||||
if (!(s & USABLE_DISK))
|
|
||||||
skip = 1;
|
|
||||||
if (ord & IMSM_ORD_REBUILD)
|
if (ord & IMSM_ORD_REBUILD)
|
||||||
skip = 1;
|
skip = 1;
|
||||||
|
|
||||||
|
@ -3685,6 +3680,7 @@ static int mark_failure(struct imsm_dev *dev, struct imsm_disk *disk, int idx)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
disk->status |= FAILED_DISK;
|
disk->status |= FAILED_DISK;
|
||||||
|
disk->status &= ~CONFIGURED_DISK;
|
||||||
set_imsm_ord_tbl_ent(map, slot, idx | IMSM_ORD_REBUILD);
|
set_imsm_ord_tbl_ent(map, slot, idx | IMSM_ORD_REBUILD);
|
||||||
if (~map->failed_disk_num == 0)
|
if (~map->failed_disk_num == 0)
|
||||||
map->failed_disk_num = slot;
|
map->failed_disk_num = slot;
|
||||||
|
|
2
util.c
2
util.c
|
@ -863,6 +863,8 @@ void wait_for(char *dev, int fd)
|
||||||
return;
|
return;
|
||||||
usleep(200000);
|
usleep(200000);
|
||||||
}
|
}
|
||||||
|
if (i == 25)
|
||||||
|
dprintf("%s: timeout waiting for %s\n", __func__, dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct superswitch *superlist[] = { &super0, &super1, &super_ddf, &super_imsm, NULL };
|
struct superswitch *superlist[] = { &super0, &super1, &super_ddf, &super_imsm, NULL };
|
||||||
|
|
Loading…
Reference in New Issue