diff options
author | Dan Williams <dan.j.williams@intel.com> | 2008-11-26 15:39:51 -0700 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2008-11-27 15:30:39 +1100 |
commit | f20c3968363a16f3c8dce5d69863bbb54a4d236e (patch) | |
tree | c96904d976647f1051b9f3dbc2cf72c27b428624 | |
parent | fabbfd48b6c2398a344d2d4f7cbf0ab98181a6d4 (diff) | |
download | mdadm-f20c3968363a16f3c8dce5d69863bbb54a4d236e.tar.gz mdadm-f20c3968363a16f3c8dce5d69863bbb54a4d236e.tar.xz mdadm-f20c3968363a16f3c8dce5d69863bbb54a4d236e.zip |
allow add_to_super to return errors
Prepare add_to_super to validate disks against the platform capabilities
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
-rw-r--r-- | Create.c | 8 | ||||
-rw-r--r-- | Manage.c | 9 | ||||
-rw-r--r-- | mdadm.h | 2 | ||||
-rw-r--r-- | super-ddf.c | 8 | ||||
-rw-r--r-- | super-intel.c | 18 | ||||
-rw-r--r-- | super0.c | 4 | ||||
-rw-r--r-- | super1.c | 4 |
7 files changed, 35 insertions, 18 deletions
@@ -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; @@ -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 */ @@ -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); @@ -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 @@ -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 |