On Wed, 20 May 2015 11:20:37 +0800 Guoqing Jiang <gqjiang@xxxxxxxx> wrote: > A clustered disk is added by the traditional --add sequence. > However, other nodes need to acknowledge that they can "see" > the device. This is done by --cluster-confirm: > > --cluster-confirm SLOTNUM:/dev/whatever (if disk is found) > or > --cluster-confirm SLOTNUM:missing (if disk is not found) > > The node initiating the --add, has the disk state tagged with > MD_DISK_CLUSTER_ADD and the one confirming tag the disk with > MD_DISK_CANDIDATE. > > Signed-off-by: Goldwyn Rodrigues <rgoldwyn@xxxxxxxx> > Signed-off-by: Guoqing Jiang <gqjiang@xxxxxxxx> > --- > Manage.c | 33 +++++++++++++++++++++++++++++---- > ReadMe.c | 1 + > md_p.h | 7 +++++++ > md_u.h | 1 + > mdadm.8.in | 9 +++++++++ > mdadm.c | 4 ++++ > mdadm.h | 2 ++ > util.c | 10 ++++++++++ > 8 files changed, 63 insertions(+), 4 deletions(-) > > diff --git a/Manage.c b/Manage.c > index d3cfb55..4c3d451 100644 > --- a/Manage.c > +++ b/Manage.c > @@ -690,7 +690,8 @@ skip_re_add: > int Manage_add(int fd, int tfd, struct mddev_dev *dv, > struct supertype *tst, mdu_array_info_t *array, > int force, int verbose, char *devname, > - char *update, unsigned long rdev, unsigned long long array_size) > + char *update, unsigned long rdev, unsigned long long array_size, > + int raid_slot) > { > unsigned long long ldsize; > struct supertype *dev_st = NULL; > @@ -879,7 +880,10 @@ int Manage_add(int fd, int tfd, struct mddev_dev *dv, > } > disc.major = major(rdev); > disc.minor = minor(rdev); > - disc.number =j; > + if (raid_slot < 0) > + disc.number = j; > + else > + disc.number = raid_slot; > disc.state = 0; > if (array->not_persistent==0) { > int dfd; > @@ -920,6 +924,14 @@ int Manage_add(int fd, int tfd, struct mddev_dev *dv, > } > free(used); > } > + > + if (array->state & (1 << MD_SB_CLUSTERED)) { > + if (dv->disposition == 'c') > + disc.state |= (1 << MD_DISK_CANDIDATE); > + else > + disc.state |= (1 << MD_DISK_CLUSTER_ADD); > + } > + > if (dv->writemostly == 1) > disc.state |= (1 << MD_DISK_WRITEMOSTLY); > if (tst->ss->external) { > @@ -1239,6 +1251,7 @@ int Manage_subdevs(char *devname, int fd, > * variant on 'A' > * 'F' - Another variant of 'A', where the device was faulty > * so must be removed from the array first. > + * 'c' - confirm the device as found (for clustered environments) > * > * For 'f' and 'r', the device can also be a kernel-internal > * name such as 'sdb'. > @@ -1254,6 +1267,7 @@ int Manage_subdevs(char *devname, int fd, > struct mdinfo info; > int frozen = 0; > int busy = 0; > + int raid_slot = -1; > > if (ioctl(fd, GET_ARRAY_INFO, &array)) { > pr_err("Cannot get array info for %s\n", > @@ -1282,6 +1296,11 @@ int Manage_subdevs(char *devname, int fd, > int rv; > int mj,mn; > > + raid_slot = -1; > + if (dv->disposition == 'c') > + parse_cluster_confirm_arg(dv->devname, &dv->devname, > + &raid_slot); > + This function returns -1 if it couldn't successfully parse dv->devname, but you aren't catching that error and reporting it. NeilBrown > > +int parse_cluster_confirm_arg(char *input, char **devname, int *slot) > +{ > + char *dev; > + *slot = strtoul(input, &dev, 10); > + if (dev == input || dev[0] != ':') > + return -1; > + *devname = dev+1; > + return 0; > +} > +
Attachment:
pgpyWhRvoeDJq.pgp
Description: OpenPGP digital signature