]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - super-ddf.c
Remove scattered checks for malloc success.
[thirdparty/mdadm.git] / super-ddf.c
index 21a917e4fc965f09a4155f983cd652d88092aa66..1ddf9d1a14a1eb387bef84b123b4cf2360d7cede 100644 (file)
@@ -543,34 +543,32 @@ static int load_ddf_headers(int fd, struct ddf_super *super, char *devname)
 
        if (lseek64(fd, dsize-512, 0) < 0) {
                if (devname)
-                       fprintf(stderr,
-                               Name": Cannot seek to anchor block on %s: %s\n",
-                               devname, strerror(errno));
+                       pr_err("Cannot seek to anchor block on %s: %s\n",
+                              devname, strerror(errno));
                return 1;
        }
        if (read(fd, &super->anchor, 512) != 512) {
                if (devname)
-                       fprintf(stderr,
-                               Name ": Cannot read anchor block on %s: %s\n",
-                               devname, strerror(errno));
+                       pr_err("Cannot read anchor block on %s: %s\n",
+                              devname, strerror(errno));
                return 1;
        }
        if (super->anchor.magic != DDF_HEADER_MAGIC) {
                if (devname)
-                       fprintf(stderr, Name ": no DDF anchor found on %s\n",
+                       pr_err("no DDF anchor found on %s\n",
                                devname);
                return 2;
        }
        if (calc_crc(&super->anchor, 512) != super->anchor.crc) {
                if (devname)
-                       fprintf(stderr, Name ": bad CRC on anchor on %s\n",
+                       pr_err("bad CRC on anchor on %s\n",
                                devname);
                return 2;
        }
        if (memcmp(super->anchor.revision, DDF_REVISION_0, 8) != 0 &&
            memcmp(super->anchor.revision, DDF_REVISION_2, 8) != 0) {
                if (devname)
-                       fprintf(stderr, Name ": can only support super revision"
+                       pr_err("can only support super revision"
                                " %.8s and earlier, not %.8s on %s\n",
                                DDF_REVISION_2, super->anchor.revision,devname);
                return 2;
@@ -579,9 +577,8 @@ static int load_ddf_headers(int fd, struct ddf_super *super, char *devname)
                            dsize >> 9,  1,
                            &super->primary, &super->anchor) == 0) {
                if (devname)
-                       fprintf(stderr,
-                               Name ": Failed to load primary DDF header "
-                               "on %s\n", devname);
+                       pr_err("Failed to load primary DDF header "
+                              "on %s\n", devname);
                return 2;
        }
        super->active = &super->primary;
@@ -652,7 +649,7 @@ static int load_ddf_local(int fd, struct ddf_super *super,
        if (posix_memalign((void**)&dl, 512,
                       sizeof(*dl) +
                       (super->max_part) * sizeof(dl->vlist[0])) != 0) {
-               fprintf(stderr, Name ": %s could not allocate disk info buffer\n",
+               pr_err("%s could not allocate disk info buffer\n",
                        __func__);
                return 1;
        }
@@ -661,7 +658,7 @@ static int load_ddf_local(int fd, struct ddf_super *super,
                     super->active->data_section_offset,
                     super->active->data_section_length,
                     0);
-       dl->devname = devname ? strdup(devname) : NULL;
+       dl->devname = devname ? xstrdup(devname) : NULL;
 
        fstat(fd, &stb);
        dl->major = major(stb.st_rdev);
@@ -706,9 +703,8 @@ static int load_ddf_local(int fd, struct ddf_super *super,
                                continue;
                        if (posix_memalign((void**)&dl->spare, 512,
                                       super->conf_rec_len*512) != 0) {
-                               fprintf(stderr, Name
-                                       ": %s could not allocate spare info buf\n",
-                                       __func__);
+                               pr_err("%s could not allocate spare info buf\n",
+                                      __func__);
                                return 1;
                        }
                                
@@ -732,9 +728,8 @@ static int load_ddf_local(int fd, struct ddf_super *super,
                        if (posix_memalign((void**)&vcl, 512,
                                       (super->conf_rec_len*512 +
                                        offsetof(struct vcl, conf))) != 0) {
-                               fprintf(stderr, Name
-                                       ": %s could not allocate vcl buf\n",
-                                       __func__);
+                               pr_err("%s could not allocate vcl buf\n",
+                                      __func__);
                                return 1;
                        }
                        vcl->next = super->conflist;
@@ -782,25 +777,23 @@ static int load_super_ddf(struct supertype *st, int fd,
        /* 32M is a lower bound */
        if (dsize <= 32*1024*1024) {
                if (devname)
-                       fprintf(stderr,
-                               Name ": %s is too small for ddf: "
-                               "size is %llu sectors.\n",
-                               devname, dsize>>9);
+                       pr_err("%s is too small for ddf: "
+                              "size is %llu sectors.\n",
+                              devname, dsize>>9);
                return 1;
        }
        if (dsize & 511) {
                if (devname)
-                       fprintf(stderr,
-                               Name ": %s is an odd size for ddf: "
-                               "size is %llu bytes.\n",
-                               devname, dsize);
+                       pr_err("%s is an odd size for ddf: "
+                              "size is %llu bytes.\n",
+                              devname, dsize);
                return 1;
        }
 
        free_super_ddf(st);
 
        if (posix_memalign((void**)&super, 512, sizeof(*super))!= 0) {
-               fprintf(stderr, Name ": malloc of %zu failed.\n",
+               pr_err("malloc of %zu failed.\n",
                        sizeof(*super));
                return 1;
        }
@@ -818,9 +811,8 @@ static int load_super_ddf(struct supertype *st, int fd,
 
        if (rv) {
                if (devname)
-                       fprintf(stderr,
-                               Name ": Failed to load all information "
-                               "sections on %s\n", devname);
+                       pr_err("Failed to load all information "
+                              "sections on %s\n", devname);
                free(super);
                return rv;
        }
@@ -829,9 +821,8 @@ static int load_super_ddf(struct supertype *st, int fd,
 
        if (rv) {
                if (devname)
-                       fprintf(stderr,
-                               Name ": Failed to load all information "
-                               "sections on %s\n", devname);
+                       pr_err("Failed to load all information "
+                              "sections on %s\n", devname);
                free(super);
                return rv;
        }
@@ -893,8 +884,7 @@ static struct supertype *match_metadata_desc_ddf(char *arg)
                )
                return NULL;
 
-       st = malloc(sizeof(*st));
-       memset(st, 0, sizeof(*st));
+       st = xcalloc(1, sizeof(*st));
        st->container_dev = NoMdDev;
        st->ss = &super_ddf;
        st->max_devs = 512;
@@ -1336,6 +1326,7 @@ static void getinfo_super_ddf(struct supertype *st, struct mdinfo *info, char *m
 {
        struct ddf_super *ddf = st->sb;
        int map_disks = info->array.raid_disks;
+       __u32 *cptr;
 
        if (ddf->currentconf) {
                getinfo_super_ddf_bvd(st, info, map);
@@ -1347,8 +1338,9 @@ static void getinfo_super_ddf(struct supertype *st, struct mdinfo *info, char *m
        info->array.level         = LEVEL_CONTAINER;
        info->array.layout        = 0;
        info->array.md_minor      = -1;
-       info->array.ctime         = DECADE + __be32_to_cpu(*(__u32*)
-                                                        (ddf->anchor.guid+16));
+       cptr = (__u32 *)(ddf->anchor.guid + 16);
+       info->array.ctime         = DECADE + __be32_to_cpu(*cptr);
+
        info->array.utime         = 0;
        info->array.chunk_size    = 0;
        info->container_enough    = 1;
@@ -1374,6 +1366,7 @@ static void getinfo_super_ddf(struct supertype *st, struct mdinfo *info, char *m
 
        info->recovery_start = MaxSector;
        info->reshape_active = 0;
+       info->recovery_blocked = 0;
        info->name[0] = 0;
 
        info->array.major_version = -1;
@@ -1406,6 +1399,7 @@ static void getinfo_super_ddf_bvd(struct supertype *st, struct mdinfo *info, cha
        int j;
        struct dl *dl;
        int map_disks = info->array.raid_disks;
+       __u32 *cptr;
 
        memset(info, 0, sizeof(*info));
        /* FIXME this returns BVD info - what if we want SVD ?? */
@@ -1415,8 +1409,8 @@ static void getinfo_super_ddf_bvd(struct supertype *st, struct mdinfo *info, cha
        info->array.layout        = rlq_to_layout(vc->conf.rlq, vc->conf.prl,
                                                  info->array.raid_disks);
        info->array.md_minor      = -1;
-       info->array.ctime         = DECADE +
-               __be32_to_cpu(*(__u32*)(vc->conf.guid+16));
+       cptr = (__u32 *)(vc->conf.guid + 16);
+       info->array.ctime         = DECADE + __be32_to_cpu(*cptr);
        info->array.utime         = DECADE + __be32_to_cpu(vc->conf.timestamp);
        info->array.chunk_size    = 512 << vc->conf.chunk_shift;
        info->custom_array_size   = 0;
@@ -1430,23 +1424,26 @@ static void getinfo_super_ddf_bvd(struct supertype *st, struct mdinfo *info, cha
        }
 
        for (dl = ddf->dlist; dl ; dl = dl->next)
-               if (dl->raiddisk == info->disk.raid_disk)
+               if (dl->raiddisk == ddf->currentdev)
                        break;
+
        info->disk.major = 0;
        info->disk.minor = 0;
+       info->disk.state = 0;
        if (dl) {
                info->disk.major = dl->major;
                info->disk.minor = dl->minor;
+               info->disk.raid_disk = dl->raiddisk;
+               info->disk.number = dl->pdnum;
+               info->disk.state = (1<<MD_DISK_SYNC)|(1<<MD_DISK_ACTIVE);
        }
-//     info->disk.number = __be32_to_cpu(ddf->disk.refnum);
-//     info->disk.raid_disk = find refnum in the table and use index;
-//     info->disk.state = ???;
 
        info->container_member = ddf->currentconf->vcnum;
 
        info->recovery_start = MaxSector;
        info->resync_start = 0;
        info->reshape_active = 0;
+       info->recovery_blocked = 0;
        if (!(ddf->virt->entries[info->container_member].state
              & DDF_state_inconsistent)  &&
            (ddf->virt->entries[info->container_member].init_state
@@ -1622,7 +1619,7 @@ static int init_super_ddf(struct supertype *st,
                return init_super_ddf_bvd(st, info, size, name, homehost, uuid);
 
        if (posix_memalign((void**)&ddf, 512, sizeof(*ddf)) != 0) {
-               fprintf(stderr, Name ": %s could not allocate superblock\n", __func__);
+               pr_err("%s could not allocate superblock\n", __func__);
                return 0;
        }
        memset(ddf, 0, sizeof(*ddf));
@@ -1760,7 +1757,7 @@ static int init_super_ddf(struct supertype *st,
                strcpy((char*)ddf->controller.vendor_data, homehost);
 
        if (posix_memalign((void**)&pd, 512, pdsize) != 0) {
-               fprintf(stderr, Name ": %s could not allocate pd\n", __func__);
+               pr_err("%s could not allocate pd\n", __func__);
                return 0;
        }
        ddf->phys = pd;
@@ -1774,7 +1771,7 @@ static int init_super_ddf(struct supertype *st,
        memset(pd->pad, 0xff, 52);
 
        if (posix_memalign((void**)&vd, 512, vdsize) != 0) {
-               fprintf(stderr, Name ": %s could not allocate vd\n", __func__);
+               pr_err("%s could not allocate vd\n", __func__);
                return 0;
        }
        ddf->virt = vd;
@@ -1920,9 +1917,7 @@ FIXME ignore DDF_Legacy devices?
        int n = 0;
        unsigned int i, j;
 
-       rv = malloc(sizeof(struct extent) * (ddf->max_part + 2));
-       if (!rv)
-               return NULL;
+       rv = xmalloc(sizeof(struct extent) * (ddf->max_part + 2));
 
        for (i = 0; i < ddf->max_part; i++) {
                struct vcl *v = dl->vlist[i];
@@ -1963,9 +1958,9 @@ static int init_super_ddf_bvd(struct supertype *st,
 
        if (__be16_to_cpu(ddf->virt->populated_vdes)
            >= __be16_to_cpu(ddf->virt->max_vdes)) {
-               fprintf(stderr, Name": This ddf already has the "
-                       "maximum of %d virtual devices\n",
-                       __be16_to_cpu(ddf->virt->max_vdes));
+               pr_err("This ddf already has the "
+                      "maximum of %d virtual devices\n",
+                      __be16_to_cpu(ddf->virt->max_vdes));
                return 0;
        }
 
@@ -1975,9 +1970,9 @@ static int init_super_ddf_bvd(struct supertype *st,
                                char *n = ddf->virt->entries[venum].name;
 
                                if (strncmp(name, n, 16) == 0) {
-                                       fprintf(stderr, Name ": This ddf already"
-                                               " has an array called %s\n",
-                                               name);
+                                       pr_err("This ddf already"
+                                              " has an array called %s\n",
+                                              name);
                                        return 0;
                                }
                        }
@@ -1986,7 +1981,7 @@ static int init_super_ddf_bvd(struct supertype *st,
                if (all_ff(ddf->virt->entries[venum].guid))
                        break;
        if (venum == __be16_to_cpu(ddf->virt->max_vdes)) {
-               fprintf(stderr, Name ": Cannot find spare slot for "
+               pr_err("Cannot find spare slot for "
                        "virtual disk - DDF is corrupt\n");
                return 0;
        }
@@ -2016,7 +2011,7 @@ static int init_super_ddf_bvd(struct supertype *st,
        /* Now create a new vd_config */
        if (posix_memalign((void**)&vcl, 512,
                           (offsetof(struct vcl, conf) + ddf->conf_rec_len * 512)) != 0) {
-               fprintf(stderr, Name ": %s could not allocate vd_config\n", __func__);
+               pr_err("%s could not allocate vd_config\n", __func__);
                return 0;
        }
        vcl->lba_offset = (__u64*) &vcl->conf.phys_refnum[ddf->mppe];
@@ -2188,6 +2183,7 @@ static int add_to_super_ddf(struct supertype *st,
        struct phys_disk_entry *pde;
        unsigned int n, i;
        struct stat stb;
+       __u32 *tptr;
 
        if (ddf->currentconf) {
                add_to_super_ddf_bvd(st, dk, fd, devname);
@@ -2200,9 +2196,8 @@ static int add_to_super_ddf(struct supertype *st,
        fstat(fd, &stb);
        if (posix_memalign((void**)&dd, 512,
                           sizeof(*dd) + sizeof(dd->vlist[0]) * ddf->max_part) != 0) {
-               fprintf(stderr, Name
-                       ": %s could allocate buffer for new disk, aborting\n",
-                       __func__);
+               pr_err("%s could allocate buffer for new disk, aborting\n",
+                      __func__);
                return 1;
        }
        dd->major = major(stb.st_rdev);
@@ -2216,8 +2211,9 @@ static int add_to_super_ddf(struct supertype *st,
        tm = localtime(&now);
        sprintf(dd->disk.guid, "%8s%04d%02d%02d",
                T10, tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday);
-       *(__u32*)(dd->disk.guid + 16) = random32();
-       *(__u32*)(dd->disk.guid + 20) = random32();
+       tptr = (__u32 *)(dd->disk.guid + 16);
+       *tptr++ = random32();
+       *tptr = random32();
 
        do {
                /* Cannot be bothered finding a CRC of some irrelevant details*/
@@ -2245,7 +2241,7 @@ static int add_to_super_ddf(struct supertype *st,
                           sizeof(struct phys_disk_entry));
                struct phys_disk *pd;
 
-               pd = malloc(len);
+               pd = xmalloc(len);
                pd->magic = DDF_PHYS_RECORDS_MAGIC;
                pd->used_pdes = __cpu_to_be16(n);
                pde = &pd->entries[0];
@@ -2303,7 +2299,7 @@ static int remove_from_super_ddf(struct supertype *st, mdu_disk_info_t *dk)
                           sizeof(struct phys_disk_entry));
                struct phys_disk *pd;
 
-               pd = malloc(len);
+               pd = xmalloc(len);
                pd->magic = DDF_PHYS_RECORDS_MAGIC;
                pd->used_pdes = __cpu_to_be16(dl->pdnum);
                pd->entries[0].state = __cpu_to_be16(DDF_Missing);
@@ -2317,8 +2313,7 @@ static int remove_from_super_ddf(struct supertype *st, mdu_disk_info_t *dk)
  * called when creating a container or adding another device to a
  * container.
  */
-
-static unsigned char null_conf[4096+512];
+#define NULL_CONF_SZ   4096
 
 static int __write_init_super_ddf(struct supertype *st)
 {
@@ -2331,6 +2326,12 @@ static int __write_init_super_ddf(struct supertype *st)
        int attempts = 0;
        int successes = 0;
        unsigned long long size, sector;
+       char *null_aligned;
+
+       if (posix_memalign((void**)&null_aligned, 4096, NULL_CONF_SZ) != 0) {
+               return -ENOMEM;
+       }
+       memset(null_aligned, 0xff, NULL_CONF_SZ);
 
        /* try to write updated metadata,
         * if we catch a failure move on to the next disk
@@ -2400,14 +2401,11 @@ static int __write_init_super_ddf(struct supertype *st)
                                if (write(fd, &c->conf, conf_size) < 0)
                                        break;
                        } else {
-                               char *null_aligned = (char*)((((unsigned long)null_conf)+511)&~511UL);
-                               if (null_conf[0] != 0xff)
-                                       memset(null_conf, 0xff, sizeof(null_conf));
                                unsigned int togo = conf_size;
-                               while (togo > sizeof(null_conf)-512) {
-                                       if (write(fd, null_aligned, sizeof(null_conf)-512) < 0)
+                               while (togo > NULL_CONF_SZ) {
+                                       if (write(fd, null_aligned, NULL_CONF_SZ) < 0)
                                                break;
-                                       togo -= sizeof(null_conf)-512;
+                                       togo -= NULL_CONF_SZ;
                                }
                                if (write(fd, null_aligned, togo) < 0)
                                        break;
@@ -2426,6 +2424,7 @@ static int __write_init_super_ddf(struct supertype *st)
                        continue;
                successes++;
        }
+       free(null_aligned);
 
        return attempts != successes;
 }
@@ -2461,7 +2460,7 @@ static int write_init_super_ddf(struct supertype *st)
 
                /* First the virtual disk.  We have a slightly fake header */
                len = sizeof(struct virtual_disk) + sizeof(struct virtual_entry);
-               vd = malloc(len);
+               vd = xmalloc(len);
                *vd = *ddf->virt;
                vd->entries[0] = ddf->virt->entries[currentconf->vcnum];
                vd->populated_vdes = __cpu_to_be16(currentconf->vcnum);
@@ -2469,7 +2468,7 @@ static int write_init_super_ddf(struct supertype *st)
 
                /* Then the vd_config */
                len = ddf->conf_rec_len * 512;
-               vc = malloc(len);
+               vc = xmalloc(len);
                memcpy(vc, &currentconf->conf, len);
                append_metadata_update(st, vc, len);
 
@@ -2542,7 +2541,7 @@ static int reserve_space(struct supertype *st, int raiddisks,
                free(e);
        }
        if (cnt < raiddisks) {
-               fprintf(stderr, Name ": not enough devices with space to create array.\n");
+               pr_err("not enough devices with space to create array.\n");
                return 0; /* No enough free spaces large enough */
        }
        if (size == 0) {
@@ -2553,7 +2552,7 @@ static int reserve_space(struct supertype *st, int raiddisks,
                                continue;
                        /* This is bigger than 'size', see if there are enough */
                        cnt = 0;
-                       for (dl2 = dl; dl2 ; dl2=dl2->next)
+                       for (dl2 = ddf->dlist; dl2 ; dl2=dl2->next)
                                if (dl2->esize >= dl->esize)
                                        cnt++;
                        if (cnt >= raiddisks)
@@ -2565,7 +2564,7 @@ static int reserve_space(struct supertype *st, int raiddisks,
                }
                *freesize = size;
                if (size < 32) {
-                       fprintf(stderr, Name ": not enough spare devices to create array.\n");
+                       pr_err("not enough spare devices to create array.\n");
                        return 0;
                }
        }
@@ -2634,7 +2633,7 @@ static int validate_geometry_ddf(struct supertype *st,
                                break;
                if (ddf_level_num[i].num1 == MAXINT) {
                        if (verbose)
-                               fprintf(stderr, Name ": DDF does not support level %d arrays\n",
+                               pr_err("DDF does not support level %d arrays\n",
                                        level);
                        return 0;
                }
@@ -2683,15 +2682,14 @@ static int validate_geometry_ddf(struct supertype *st,
                }
 
                if (verbose)
-                       fprintf(stderr,
-                               Name ": ddf: Cannot create this array "
-                               "on device %s - a container is required.\n",
-                               dev);
+                       pr_err("ddf: Cannot create this array "
+                              "on device %s - a container is required.\n",
+                              dev);
                return 0;
        }
        if (errno != EBUSY || (fd = open(dev, O_RDONLY, 0)) < 0) {
                if (verbose)
-                       fprintf(stderr, Name ": ddf: Cannot open %s: %s\n",
+                       pr_err("ddf: Cannot open %s: %s\n",
                                dev, strerror(errno));
                return 0;
        }
@@ -2700,7 +2698,7 @@ static int validate_geometry_ddf(struct supertype *st,
        if (cfd < 0) {
                close(fd);
                if (verbose)
-                       fprintf(stderr, Name ": ddf: Cannot use %s: %s\n",
+                       pr_err("ddf: Cannot use %s: %s\n",
                                dev, strerror(EBUSY));
                return 0;
        }
@@ -2746,7 +2744,7 @@ validate_geometry_ddf_container(struct supertype *st,
        fd = open(dev, O_RDONLY|O_EXCL, 0);
        if (fd < 0) {
                if (verbose)
-                       fprintf(stderr, Name ": ddf: Cannot open %s: %s\n",
+                       pr_err("ddf: Cannot open %s: %s\n",
                                dev, strerror(errno));
                return 0;
        }
@@ -2779,7 +2777,7 @@ static int validate_geometry_ddf_bvd(struct supertype *st,
        /* ddf/bvd supports lots of things, but not containers */
        if (level == LEVEL_CONTAINER) {
                if (verbose)
-                       fprintf(stderr, Name ": DDF cannot create a container within an container\n");
+                       pr_err("DDF cannot create a container within an container\n");
                return 0;
        }
        /* We must have the container info already read in. */
@@ -2816,10 +2814,9 @@ static int validate_geometry_ddf_bvd(struct supertype *st,
                }
                if (dcnt < raiddisks) {
                        if (verbose)
-                               fprintf(stderr,
-                                       Name ": ddf: Not enough devices with "
-                                       "space for this array (%d < %d)\n",
-                                       dcnt, raiddisks);
+                               pr_err("ddf: Not enough devices with "
+                                      "space for this array (%d < %d)\n",
+                                      dcnt, raiddisks);
                        return 0;
                }
                return 1;
@@ -2836,7 +2833,7 @@ static int validate_geometry_ddf_bvd(struct supertype *st,
        }
        if (!dl) {
                if (verbose)
-                       fprintf(stderr, Name ": ddf: %s is not in the "
+                       pr_err("ddf: %s is not in the "
                                "same DDF set\n",
                                dev);
                return 0;
@@ -2963,14 +2960,14 @@ static struct mdinfo *container_content_ddf(struct supertype *st, char *subarray
                unsigned int j;
                struct mdinfo *this;
                char *ep;
+               __u32 *cptr;
 
                if (subarray &&
                    (strtoul(subarray, &ep, 10) != vc->vcnum ||
                     *ep != '\0'))
                        continue;
 
-               this = malloc(sizeof(*this));
-               memset(this, 0, sizeof(*this));
+               this = xcalloc(1, sizeof(*this));
                this->next = rest;
                rest = this;
 
@@ -2982,8 +2979,8 @@ static struct mdinfo *container_content_ddf(struct supertype *st, char *subarray
                this->array.md_minor      = -1;
                this->array.major_version = -1;
                this->array.minor_version = -2;
-               this->array.ctime         = DECADE +
-                       __be32_to_cpu(*(__u32*)(vc->conf.guid+16));
+               cptr = (__u32 *)(vc->conf.guid + 16);
+               this->array.ctime         = DECADE + __be32_to_cpu(*cptr);
                this->array.utime         = DECADE +
                        __be32_to_cpu(vc->conf.timestamp);
                this->array.chunk_size    = 512 << vc->conf.chunk_shift;
@@ -3048,8 +3045,7 @@ static struct mdinfo *container_content_ddf(struct supertype *st, char *subarray
                                /* Haven't found that one yet, maybe there are others */
                                continue;
 
-                       dev = malloc(sizeof(*dev));
-                       memset(dev, 0, sizeof(*dev));
+                       dev = xcalloc(1, sizeof(*dev));
                        dev->next = this->devs;
                        this->devs = dev;
 
@@ -3741,10 +3737,7 @@ static struct mdinfo *ddf_activate_spare(struct active_array *a,
                        }
 
                        /* Cool, we have a device with some space at pos */
-                       di = malloc(sizeof(*di));
-                       if (!di)
-                               continue;
-                       memset(di, 0, sizeof(*di));
+                       di = xcalloc(1, sizeof(*di));
                        di->disk.number = i;
                        di->disk.raid_disk = i;
                        di->disk.major = dl->major;
@@ -3776,22 +3769,12 @@ static struct mdinfo *ddf_activate_spare(struct active_array *a,
         * Create a metadata_update record to update the
         * phys_refnum and lba_offset values
         */
-       mu = malloc(sizeof(*mu));
-       if (mu && posix_memalign(&mu->space, 512, sizeof(struct vcl)) != 0) {
+       mu = xmalloc(sizeof(*mu));
+       if (posix_memalign(&mu->space, 512, sizeof(struct vcl)) != 0) {
                free(mu);
                mu = NULL;
        }
-       if (!mu) {
-               while (rv) {
-                       struct mdinfo *n = rv->next;
-
-                       free(rv);
-                       rv = n;
-               }
-               return NULL;
-       }
-               
-       mu->buf = malloc(ddf->conf_rec_len * 512);
+       mu->buf = xmalloc(ddf->conf_rec_len * 512);
        mu->len = ddf->conf_rec_len * 512;
        mu->space = NULL;
        mu->space_list = NULL;