Factor out add-disk code

The variety of approaches to 'add_disk' are factored out into
a separate function, and Incremental mode benefits by being
closer to supporting the assembly of containers.

Also remove the adding-to-array-data-structure out of sysfs_add_disk
and into add_disk.

And add some tests for --incremental mode to make sure we don't break it.

Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
NeilBrown 2008-09-18 15:13:32 +10:00
parent 9b2a22d319
commit 7801ac2092
11 changed files with 60 additions and 35 deletions

View File

@ -844,10 +844,10 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
/* Almost ready to actually *do* something */
if (!old_linux) {
struct mdinfo *sra = NULL;
int rv;
#ifndef MDASSEMBLE
struct mdinfo *sra = NULL;
if (st->ss->external) {
char ver[100];
strcat(strcpy(ver, "external:"), info.text_version);
@ -913,13 +913,8 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
j = chosen_drive;
if (j >= 0 /* && devices[j].uptodate */) {
#ifndef MDASSEMBLE
if (st->ss->external)
rv = sysfs_add_disk(sra, &devices[j].i);
else
#endif
rv = ioctl(mdfd, ADD_NEW_DISK,
&devices[j].i.disk);
rv = add_disk(mdfd, st, sra, &devices[j].i);
if (rv) {
fprintf(stderr, Name ": failed to add "
"%s to %s: %s\n",

View File

@ -714,11 +714,7 @@ int Create(struct supertype *st, char *mddev, int mdfd,
inf->errors = 0;
rv = 0;
if (st->ss->external)
rv = sysfs_add_disk(sra, inf);
else
rv = ioctl(mdfd, ADD_NEW_DISK,
&inf->disk);
rv = add_disk(mdfd, st, sra, inf);
if (rv) {
fprintf(stderr,

View File

@ -299,7 +299,6 @@ int Incremental(char *devname, int verbose, int runstop,
/* - create the array */
/* - add the device */
mdu_array_info_t ainf;
mdu_disk_info_t disk;
struct mdinfo *sra;
memset(&ainf, 0, sizeof(ainf));
@ -314,17 +313,19 @@ int Incremental(char *devname, int verbose, int runstop,
}
sra = sysfs_read(mdfd, devnum, GET_VERSION);
sysfs_set_str(sra, NULL, "metadata_version", info.text_version);
memset(&disk, 0, sizeof(disk));
disk.major = major(stb.st_rdev);
disk.minor = minor(stb.st_rdev);
sysfs_free(sra);
if (ioctl(mdfd, ADD_NEW_DISK, &disk) != 0) {
st->ss->getinfo_super(st, &info);
info.disk.major = major(stb.st_rdev);
info.disk.minor = minor(stb.st_rdev);
if (add_disk(mdfd, st, sra, &info) != 0) {
fprintf(stderr, Name ": failed to add %s to %s: %s.\n",
devname, chosen_name, strerror(errno));
ioctl(mdfd, STOP_ARRAY, 0);
close(mdfd);
sysfs_free(sra);
return 2;
}
sysfs_free(sra);
sra = sysfs_read(mdfd, devnum, GET_DEVS);
if (!sra || !sra->devs || sra->devs->disk.raid_disk >= 0) {
/* It really should be 'none' - must be old buggy
@ -346,7 +347,6 @@ int Incremental(char *devname, int verbose, int runstop,
/* - add the device */
char dn[20];
int dfd2;
mdu_disk_info_t disk;
int err;
struct mdinfo *sra;
struct supertype *st2;
@ -378,17 +378,16 @@ int Incremental(char *devname, int verbose, int runstop,
close(mdfd);
return 2;
}
memset(&disk, 0, sizeof(disk));
disk.major = major(stb.st_rdev);
disk.minor = minor(stb.st_rdev);
err = ioctl(mdfd, ADD_NEW_DISK, &disk);
info2.disk.major = major(stb.st_rdev);
info2.disk.minor = minor(stb.st_rdev);
err = add_disk(mdfd, st2, sra, &info2);
if (err < 0 && errno == EBUSY) {
/* could be another device present with the same
* disk.number. Find and reject any such
*/
find_reject(mdfd, st, sra, info.disk.number,
info.events, verbose, chosen_name);
err = ioctl(mdfd, ADD_NEW_DISK, &disk);
err = add_disk(mdfd, st2, sra, &info2);
}
if (err < 0) {
fprintf(stderr, Name ": failed to add %s to %s: %s.\n",

View File

@ -346,7 +346,11 @@ static void manage_member(struct mdstat_ent *mdstat,
struct mdinfo *newd;
if (sysfs_add_disk(&newa->info, d) < 0)
continue;
newd = newa->info.devs;
newd = malloc(sizeof(*newd));
*newd = *d;
newd->next = newa->info.devs;
newa->info.devs = newd;
newd->state_fd = sysfs_open(a->devnum,
newd->sys_name,
"state");

View File

@ -767,6 +767,8 @@ extern unsigned long long calc_array_size(int level, int raid_disks, int layout,
extern int flush_metadata_updates(struct supertype *st);
extern void append_metadata_update(struct supertype *st, void *buf, int len);
extern int add_disk(int mdfd, struct supertype *st,
struct mdinfo *sra, struct mdinfo *info);
extern char *human_size(long long bytes);
char *human_size_brief(long long bytes);

View File

@ -1796,7 +1796,7 @@ static int create_array(struct supertype *st)
return 0;
}
static int add_disk(struct supertype *st)
static int _add_disk(struct supertype *st)
{
struct intel_super *super = st->sb;
size_t len;
@ -1833,7 +1833,7 @@ static int write_init_super_imsm(struct supertype *st)
/* in the add disk case we are running in mdmon
* context, so don't close fd's
*/
return add_disk(st);
return _add_disk(st);
} else
rv = create_array(st);

View File

@ -456,7 +456,6 @@ int sysfs_add_disk(struct mdinfo *sra, struct mdinfo *sd)
{
char dv[100];
char nm[100];
struct mdinfo *sd2;
char *dname;
int rv;
@ -482,12 +481,6 @@ int sysfs_add_disk(struct mdinfo *sra, struct mdinfo *sd)
rv |= sysfs_set_num(sra, sd, "slot", sd->disk.raid_disk);
// rv |= sysfs_set_str(sra, sd, "state", "in_sync");
}
if (! rv) {
sd2 = malloc(sizeof(*sd2));
*sd2 = *sd;
sd2->next = sra->devs;
sra->devs = sd2;
}
return rv;
}

1
test
View File

@ -155,6 +155,7 @@ testdev() {
dsize=$[dvsize/chunk]
dsize=$[dsize*chunk]
rasize=$[dsize*2*cnt]
if [ `/sbin/blockdev --getsize $dev` -eq 0 ]; then sleep 2 ; fi
if [ $rasize -ne `/sbin/blockdev --getsize $dev` ]
then
echo "ERROR: size is wrong for $dev: $cnt * $dvsize (chunk=$chunk) = $rasize, not `/sbin/blockdev --getsize $dev`"

View File

@ -129,3 +129,10 @@ echo " metadata=1 devices=$dev0,$dev1,$dev2" >> $conf
mdadm --assemble --scan --config=$conf $md2
$tst
mdadm -S $md2
# Now use incremental assembly.
mdadm -I --config=$conf $dev0
mdadm -I --config=$conf $dev1
mdadm -I --config=$conf $dev2
$tst
mdadm -S $md2

View File

@ -113,3 +113,10 @@ echo " metadata=1.0 devices=$dev0,$dev1,$dev2" >> $conf
mdadm --assemble --scan --config=$conf $md1
check state U_U
eval $tst
# And now assemble with -I
mdadm -Ss
mdadm -I -c $conf $dev0
mdadm -I -c $conf $dev1
mdadm -I -c $conf $dev2
eval $tst

21
util.c
View File

@ -999,6 +999,27 @@ int open_container(int fd)
return -1;
}
int add_disk(int mdfd, struct supertype *st,
struct mdinfo *sra, struct mdinfo *info)
{
/* Add a device to an array, in one of 2 ways. */
int rv;
#ifndef MDASSEMBLE
if (st->ss->external) {
rv = sysfs_add_disk(sra, info);
if (! rv) {
struct mdinfo *sd2;
sd2 = malloc(sizeof(*sd2));
*sd2 = *info;
sd2->next = sra->devs;
sra->devs = sd2;
}
} else
#endif
rv = ioctl(mdfd, ADD_NEW_DISK, &info->disk);
return rv;
}
char *devnum2devname(int num)
{
char name[100];