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:
parent
fabbfd48b6
commit
f20c396836
8
Create.c
8
Create.c
|
@ -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;
|
||||||
|
|
||||||
|
|
9
Manage.c
9
Manage.c
|
@ -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 */
|
||||||
|
|
2
mdadm.h
2
mdadm.h
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -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);
|
||||||
|
|
4
super0.c
4
super0.c
|
@ -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
|
||||||
|
|
||||||
|
|
4
super1.c
4
super1.c
|
@ -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
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue