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>
This commit is contained in:
Dan Williams 2008-11-26 15:39:51 -07:00 committed by NeilBrown
parent fabbfd48b6
commit f20c396836
7 changed files with 35 additions and 18 deletions

View File

@ -705,8 +705,12 @@ int Create(struct supertype *st, char *mddev,
inf->disk.minor = minor(stb.st_rdev); inf->disk.minor = minor(stb.st_rdev);
remove_partitions(fd); remove_partitions(fd);
st->ss->add_to_super(st, &inf->disk, if (st->ss->add_to_super(st, &inf->disk,
fd, dv->devname); fd, dv->devname)) {
fprintf(stderr, Name ": failed to add %s\n",
dv->devname);
goto abort;
}
st->ss->getinfo_super(st, inf); st->ss->getinfo_super(st, inf);
safe_mode_delay = inf->safe_mode_delay; safe_mode_delay = inf->safe_mode_delay;

View File

@ -624,8 +624,13 @@ int Manage_subdevs(char *devname, int fd,
if (dv->writemostly == 1) if (dv->writemostly == 1)
disc.state |= 1 << MD_DISK_WRITEMOSTLY; disc.state |= 1 << MD_DISK_WRITEMOSTLY;
dfd = open(dv->devname, O_RDWR | O_EXCL|O_DIRECT); dfd = open(dv->devname, O_RDWR | O_EXCL|O_DIRECT);
tst->ss->add_to_super(tst, &disc, dfd, if (tst->ss->add_to_super(tst, &disc, dfd,
dv->devname); dv->devname)) {
fprintf(stderr, Name ": failed to add %s\n",
dv->devname);
close(dfd);
return 1;
}
/* write_init_super will close 'dfd' */ /* write_init_super will close 'dfd' */
if (tst->ss->external) if (tst->ss->external)
/* mdmon will write the metadata */ /* mdmon will write the metadata */

View File

@ -503,7 +503,7 @@ extern struct superswitch {
/* update the metadata to include new device, either at create or /* update the metadata to include new device, either at create or
* when hot-adding a spare. * 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); int fd, char *devname);
/* Write metadata to one device when fixing problems or adding /* Write metadata to one device when fixing problems or adding

View File

@ -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 /* add a device to a container, either while creating it or while
* expanding a pre-existing container * 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) mdu_disk_info_t *dk, int fd, char *devname)
{ {
struct ddf_super *ddf = st->sb; struct ddf_super *ddf = st->sb;
@ -2064,7 +2064,7 @@ static void add_to_super_ddf(struct supertype *st,
if (ddf->currentconf) { if (ddf->currentconf) {
add_to_super_ddf_bvd(st, dk, fd, devname); add_to_super_ddf_bvd(st, dk, fd, devname);
return; return 0;
} }
/* This is device numbered dk->number. We need to create /* 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 fprintf(stderr, Name
": %s could allocate buffer for new disk, aborting\n", ": %s could allocate buffer for new disk, aborting\n",
__func__); __func__);
abort(); return 1;
} }
dd->major = major(stb.st_rdev); dd->major = major(stb.st_rdev);
dd->minor = minor(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->dlist = dd;
ddf->updates_pending = 1; ddf->updates_pending = 1;
} }
return 0;
} }
/* /*

View File

@ -1911,7 +1911,7 @@ static int init_super_imsm(struct supertype *st, mdu_array_info_t *info,
} }
#ifndef MDASSEMBLE #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) int fd, char *devname)
{ {
struct intel_super *super = st->sb; 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; break;
if (!dl || ! (dk->state & (1<<MD_DISK_SYNC))) if (!dl || ! (dk->state & (1<<MD_DISK_SYNC)))
return; return 1;
/* add a pristine spare to the metadata */ /* add a pristine spare to the metadata */
if (dl->index < 0) { 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); sum = __gen_imsm_checksum(mpb);
mpb->family_num = __cpu_to_le32(sum); 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) int fd, char *devname)
{ {
struct intel_super *super = st->sb; 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; int rv;
struct stat stb; struct stat stb;
if (super->current_vol >= 0) { if (super->current_vol >= 0)
add_to_super_imsm_volume(st, dk, fd, devname); return add_to_super_imsm_volume(st, dk, fd, devname);
return;
}
fstat(fd, &stb); fstat(fd, &stb);
dd = malloc(sizeof(*dd)); dd = malloc(sizeof(*dd));
if (!dd) { if (!dd) {
fprintf(stderr, fprintf(stderr,
Name ": malloc failed %s:%d.\n", __func__, __LINE__); Name ": malloc failed %s:%d.\n", __func__, __LINE__);
abort(); return 1;
} }
memset(dd, 0, sizeof(*dd)); memset(dd, 0, sizeof(*dd));
dd->major = major(stb.st_rdev); 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; dd->next = super->disks;
super->disks = dd; super->disks = dd;
} }
return 0;
} }
static int store_imsm_mpb(int fd, struct intel_super *super); static int store_imsm_mpb(int fd, struct intel_super *super);

View File

@ -627,7 +627,7 @@ struct devinfo {
#ifndef MDASSEMBLE #ifndef MDASSEMBLE
/* Add a device to the superblock being created */ /* 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) int fd, char *devname)
{ {
mdp_super_t *sb = st->sb; 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->disk = *dinfo;
di->next = NULL; di->next = NULL;
*dip = di; *dip = di;
return 0;
} }
#endif #endif

View File

@ -796,7 +796,7 @@ struct devinfo {
}; };
#ifndef MDASSEMBLE #ifndef MDASSEMBLE
/* Add a device to the superblock being created */ /* 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) int fd, char *devname)
{ {
struct mdp_superblock_1 *sb = st->sb; 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->disk = *dk;
di->next = NULL; di->next = NULL;
*dip = di; *dip = di;
return 0;
} }
#endif #endif