From a951a4f78f079b86328419d024a214ce0fb2aa04 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Mon, 22 Nov 2010 20:24:50 +1100 Subject: [PATCH] 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 --- Manage.c | 2 +- mdadm.h | 3 ++- super-intel.c | 18 +++++++++++------- util.c | 16 ++++++++++++---- 4 files changed, 26 insertions(+), 13 deletions(-) diff --git a/Manage.c b/Manage.c index 1ce4aa6..0a44725 100644 --- a/Manage.c +++ b/Manage.c @@ -1054,7 +1054,7 @@ int Update_subarray(char *dev, char *subarray, char *update, mddev_ident_t ident if (mdmon_running(st->devnum)) 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 (!quiet) diff --git a/mdadm.h b/mdadm.h index d46139c..25bc623 100644 --- a/mdadm.h +++ b/mdadm.h @@ -629,7 +629,8 @@ extern struct superswitch { /* Permit subarray's to be deleted from inactive containers */ int (*kill_subarray)(struct supertype *st); /* optional */ /* 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 */ int (*open_new)(struct supertype *c, struct active_array *a, diff --git a/super-intel.c b/super-intel.c index f64731b..03c214f 100644 --- a/super-intel.c +++ b/super-intel.c @@ -4229,19 +4229,19 @@ static int kill_subarray_imsm(struct supertype *st) 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 */ struct intel_super *super = st->sb; struct imsm_super *mpb = super->anchor; - if (super->current_vol < 0) - return 2; - if (strcmp(update, "name") == 0) { 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, Name ": Unable to update name of active subarray\n"); return 2; @@ -4250,20 +4250,24 @@ static int update_subarray_imsm(struct supertype *st, char *update, mddev_ident_ if (!check_name(super, name, 0)) return 2; + vol = strtoul(subarray, &ep, 10); + if (*ep != '\0' || vol >= super->anchor->num_raid_devs) + return 2; + if (st->update_tail) { struct imsm_update_rename_array *u = malloc(sizeof(*u)); if (!u) return 2; 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); append_metadata_update(st, u, sizeof(*u)); } else { struct imsm_dev *dev; 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); for (i = 0; i < mpb->num_raid_devs; i++) { dev = get_imsm_dev(super, i); diff --git a/util.c b/util.c index 66c7f0b..83a972e 100644 --- a/util.c +++ b/util.c @@ -1446,6 +1446,7 @@ int is_container_active(char *container) int open_subarray(char *dev, char *subarray, struct supertype *st, int quiet) { struct mdinfo *mdi; + struct mdinfo *info; int fd, err = 1; 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; } - strncpy(st->subarray, subarray, sizeof(st->subarray)-1); - if (st->ss->load_super(st, fd, NULL)) { if (!quiet) - fprintf(stderr, Name ": Failed to find subarray-%s in %s\n", - st->subarray, dev); + fprintf(stderr, Name ": Failed to load metadata for %s\n", + dev); goto free_name; } @@ -1510,6 +1509,15 @@ int open_subarray(char *dev, char *subarray, struct supertype *st, int quiet) 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; free_super: