Allow autoassembly to choose it's own name for the array.
This cannot be used yet, but it is working towards auto-assembly. When auto-assembling an array, we make a name in /dev/md/ giving a number (from the peferred minor) or name (from set-name). Signed-off-by: Neil Brown <neilb@suse.de>
This commit is contained in:
parent
83b6208e89
commit
8a46fe8487
51
Assemble.c
51
Assemble.c
|
@ -139,27 +139,29 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
|
||||||
struct mdinfo info;
|
struct mdinfo info;
|
||||||
char *avail;
|
char *avail;
|
||||||
int nextspare = 0;
|
int nextspare = 0;
|
||||||
|
|
||||||
vers = md_get_version(mdfd);
|
|
||||||
if (vers <= 0) {
|
|
||||||
fprintf(stderr, Name ": %s appears not to be an md device.\n", mddev);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
if (vers < 9000) {
|
|
||||||
fprintf(stderr, Name ": Assemble requires driver version 0.90.0 or later.\n"
|
|
||||||
" Upgrade your kernel or try --build\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
if (get_linux_version() < 2004000)
|
if (get_linux_version() < 2004000)
|
||||||
old_linux = 1;
|
old_linux = 1;
|
||||||
|
|
||||||
if (ioctl(mdfd, GET_ARRAY_INFO, &info.array)>=0) {
|
if (mdfd >= 0) {
|
||||||
fprintf(stderr, Name ": device %s already active - cannot assemble it\n",
|
vers = md_get_version(mdfd);
|
||||||
mddev);
|
if (vers <= 0) {
|
||||||
return 1;
|
fprintf(stderr, Name ": %s appears not to be an md device.\n", mddev);
|
||||||
}
|
return 1;
|
||||||
ioctl(mdfd, STOP_ARRAY, NULL); /* just incase it was started but has no content */
|
}
|
||||||
|
if (vers < 9000) {
|
||||||
|
fprintf(stderr, Name ": Assemble requires driver version 0.90.0 or later.\n"
|
||||||
|
" Upgrade your kernel or try --build\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ioctl(mdfd, GET_ARRAY_INFO, &info.array)>=0) {
|
||||||
|
fprintf(stderr, Name ": device %s already active - cannot assemble it\n",
|
||||||
|
mddev);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
ioctl(mdfd, STOP_ARRAY, NULL); /* just incase it was started but has no content */
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
* If any subdevs are listed, then any that don't
|
* If any subdevs are listed, then any that don't
|
||||||
* match ident are discarded. Remainder must all match and
|
* match ident are discarded. Remainder must all match and
|
||||||
|
@ -173,7 +175,7 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
|
||||||
ident->super_minor < 0 &&
|
ident->super_minor < 0 &&
|
||||||
ident->devices == NULL) {
|
ident->devices == NULL) {
|
||||||
fprintf(stderr, Name ": No identity information available for %s - cannot assemble.\n",
|
fprintf(stderr, Name ": No identity information available for %s - cannot assemble.\n",
|
||||||
mddev);
|
mddev ? mddev : "further assembly");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (devlist == NULL)
|
if (devlist == NULL)
|
||||||
|
@ -191,7 +193,7 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
|
||||||
|
|
||||||
if (verbose>0)
|
if (verbose>0)
|
||||||
fprintf(stderr, Name ": looking for devices for %s\n",
|
fprintf(stderr, Name ": looking for devices for %s\n",
|
||||||
mddev);
|
mddev ? mddev : "further assembly");
|
||||||
|
|
||||||
/* first walk the list of devices to find a consistent set
|
/* first walk the list of devices to find a consistent set
|
||||||
* that match the criterea, if that is possible.
|
* that match the criterea, if that is possible.
|
||||||
|
@ -332,6 +334,17 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
|
||||||
tmpdev->used = 1;
|
tmpdev->used = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mdfd < 0) {
|
||||||
|
/* So... it is up to me to open the device.
|
||||||
|
* We create a name '/dev/md/XXX' based on the info in the
|
||||||
|
* superblock, and call open_mddev on that
|
||||||
|
*/
|
||||||
|
asprintf(&mddev, "/dev/md/%s", info.name);
|
||||||
|
mdfd = open_mddev(mddev, 0);
|
||||||
|
if (mdfd < 0)
|
||||||
|
return mdfd;
|
||||||
|
}
|
||||||
|
|
||||||
/* Ok, no bad inconsistancy, we can try updating etc */
|
/* Ok, no bad inconsistancy, we can try updating etc */
|
||||||
for (tmpdev = devlist; tmpdev; tmpdev=tmpdev->next) if (tmpdev->used) {
|
for (tmpdev = devlist; tmpdev; tmpdev=tmpdev->next) if (tmpdev->used) {
|
||||||
char *devname = tmpdev->devname;
|
char *devname = tmpdev->devname;
|
||||||
|
|
2
super0.c
2
super0.c
|
@ -334,7 +334,7 @@ static void getinfo_super0(struct mdinfo *info, void *sbv)
|
||||||
} else
|
} else
|
||||||
info->reshape_active = 0;
|
info->reshape_active = 0;
|
||||||
|
|
||||||
info->name[0] = 0;
|
sprintf(info->name, "%d", sb->md_minor);
|
||||||
/* work_disks is calculated rather than read directly */
|
/* work_disks is calculated rather than read directly */
|
||||||
for (i=0; i < MD_SB_DISKS; i++)
|
for (i=0; i < MD_SB_DISKS; i++)
|
||||||
if ((sb->disks[i].state & (1<<MD_DISK_SYNC)) &&
|
if ((sb->disks[i].state & (1<<MD_DISK_SYNC)) &&
|
||||||
|
|
Loading…
Reference in New Issue