summaryrefslogtreecommitdiff
path: root/usr/src/lib/lvm/libmeta/common
diff options
context:
space:
mode:
authorstevep <none@none>2006-05-30 08:43:52 -0700
committerstevep <none@none>2006-05-30 08:43:52 -0700
commitdc4c1217e39177d051fb3b14236ddb405fcc609a (patch)
tree9486625d3d75918edfa938509d056625de29958d /usr/src/lib/lvm/libmeta/common
parent8cd327d5cbf74ddf7659863fac9475546ccd58ce (diff)
downloadillumos-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.c39
-rw-r--r--usr/src/lib/lvm/libmeta/common/meta_set_hst.c35
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