Ensure mddev_dev struct always zeroed on allocation.

There are a number of fields which should not
be left uninitialised.  e.g. attempt_re_add can get
confused if ->writemostly is not set correctly.

Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
NeilBrown 2013-03-05 11:53:51 +11:00
parent 748952f73e
commit 5e73b02409
2 changed files with 17 additions and 17 deletions

View File

@ -359,6 +359,18 @@ int Manage_runstop(char *devname, int fd, int runstop,
return rv;
}
static struct mddev_dev *add_one(struct mddev_dev *dv, char *name, char disp)
{
struct mddev_dev *new;
new = xmalloc(sizeof(*new));
memset(new, 0, sizeof(*new));
new->devname = xstrdup(name);
new->disposition = disp;
new->next = dv->next;
dv->next = new;
return new;
}
static void add_faulty(struct mddev_dev *dv, int fd, char disp)
{
mdu_array_info_t array;
@ -371,7 +383,6 @@ static void add_faulty(struct mddev_dev *dv, int fd, char disp)
remaining_disks = array.nr_disks;
for (i = 0; i < MAX_DISKS && remaining_disks > 0; i++) {
struct mddev_dev *new;
char buf[40];
disk.number = i;
if (ioctl(fd, GET_DISK_INFO, &disk) != 0)
@ -382,12 +393,7 @@ static void add_faulty(struct mddev_dev *dv, int fd, char disp)
if ((disk.state & 1) == 0) /* not faulty */
continue;
sprintf(buf, "%d:%d", disk.major, disk.minor);
new = xmalloc(sizeof(*new));
new->devname = xstrdup(buf);
new->disposition = disp;
new->next = dv->next;
dv->next = new;
dv = new;
dv = add_one(dv, buf, disp);
}
}
@ -403,7 +409,6 @@ static void add_detached(struct mddev_dev *dv, int fd, char disp)
remaining_disks = array.nr_disks;
for (i = 0; i < MAX_DISKS && remaining_disks > 0; i++) {
struct mddev_dev *new;
char buf[40];
int sfd;
disk.number = i;
@ -424,12 +429,7 @@ static void add_detached(struct mddev_dev *dv, int fd, char disp)
if (errno != ENXIO)
/* Probably not detached */
continue;
new = xmalloc(sizeof(*new));
new->devname = xstrdup(buf);
new->disposition = disp;
new->next = dv->next;
dv->next = new;
dv = new;
dv = add_one(dv, buf, disp);
}
}

View File

@ -179,9 +179,9 @@ struct mddev_dev *load_partitions(void)
if (!name)
continue;
d = xmalloc(sizeof(*d));
memset(d, 0, sizeof(*d));
d->devname = xstrdup(name);
d->next = rv;
d->used = 0;
rv = d;
}
fclose(f);
@ -203,12 +203,12 @@ struct mddev_dev *load_containers(void)
strncmp(ent->metadata_version, "external:", 9) == 0 &&
!is_subarray(&ent->metadata_version[9])) {
d = xmalloc(sizeof(*d));
memset(d, 0, sizeof(*d));
if (asprintf(&d->devname, "/dev/%s", ent->dev) < 0) {
free(d);
continue;
}
d->next = rv;
d->used = 0;
rv = d;
}
free_mdstat(mdstat);
@ -884,9 +884,9 @@ struct mddev_dev *conf_get_devs()
if (flags & GLOB_APPEND) {
for (i=0; i<globbuf.gl_pathc; i++) {
struct mddev_dev *t = xmalloc(sizeof(*t));
memset(t, 0, sizeof(*t));
t->devname = xstrdup(globbuf.gl_pathv[i]);
t->next = dlist;
t->used = 0;
dlist = t;
/* printf("one dev is %s\n", t->devname);*/
}