Pass subarray arg explicitly to ->update_subarray.
This is better than hiding it in the supertype structure where we are never quite sure who needs it. Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
parent
a1f976a013
commit
a951a4f78f
2
Manage.c
2
Manage.c
|
@ -1054,7 +1054,7 @@ int Update_subarray(char *dev, char *subarray, char *update, mddev_ident_t ident
|
||||||
if (mdmon_running(st->devnum))
|
if (mdmon_running(st->devnum))
|
||||||
st->update_tail = &st->updates;
|
st->update_tail = &st->updates;
|
||||||
|
|
||||||
rv = st->ss->update_subarray(st, update, ident);
|
rv = st->ss->update_subarray(st, subarray, update, ident);
|
||||||
|
|
||||||
if (rv) {
|
if (rv) {
|
||||||
if (!quiet)
|
if (!quiet)
|
||||||
|
|
3
mdadm.h
3
mdadm.h
|
@ -629,7 +629,8 @@ extern struct superswitch {
|
||||||
/* Permit subarray's to be deleted from inactive containers */
|
/* Permit subarray's to be deleted from inactive containers */
|
||||||
int (*kill_subarray)(struct supertype *st); /* optional */
|
int (*kill_subarray)(struct supertype *st); /* optional */
|
||||||
/* Permit subarray's to be modified */
|
/* Permit subarray's to be modified */
|
||||||
int (*update_subarray)(struct supertype *st, char *update, mddev_ident_t ident); /* optional */
|
int (*update_subarray)(struct supertype *st, char *subarray,
|
||||||
|
char *update, mddev_ident_t ident); /* optional */
|
||||||
|
|
||||||
/* for mdmon */
|
/* for mdmon */
|
||||||
int (*open_new)(struct supertype *c, struct active_array *a,
|
int (*open_new)(struct supertype *c, struct active_array *a,
|
||||||
|
|
|
@ -4229,19 +4229,19 @@ static int kill_subarray_imsm(struct supertype *st)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int update_subarray_imsm(struct supertype *st, char *update, mddev_ident_t ident)
|
static int update_subarray_imsm(struct supertype *st, char *subarray,
|
||||||
|
char *update, mddev_ident_t ident)
|
||||||
{
|
{
|
||||||
/* update the subarray currently referenced by ->current_vol */
|
/* update the subarray currently referenced by ->current_vol */
|
||||||
struct intel_super *super = st->sb;
|
struct intel_super *super = st->sb;
|
||||||
struct imsm_super *mpb = super->anchor;
|
struct imsm_super *mpb = super->anchor;
|
||||||
|
|
||||||
if (super->current_vol < 0)
|
|
||||||
return 2;
|
|
||||||
|
|
||||||
if (strcmp(update, "name") == 0) {
|
if (strcmp(update, "name") == 0) {
|
||||||
char *name = ident->name;
|
char *name = ident->name;
|
||||||
|
char *ep;
|
||||||
|
int vol;
|
||||||
|
|
||||||
if (is_subarray_active(st->subarray, st->devname)) {
|
if (is_subarray_active(subarray, st->devname)) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
Name ": Unable to update name of active subarray\n");
|
Name ": Unable to update name of active subarray\n");
|
||||||
return 2;
|
return 2;
|
||||||
|
@ -4250,20 +4250,24 @@ static int update_subarray_imsm(struct supertype *st, char *update, mddev_ident_
|
||||||
if (!check_name(super, name, 0))
|
if (!check_name(super, name, 0))
|
||||||
return 2;
|
return 2;
|
||||||
|
|
||||||
|
vol = strtoul(subarray, &ep, 10);
|
||||||
|
if (*ep != '\0' || vol >= super->anchor->num_raid_devs)
|
||||||
|
return 2;
|
||||||
|
|
||||||
if (st->update_tail) {
|
if (st->update_tail) {
|
||||||
struct imsm_update_rename_array *u = malloc(sizeof(*u));
|
struct imsm_update_rename_array *u = malloc(sizeof(*u));
|
||||||
|
|
||||||
if (!u)
|
if (!u)
|
||||||
return 2;
|
return 2;
|
||||||
u->type = update_rename_array;
|
u->type = update_rename_array;
|
||||||
u->dev_idx = super->current_vol;
|
u->dev_idx = vol;
|
||||||
snprintf((char *) u->name, MAX_RAID_SERIAL_LEN, "%s", name);
|
snprintf((char *) u->name, MAX_RAID_SERIAL_LEN, "%s", name);
|
||||||
append_metadata_update(st, u, sizeof(*u));
|
append_metadata_update(st, u, sizeof(*u));
|
||||||
} else {
|
} else {
|
||||||
struct imsm_dev *dev;
|
struct imsm_dev *dev;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
dev = get_imsm_dev(super, super->current_vol);
|
dev = get_imsm_dev(super, vol);
|
||||||
snprintf((char *) dev->volume, MAX_RAID_SERIAL_LEN, "%s", name);
|
snprintf((char *) dev->volume, MAX_RAID_SERIAL_LEN, "%s", name);
|
||||||
for (i = 0; i < mpb->num_raid_devs; i++) {
|
for (i = 0; i < mpb->num_raid_devs; i++) {
|
||||||
dev = get_imsm_dev(super, i);
|
dev = get_imsm_dev(super, i);
|
||||||
|
|
16
util.c
16
util.c
|
@ -1446,6 +1446,7 @@ int is_container_active(char *container)
|
||||||
int open_subarray(char *dev, char *subarray, struct supertype *st, int quiet)
|
int open_subarray(char *dev, char *subarray, struct supertype *st, int quiet)
|
||||||
{
|
{
|
||||||
struct mdinfo *mdi;
|
struct mdinfo *mdi;
|
||||||
|
struct mdinfo *info;
|
||||||
int fd, err = 1;
|
int fd, err = 1;
|
||||||
|
|
||||||
fd = open(dev, O_RDWR|O_EXCL);
|
fd = open(dev, O_RDWR|O_EXCL);
|
||||||
|
@ -1495,12 +1496,10 @@ int open_subarray(char *dev, char *subarray, struct supertype *st, int quiet)
|
||||||
goto free_sysfs;
|
goto free_sysfs;
|
||||||
}
|
}
|
||||||
|
|
||||||
strncpy(st->subarray, subarray, sizeof(st->subarray)-1);
|
|
||||||
|
|
||||||
if (st->ss->load_super(st, fd, NULL)) {
|
if (st->ss->load_super(st, fd, NULL)) {
|
||||||
if (!quiet)
|
if (!quiet)
|
||||||
fprintf(stderr, Name ": Failed to find subarray-%s in %s\n",
|
fprintf(stderr, Name ": Failed to load metadata for %s\n",
|
||||||
st->subarray, dev);
|
dev);
|
||||||
goto free_name;
|
goto free_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1510,6 +1509,15 @@ int open_subarray(char *dev, char *subarray, struct supertype *st, int quiet)
|
||||||
goto free_super;
|
goto free_super;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
info = st->ss->container_content(st, subarray);
|
||||||
|
if (!info) {
|
||||||
|
if (!quiet)
|
||||||
|
fprintf(stderr, Name ": Failed to find subarray-%s in %s\n",
|
||||||
|
subarray, dev);
|
||||||
|
goto free_super;
|
||||||
|
}
|
||||||
|
free(info);
|
||||||
|
|
||||||
err = 0;
|
err = 0;
|
||||||
|
|
||||||
free_super:
|
free_super:
|
||||||
|
|
Loading…
Reference in New Issue