diff options
author | stevep <none@none> | 2006-05-30 08:43:52 -0700 |
---|---|---|
committer | stevep <none@none> | 2006-05-30 08:43:52 -0700 |
commit | dc4c1217e39177d051fb3b14236ddb405fcc609a (patch) | |
tree | 9486625d3d75918edfa938509d056625de29958d /usr/src/lib/lvm/libmeta/common | |
parent | 8cd327d5cbf74ddf7659863fac9475546ccd58ce (diff) | |
download | illumos-joyent-dc4c1217e39177d051fb3b14236ddb405fcc609a.tar.gz |
6412952 Cannot create a hotspare pool in a multi-owner diskset
6421971 Can't add the 2nd host to the trad set if set has hotspare pool
Diffstat (limited to 'usr/src/lib/lvm/libmeta/common')
-rw-r--r-- | usr/src/lib/lvm/libmeta/common/meta_mn_handlers.c | 39 | ||||
-rw-r--r-- | usr/src/lib/lvm/libmeta/common/meta_set_hst.c | 35 |
2 files changed, 68 insertions, 6 deletions
diff --git a/usr/src/lib/lvm/libmeta/common/meta_mn_handlers.c b/usr/src/lib/lvm/libmeta/common/meta_mn_handlers.c index cb29de889d..a4dd377b1a 100644 --- a/usr/src/lib/lvm/libmeta/common/meta_mn_handlers.c +++ b/usr/src/lib/lvm/libmeta/common/meta_mn_handlers.c @@ -1424,6 +1424,8 @@ mdmn_do_meta_md_addside(md_mn_msg_t *msg, uint_t flags, md_mn_result_t *resp) /* While loop continues until IOCNXTKEY_NM gives nm.key of KEYWILD */ /*CONSTCOND*/ while (1) { + char *drvnm = NULL; + nm.mde = mdnullerror; nm.setno = msg->msg_setno; nm.side = d->msg_otherside; @@ -1439,13 +1441,41 @@ mdmn_do_meta_md_addside(md_mn_msg_t *msg, uint_t flags, md_mn_result_t *resp) return; } - nm.devname = (uintptr_t)meta_getnmbykey(msg->msg_setno, - d->msg_otherside, nm.key, &ep); - if (nm.devname == NULL) { + /* + * Okay we have a valid key + * Let's see if it is hsp or not + */ + nm.devname = (uintptr_t)meta_getnmentbykey(msg->msg_setno, + d->msg_otherside, nm.key, &drvnm, NULL, NULL, &ep); + if (nm.devname == NULL || drvnm == NULL) { + if (nm.devname) + Free((void *)(uintptr_t)nm.devname); + if (drvnm) + Free((void *)(uintptr_t)drvnm); (void) mdstealerror(&(resp->mmr_ep), &ep); resp->mmr_exitval = -1; return; } + + /* + * If it is hsp add here + */ + if (strcmp(drvnm, MD_HOTSPARES) == 0) { + if (add_name(sp, d->msg_sideno, nm.key, MD_HOTSPARES, + minor(NODEV), (char *)(uintptr_t)nm.devname, + NULL, NULL, &ep) == -1) { + Free((void *)(uintptr_t)nm.devname); + Free((void *)(uintptr_t)drvnm); + (void) mdstealerror(&(resp->mmr_ep), &ep); + resp->mmr_exitval = -1; + return; + } else { + Free((void *)(uintptr_t)nm.devname); + Free((void *)(uintptr_t)drvnm); + continue; + } + } + nm.side = d->msg_sideno; if ((done = meta_getside_devinfo(sp, (char *)(uintptr_t)nm.devname, @@ -1455,7 +1485,10 @@ mdmn_do_meta_md_addside(md_mn_msg_t *msg, uint_t flags, md_mn_result_t *resp) resp->mmr_exitval = -1; return; } + Free((void *)(uintptr_t)nm.devname); + Free((void *)(uintptr_t)drvnm); + if (done != 1) { Free(cname); Free(dname); diff --git a/usr/src/lib/lvm/libmeta/common/meta_set_hst.c b/usr/src/lib/lvm/libmeta/common/meta_set_hst.c index 9bf87f8cd2..fcfd8faaa3 100644 --- a/usr/src/lib/lvm/libmeta/common/meta_set_hst.c +++ b/usr/src/lib/lvm/libmeta/common/meta_set_hst.c @@ -162,6 +162,8 @@ add_md_sidenms(mdsetname_t *sp, side_t sideno, side_t otherside, md_error_t *ep) } else { /*CONSTCOND*/ while (1) { + char *drvnm = NULL; + nm.mde = mdnullerror; nm.setno = sp->setno; nm.side = otherside; @@ -171,10 +173,36 @@ add_md_sidenms(mdsetname_t *sp, side_t sideno, side_t otherside, md_error_t *ep) if (nm.key == MD_KEYWILD) return (0); - nm.devname = (uintptr_t)meta_getnmbykey(sp->setno, - otherside, nm.key, ep); - if (nm.devname == NULL) + /* + * Okay we have a valid key + * Let's see if it is hsp or not + */ + nm.devname = (uintptr_t)meta_getnmentbykey(sp->setno, + otherside, nm.key, &drvnm, NULL, NULL, ep); + if (nm.devname == NULL || drvnm == NULL) { + if (nm.devname) + Free((void *)(uintptr_t)nm.devname); + if (drvnm) + Free((void *)(uintptr_t)drvnm); return (-1); + } + + /* + * If it is hsp add here + */ + if (strcmp(drvnm, MD_HOTSPARES) == 0) { + if (add_name(sp, sideno, nm.key, MD_HOTSPARES, + minor(NODEV), (char *)(uintptr_t)nm.devname, + NULL, NULL, ep) == -1) { + Free((void *)(uintptr_t)nm.devname); + Free((void *)(uintptr_t)drvnm); + return (-1); + } else { + Free((void *)(uintptr_t)nm.devname); + Free((void *)(uintptr_t)drvnm); + continue; + } + } nm.side = sideno; if (MD_MNSET_DESC(sd)) { @@ -192,6 +220,7 @@ add_md_sidenms(mdsetname_t *sp, side_t sideno, side_t otherside, md_error_t *ep) assert(done == 1); Free((void *)(uintptr_t)nm.devname); + Free((void *)(uintptr_t)drvnm); /* * The device reference count can be greater than 1 if |