summaryrefslogtreecommitdiffstats
path: root/Assemble.c
diff options
context:
space:
mode:
authorNeil Brown <neilb@suse.de>2005-08-15 06:35:38 +0000
committerNeil Brown <neilb@suse.de>2005-08-15 06:35:38 +0000
commit6a41304b0577df0b75e866f295996220738baeb2 (patch)
treed9a0a5123b953e26e2716c5d889cc5100a0e5815 /Assemble.c
parentdab6685f3d9982b697d938d99737897ea8ac768c (diff)
downloadmdadm-6a41304b0577df0b75e866f295996220738baeb2.tar.gz
mdadm-6a41304b0577df0b75e866f295996220738baeb2.tar.xz
mdadm-6a41304b0577df0b75e866f295996220738baeb2.zip
Fix but when assembling v1 arrays
Because raid_disk and disk.number are not longer in-sync, it needed some work. Signed-off-by: Neil Brown <neilb@cse.unsw.edu.au>
Diffstat (limited to 'Assemble.c')
-rw-r--r--Assemble.c22
1 files changed, 12 insertions, 10 deletions
diff --git a/Assemble.c b/Assemble.c
index 7ef1cd4..6a044b2 100644
--- a/Assemble.c
+++ b/Assemble.c
@@ -101,6 +101,7 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
int uptodate;
int state;
int raid_disk;
+ int disk_nr;
} *devices;
int *best = NULL; /* indexed by raid_disk */
unsigned int bestcnt = 0;
@@ -182,7 +183,7 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
if (ident->devices &&
!match_oneof(ident->devices, devname)) {
- if (inargv || verbose > 0)
+ if ((inargv && verbose>=0) || verbose > 0)
fprintf(stderr, Name ": %s is not one of %s\n", devname, ident->devices);
continue;
}
@@ -194,7 +195,7 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
dfd = open(devname, O_RDONLY|O_EXCL, 0);
if (dfd < 0) {
- if (inargv || verbose > 0)
+ if ((inargv && verbose >= 0) || verbose > 0)
fprintf(stderr, Name ": cannot open device %s: %s\n",
devname, strerror(errno));
} else if (fstat(dfd, &stb)< 0) {
@@ -207,10 +208,10 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
devname);
close(dfd);
} else if (!tst && (tst = guess_super(dfd)) == NULL) {
- if (inargv || verbose > 0)
+ if ((inargv && verbose >= 0) || verbose > 0)
fprintf(stderr, Name ": no recogniseable superblock\n");
} else if (tst->ss->load_super(tst,dfd, &super, NULL)) {
- if (inargv || verbose > 0)
+ if ((inargv && verbose >= 0) || verbose > 0)
fprintf( stderr, Name ": no RAID superblock on %s\n",
devname);
close(dfd);
@@ -221,35 +222,35 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
if (ident->uuid_set &&
(!super || same_uuid(info.uuid, ident->uuid, tst->ss->swapuuid)==0)) {
- if (inargv || verbose > 0)
+ if ((inargv && verbose >= 0) || verbose > 0)
fprintf(stderr, Name ": %s has wrong uuid.\n",
devname);
continue;
}
if (ident->name[0] &&
(!super || strncmp(ident2.name, ident->name, 32)!=0)) {
- if (inargv || verbose > 0)
+ if ((inargv && verbose >= 0) || verbose > 0)
fprintf(stderr, Name ": %s has wrong name.\n",
devname);
continue;
}
if (ident->super_minor != UnSet &&
(!super || ident->super_minor != info.array.md_minor)) {
- if (inargv || verbose > 0)
+ if ((inargv && verbose >= 0) || verbose > 0)
fprintf(stderr, Name ": %s has wrong super-minor.\n",
devname);
continue;
}
if (ident->level != UnSet &&
(!super|| ident->level != info.array.level)) {
- if (inargv || verbose > 0)
+ if ((inargv && verbose >= 0) || verbose > 0)
fprintf(stderr, Name ": %s has wrong raid level.\n",
devname);
continue;
}
if (ident->raid_disks != UnSet &&
(!super || ident->raid_disks!= info.array.raid_disks)) {
- if (inargv || verbose > 0)
+ if ((inargv && verbose >= 0) || verbose > 0)
fprintf(stderr, Name ": %s requires wrong number of drives.\n",
devname);
continue;
@@ -305,6 +306,7 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
devices[devcnt].oldminor = info.disk.minor;
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].state = info.disk.state;
if (most_recent < devcnt) {
@@ -484,7 +486,7 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
continue;
if (!devices[j].uptodate)
continue;
- info.disk.number = i;
+ info.disk.number = devices[j].disk_nr;
info.disk.raid_disk = i;
info.disk.state = desired_state;