summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Create.c8
-rw-r--r--Manage.c9
-rw-r--r--mdadm.h2
-rw-r--r--super-ddf.c8
-rw-r--r--super-intel.c18
-rw-r--r--super0.c4
-rw-r--r--super1.c4
7 files changed, 35 insertions, 18 deletions
diff --git a/Create.c b/Create.c
index 783ab09..424be12 100644
--- a/Create.c
+++ b/Create.c
@@ -705,8 +705,12 @@ int Create(struct supertype *st, char *mddev,
inf->disk.minor = minor(stb.st_rdev);
remove_partitions(fd);
- st->ss->add_to_super(st, &inf->disk,
- fd, dv->devname);
+ if (st->ss->add_to_super(st, &inf->disk,
+ fd, dv->devname)) {
+ fprintf(stderr, Name ": failed to add %s\n",
+ dv->devname);
+ goto abort;
+ }
st->ss->getinfo_super(st, inf);
safe_mode_delay = inf->safe_mode_delay;
diff --git a/Manage.c b/Manage.c
index ccc13c4..4998c94 100644
--- a/Manage.c
+++ b/Manage.c
@@ -624,8 +624,13 @@ int Manage_subdevs(char *devname, int fd,
if (dv->writemostly == 1)
disc.state |= 1 << MD_DISK_WRITEMOSTLY;
dfd = open(dv->devname, O_RDWR | O_EXCL|O_DIRECT);
- tst->ss->add_to_super(tst, &disc, dfd,
- dv->devname);
+ if (tst->ss->add_to_super(tst, &disc, dfd,
+ dv->devname)) {
+ fprintf(stderr, Name ": failed to add %s\n",
+ dv->devname);
+ close(dfd);
+ return 1;
+ }
/* write_init_super will close 'dfd' */
if (tst->ss->external)
/* mdmon will write the metadata */
diff --git a/mdadm.h b/mdadm.h
index f7fd53e..05b79ba 100644
--- a/mdadm.h
+++ b/mdadm.h
@@ -503,7 +503,7 @@ extern struct superswitch {
/* update the metadata to include new device, either at create or
* when hot-adding a spare.
*/
- void (*add_to_super)(struct supertype *st, mdu_disk_info_t *dinfo,
+ int (*add_to_super)(struct supertype *st, mdu_disk_info_t *dinfo,
int fd, char *devname);
/* Write metadata to one device when fixing problems or adding
diff --git a/super-ddf.c b/super-ddf.c
index 3e78ffc..3c97bb6 100644
--- a/super-ddf.c
+++ b/super-ddf.c
@@ -2050,7 +2050,7 @@ static void add_to_super_ddf_bvd(struct supertype *st,
/* add a device to a container, either while creating it or while
* expanding a pre-existing container
*/
-static void add_to_super_ddf(struct supertype *st,
+static int add_to_super_ddf(struct supertype *st,
mdu_disk_info_t *dk, int fd, char *devname)
{
struct ddf_super *ddf = st->sb;
@@ -2064,7 +2064,7 @@ static void add_to_super_ddf(struct supertype *st,
if (ddf->currentconf) {
add_to_super_ddf_bvd(st, dk, fd, devname);
- return;
+ return 0;
}
/* This is device numbered dk->number. We need to create
@@ -2076,7 +2076,7 @@ static void add_to_super_ddf(struct supertype *st,
fprintf(stderr, Name
": %s could allocate buffer for new disk, aborting\n",
__func__);
- abort();
+ return 1;
}
dd->major = major(stb.st_rdev);
dd->minor = minor(stb.st_rdev);
@@ -2147,6 +2147,8 @@ static void add_to_super_ddf(struct supertype *st,
ddf->dlist = dd;
ddf->updates_pending = 1;
}
+
+ return 0;
}
/*
diff --git a/super-intel.c b/super-intel.c
index 433fa46..d39b88ca 100644
--- a/super-intel.c
+++ b/super-intel.c
@@ -1911,7 +1911,7 @@ static int init_super_imsm(struct supertype *st, mdu_array_info_t *info,
}
#ifndef MDASSEMBLE
-static void add_to_super_imsm_volume(struct supertype *st, mdu_disk_info_t *dk,
+static int add_to_super_imsm_volume(struct supertype *st, mdu_disk_info_t *dk,
int fd, char *devname)
{
struct intel_super *super = st->sb;
@@ -1929,7 +1929,7 @@ static void add_to_super_imsm_volume(struct supertype *st, mdu_disk_info_t *dk,
break;
if (!dl || ! (dk->state & (1<<MD_DISK_SYNC)))
- return;
+ return 1;
/* add a pristine spare to the metadata */
if (dl->index < 0) {
@@ -1950,9 +1950,11 @@ static void add_to_super_imsm_volume(struct supertype *st, mdu_disk_info_t *dk,
sum = __gen_imsm_checksum(mpb);
mpb->family_num = __cpu_to_le32(sum);
}
+
+ return 0;
}
-static void add_to_super_imsm(struct supertype *st, mdu_disk_info_t *dk,
+static int add_to_super_imsm(struct supertype *st, mdu_disk_info_t *dk,
int fd, char *devname)
{
struct intel_super *super = st->sb;
@@ -1962,17 +1964,15 @@ static void add_to_super_imsm(struct supertype *st, mdu_disk_info_t *dk,
int rv;
struct stat stb;
- if (super->current_vol >= 0) {
- add_to_super_imsm_volume(st, dk, fd, devname);
- return;
- }
+ if (super->current_vol >= 0)
+ return add_to_super_imsm_volume(st, dk, fd, devname);
fstat(fd, &stb);
dd = malloc(sizeof(*dd));
if (!dd) {
fprintf(stderr,
Name ": malloc failed %s:%d.\n", __func__, __LINE__);
- abort();
+ return 1;
}
memset(dd, 0, sizeof(*dd));
dd->major = major(stb.st_rdev);
@@ -2005,6 +2005,8 @@ static void add_to_super_imsm(struct supertype *st, mdu_disk_info_t *dk,
dd->next = super->disks;
super->disks = dd;
}
+
+ return 0;
}
static int store_imsm_mpb(int fd, struct intel_super *super);
diff --git a/super0.c b/super0.c
index 92255c2..ab4232b 100644
--- a/super0.c
+++ b/super0.c
@@ -627,7 +627,7 @@ struct devinfo {
#ifndef MDASSEMBLE
/* Add a device to the superblock being created */
-static void add_to_super0(struct supertype *st, mdu_disk_info_t *dinfo,
+static int add_to_super0(struct supertype *st, mdu_disk_info_t *dinfo,
int fd, char *devname)
{
mdp_super_t *sb = st->sb;
@@ -652,6 +652,8 @@ static void add_to_super0(struct supertype *st, mdu_disk_info_t *dinfo,
di->disk = *dinfo;
di->next = NULL;
*dip = di;
+
+ return 0;
}
#endif
diff --git a/super1.c b/super1.c
index 3d392cb..9446948 100644
--- a/super1.c
+++ b/super1.c
@@ -796,7 +796,7 @@ struct devinfo {
};
#ifndef MDASSEMBLE
/* Add a device to the superblock being created */
-static void add_to_super1(struct supertype *st, mdu_disk_info_t *dk,
+static int add_to_super1(struct supertype *st, mdu_disk_info_t *dk,
int fd, char *devname)
{
struct mdp_superblock_1 *sb = st->sb;
@@ -822,6 +822,8 @@ static void add_to_super1(struct supertype *st, mdu_disk_info_t *dk,
di->disk = *dk;
di->next = NULL;
*dip = di;
+
+ return 0;
}
#endif