Some tidy up of 'devices' in assemble.

use "mdinfo" in the devices list rather than just copying
ad-hoc fields in.
This commit is contained in:
Neil Brown 2007-12-14 20:14:53 +11:00
parent 61255666e2
commit 213ee40bd2
1 changed files with 56 additions and 56 deletions

View File

@ -117,12 +117,10 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
int vers = 0; /* Keep gcc quite - it really is initialised */ int vers = 0; /* Keep gcc quite - it really is initialised */
struct { struct {
char *devname; char *devname;
unsigned int major, minor; int uptodate; /* set once we decide that this device is as
long long events; * recent as everything else in the array.
int uptodate; */
int state; struct mdinfo i;
int raid_disk;
int disk_nr;
} *devices; } *devices;
int *best = NULL; /* indexed by raid_disk */ int *best = NULL; /* indexed by raid_disk */
unsigned int bestcnt = 0; unsigned int bestcnt = 0;
@ -500,23 +498,20 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
fprintf(stderr, Name ": %s is identified as a member of %s, slot %d.\n", fprintf(stderr, Name ": %s is identified as a member of %s, slot %d.\n",
devname, mddev, info.disk.raid_disk); devname, mddev, info.disk.raid_disk);
devices[devcnt].devname = devname; devices[devcnt].devname = devname;
devices[devcnt].major = major(stb.st_rdev);
devices[devcnt].minor = minor(stb.st_rdev);
devices[devcnt].events = info.events;
devices[devcnt].raid_disk = info.disk.raid_disk;
devices[devcnt].disk_nr = info.disk.number;
devices[devcnt].uptodate = 0; devices[devcnt].uptodate = 0;
devices[devcnt].state = info.disk.state; devices[devcnt].i = info;
devices[devcnt].i.disk.major = major(stb.st_rdev);
devices[devcnt].i.disk.minor = minor(stb.st_rdev);
if (most_recent < devcnt) { if (most_recent < devcnt) {
if (devices[devcnt].events if (devices[devcnt].i.events
> devices[most_recent].events) > devices[most_recent].i.events)
most_recent = devcnt; most_recent = devcnt;
} }
if (info.array.level == -4) if (info.array.level == -4)
/* with multipath, the raid_disk from the superblock is meaningless */ /* with multipath, the raid_disk from the superblock is meaningless */
i = devcnt; i = devcnt;
else else
i = devices[devcnt].raid_disk; i = devices[devcnt].i.disk.raid_disk;
if (i+1 == 0) { if (i+1 == 0) {
if (nextspare < info.array.raid_disks) if (nextspare < info.array.raid_disks)
nextspare = info.array.raid_disks; nextspare = info.array.raid_disks;
@ -541,10 +536,12 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
bestcnt = newbestcnt; bestcnt = newbestcnt;
} }
if (best[i] >=0 && if (best[i] >=0 &&
devices[best[i]].events == devices[devcnt].events && devices[best[i]].i.events
devices[best[i]].minor != devices[devcnt].minor && == devices[devcnt].i.events
st->ss->major == 0 && && (devices[best[i]].i.disk.minor
info.array.level != -4) { != devices[devcnt].i.disk.minor)
&& st->ss->major == 0
&& info.array.level != -4) {
/* two different devices with identical superblock. /* two different devices with identical superblock.
* Could be a mis-detection caused by overlapping * Could be a mis-detection caused by overlapping
* partitions. fail-safe. * partitions. fail-safe.
@ -563,7 +560,8 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
return 1; return 1;
} }
if (best[i] == -1 if (best[i] == -1
|| devices[best[i]].events < devices[devcnt].events) || (devices[best[i]].i.events
< devices[devcnt].i.events))
best[i] = devcnt; best[i] = devcnt;
} }
devcnt++; devcnt++;
@ -600,13 +598,14 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
* as they don't make sense * as they don't make sense
*/ */
if (info.array.level != -4) if (info.array.level != -4)
if (!(devices[j].state & (1<<MD_DISK_SYNC))) { if (!(devices[j].i.disk.state & (1<<MD_DISK_SYNC))) {
if (!(devices[j].state & (1<<MD_DISK_FAULTY))) if (!(devices[j].i.disk.state
& (1<<MD_DISK_FAULTY)))
sparecnt++; sparecnt++;
continue; continue;
} }
if (devices[j].events+event_margin >= if (devices[j].i.events+event_margin >=
devices[most_recent].events) { devices[most_recent].i.events) {
devices[j].uptodate = 1; devices[j].uptodate = 1;
if (i < info.array.raid_disks) { if (i < info.array.raid_disks) {
okcnt++; okcnt++;
@ -630,25 +629,27 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
int j = best[i]; int j = best[i];
if (j>=0 && if (j>=0 &&
!devices[j].uptodate && !devices[j].uptodate &&
devices[j].events > 0 && devices[j].i.events > 0 &&
(chosen_drive < 0 || (chosen_drive < 0 ||
devices[j].events > devices[chosen_drive].events)) devices[j].i.events
> devices[chosen_drive].i.events))
chosen_drive = j; chosen_drive = j;
} }
if (chosen_drive < 0) if (chosen_drive < 0)
break; break;
current_events = devices[chosen_drive].events; current_events = devices[chosen_drive].i.events;
add_another: add_another:
if (verbose >= 0) if (verbose >= 0)
fprintf(stderr, Name ": forcing event count in %s(%d) from %d upto %d\n", fprintf(stderr, Name ": forcing event count in %s(%d) from %d upto %d\n",
devices[chosen_drive].devname, devices[chosen_drive].raid_disk, devices[chosen_drive].devname,
(int)(devices[chosen_drive].events), devices[chosen_drive].i.disk.raid_disk,
(int)(devices[most_recent].events)); (int)(devices[chosen_drive].i.events),
(int)(devices[most_recent].i.events));
fd = dev_open(devices[chosen_drive].devname, O_RDWR|O_EXCL); fd = dev_open(devices[chosen_drive].devname, O_RDWR|O_EXCL);
if (fd < 0) { if (fd < 0) {
fprintf(stderr, Name ": Couldn't open %s for write - not updating\n", fprintf(stderr, Name ": Couldn't open %s for write - not updating\n",
devices[chosen_drive].devname); devices[chosen_drive].devname);
devices[chosen_drive].events = 0; devices[chosen_drive].i.events = 0;
continue; continue;
} }
tst = dup_super(st); tst = dup_super(st);
@ -656,10 +657,10 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
close(fd); close(fd);
fprintf(stderr, Name ": RAID superblock disappeared from %s - not updating.\n", fprintf(stderr, Name ": RAID superblock disappeared from %s - not updating.\n",
devices[chosen_drive].devname); devices[chosen_drive].devname);
devices[chosen_drive].events = 0; devices[chosen_drive].i.events = 0;
continue; continue;
} }
info.events = devices[most_recent].events; info.events = devices[most_recent].i.events;
tst->ss->update_super(tst, &info, "force-one", tst->ss->update_super(tst, &info, "force-one",
devices[chosen_drive].devname, verbose, devices[chosen_drive].devname, verbose,
0, NULL); 0, NULL);
@ -668,12 +669,12 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
close(fd); close(fd);
fprintf(stderr, Name ": Could not re-write superblock on %s\n", fprintf(stderr, Name ": Could not re-write superblock on %s\n",
devices[chosen_drive].devname); devices[chosen_drive].devname);
devices[chosen_drive].events = 0; devices[chosen_drive].i.events = 0;
tst->ss->free_super(tst); tst->ss->free_super(tst);
continue; continue;
} }
close(fd); close(fd);
devices[chosen_drive].events = devices[most_recent].events; devices[chosen_drive].i.events = devices[most_recent].i.events;
devices[chosen_drive].uptodate = 1; devices[chosen_drive].uptodate = 1;
avail[chosen_drive] = 1; avail[chosen_drive] = 1;
okcnt++; okcnt++;
@ -686,8 +687,8 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
int j = best[i]; int j = best[i];
if (j >= 0 && if (j >= 0 &&
!devices[j].uptodate && !devices[j].uptodate &&
devices[j].events > 0 && devices[j].i.events > 0 &&
devices[j].events == current_events) { devices[j].i.events == current_events) {
chosen_drive = j; chosen_drive = j;
goto add_another; goto add_another;
} }
@ -745,12 +746,10 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
continue; continue;
if (!devices[j].uptodate) if (!devices[j].uptodate)
continue; continue;
info.disk.number = devices[j].disk_nr;
info.disk.raid_disk = i;
info.disk.state = desired_state;
if (devices[j].uptodate && devices[j].i.disk.state = desired_state;
st->ss->update_super(st, &info, "assemble", NULL,
if (st->ss->update_super(st, &devices[j].i, "assemble", NULL,
verbose, 0, NULL)) { verbose, 0, NULL)) {
if (force) { if (force) {
if (verbose >= 0) if (verbose >= 0)
@ -766,8 +765,7 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
} }
} }
#if 0 #if 0
if (!devices[j].uptodate && if (!(super.disks[i].i.disk.state & (1 << MD_DISK_FAULTY))) {
!(super.disks[i].state & (1 << MD_DISK_FAULTY))) {
fprintf(stderr, Name ": devices %d of %s is not marked FAULTY in superblock, but cannot be found\n", fprintf(stderr, Name ": devices %d of %s is not marked FAULTY in superblock, but cannot be found\n",
i, mddev); i, mddev);
} }
@ -894,24 +892,26 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
j = chosen_drive; j = chosen_drive;
if (j >= 0 /* && devices[j].uptodate */) { if (j >= 0 /* && devices[j].uptodate */) {
mdu_disk_info_t disk; if (ioctl(mdfd, ADD_NEW_DISK,
memset(&disk, 0, sizeof(disk)); &devices[j].i.disk)!=0) {
disk.major = devices[j].major; fprintf(stderr, Name ": failed to add "
disk.minor = devices[j].minor; "%s to %s: %s\n",
if (ioctl(mdfd, ADD_NEW_DISK, &disk)!=0) {
fprintf(stderr, Name ": failed to add %s to %s: %s\n",
devices[j].devname, devices[j].devname,
mddev, mddev,
strerror(errno)); strerror(errno));
if (i < info.array.raid_disks || i == bestcnt) if (i < info.array.raid_disks
|| i == bestcnt)
okcnt--; okcnt--;
else else
sparecnt--; sparecnt--;
} else if (verbose > 0) } else if (verbose > 0)
fprintf(stderr, Name ": added %s to %s as %d\n", fprintf(stderr, Name ": added %s "
devices[j].devname, mddev, devices[j].raid_disk); "to %s as %d\n",
devices[j].devname, mddev,
devices[j].i.disk.raid_disk);
} else if (verbose > 0 && i < info.array.raid_disks) } else if (verbose > 0 && i < info.array.raid_disks)
fprintf(stderr, Name ": no uptodate device for slot %d of %s\n", fprintf(stderr, Name ": no uptodate device for "
"slot %d of %s\n",
i, mddev); i, mddev);
} }
@ -1016,8 +1016,8 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
* so we can just start the array * so we can just start the array
*/ */
unsigned long dev; unsigned long dev;
dev = makedev(devices[chosen_drive].major, dev = makedev(devices[chosen_drive].i.disk.major,
devices[chosen_drive].minor); devices[chosen_drive].i.disk.minor);
if (ioctl(mdfd, START_ARRAY, dev)) { if (ioctl(mdfd, START_ARRAY, dev)) {
fprintf(stderr, Name ": Cannot start array: %s\n", fprintf(stderr, Name ": Cannot start array: %s\n",
strerror(errno)); strerror(errno));