summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorjkennedy <none@none>2006-11-07 07:36:23 -0800
committerjkennedy <none@none>2006-11-07 07:36:23 -0800
commitab3487b0f99a72f54cfcffc43f7efd2c4bb2d608 (patch)
tree4b0f6c2d7ab8320e5f3e8f59d21a5584243d3603 /usr/src
parent166fae499b8c2c347337a348f0a38d1d0a0b4a7c (diff)
downloadillumos-joyent-ab3487b0f99a72f54cfcffc43f7efd2c4bb2d608.tar.gz
6331216 disksets: devid information not written to a newly created diskset
6345158 svm exited with error 1 in step cmmstep5, nodes panic 6402556 commd timeout should be a percentage of metaclust timeout value
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/cmd/lvm/rpc.metad/metad_svc_subr.c6
-rw-r--r--usr/src/cmd/lvm/util/metaclust.c13
-rw-r--r--usr/src/head/meta.h9
-rw-r--r--usr/src/lib/lvm/libmeta/common/meta_mn_comm.c59
-rw-r--r--usr/src/lib/lvm/libmeta/common/meta_set.c17
-rw-r--r--usr/src/lib/lvm/libmeta/common/meta_set_drv.c20
-rw-r--r--usr/src/lib/lvm/libmeta/common/metarpcopen.c9
-rw-r--r--usr/src/uts/common/io/lvm/md/md_subr.c22
8 files changed, 117 insertions, 38 deletions
diff --git a/usr/src/cmd/lvm/rpc.metad/metad_svc_subr.c b/usr/src/cmd/lvm/rpc.metad/metad_svc_subr.c
index 2ad33ff1d4..c89141da4a 100644
--- a/usr/src/cmd/lvm/rpc.metad/metad_svc_subr.c
+++ b/usr/src/cmd/lvm/rpc.metad/metad_svc_subr.c
@@ -4913,7 +4913,7 @@ mdrpc_mdcommdctl_2_svc(
switch (args_cc->flag_action) {
case COMMDCTL_SUSPEND:
suspend_ret = mdmn_suspend(args_cc->setno,
- args_cc->class);
+ args_cc->class, 0);
if (suspend_ret != 0) {
(void) mddserror(ep, suspend_ret,
args_cc->setno, mynode(),
@@ -4922,7 +4922,7 @@ mdrpc_mdcommdctl_2_svc(
break;
case COMMDCTL_RESUME:
if (mdmn_resume(args_cc->setno,
- args_cc->class, args_cc->flags)) {
+ args_cc->class, args_cc->flags, 0)) {
(void) mddserror(ep,
MDE_DS_COMMDCTL_RESUME_FAIL,
args_cc->setno, mynode(),
@@ -4930,7 +4930,7 @@ mdrpc_mdcommdctl_2_svc(
}
break;
case COMMDCTL_REINIT:
- if (mdmn_reinit_set(args_cc->setno)) {
+ if (mdmn_reinit_set(args_cc->setno, 0)) {
(void) mddserror(ep,
MDE_DS_COMMDCTL_REINIT_FAIL,
args_cc->setno, mynode(),
diff --git a/usr/src/cmd/lvm/util/metaclust.c b/usr/src/cmd/lvm/util/metaclust.c
index ea4d44267d..895a475628 100644
--- a/usr/src/cmd/lvm/util/metaclust.c
+++ b/usr/src/cmd/lvm/util/metaclust.c
@@ -663,6 +663,7 @@ main(int argc, char **argv)
int ret_val;
mddb_config_t cfg;
int set_info[MD_MAXSETS];
+ long commd_timeout = 0;
/*
* Get the locale set up before calling any other routines
@@ -794,6 +795,7 @@ main(int argc, char **argv)
/* set timeout alarm signal, a value of 0 will disable timeout */
if (timeout > 0) {
int stat_loc = 0;
+ commd_timeout = timeout * .75;
c_pid = fork();
@@ -920,7 +922,7 @@ main(int argc, char **argv)
/* suspend commd and spin waiting for drain */
while ((ret_val = mdmn_suspend(setno,
- MD_COMM_ALL_CLASSES)) ==
+ MD_COMM_ALL_CLASSES, commd_timeout)) ==
MDE_DS_COMMDCTL_SUSPEND_NYD) {
sleep(1);
}
@@ -1126,7 +1128,7 @@ main(int argc, char **argv)
/* suspend commd and spin waiting for drain */
while ((ret_val = mdmn_suspend(setno,
- MD_COMM_ALL_CLASSES)) ==
+ MD_COMM_ALL_CLASSES, commd_timeout)) ==
MDE_DS_COMMDCTL_SUSPEND_NYD) {
sleep(1);
}
@@ -1225,7 +1227,7 @@ main(int argc, char **argv)
* given the member information and send a reinit message
* to rpc.mdcommd to reload the nodelist.
*/
- rval = meta_reconfig_choose_master(ep);
+ rval = meta_reconfig_choose_master(commd_timeout, ep);
if (rval == 205) {
/*
* NOTE: Should issue call to reboot remote host that
@@ -1566,7 +1568,7 @@ main(int argc, char **argv)
meta_print_hrtime(gethrtime() - start_time));
/* reinitialzse rpc.mdcommd with new nodelist */
- if (mdmn_reinit_set(setno)) {
+ if (mdmn_reinit_set(setno, commd_timeout)) {
md_eprintf(gettext(
"Could not re-initialise rpc.mdcommd for "
"set %s\n"), sp->setname);
@@ -1754,7 +1756,8 @@ main(int argc, char **argv)
}
/* resume rpc.mdcommd */
- if (mdmn_resume(setno, MD_COMM_ALL_CLASSES, 0)) {
+ if (mdmn_resume(setno, MD_COMM_ALL_CLASSES, 0,
+ commd_timeout)) {
md_eprintf(gettext("Unable to resume "
"rpc.mdcommd for set %s\n"), sp->setname);
md_exit(local_sp, 1);
diff --git a/usr/src/head/meta.h b/usr/src/head/meta.h
index 24a298fb43..e7318c53bf 100644
--- a/usr/src/head/meta.h
+++ b/usr/src/head/meta.h
@@ -1755,6 +1755,8 @@ extern CLIENT *metarpcopen(char *hostname, long time_out,
md_error_t *ep);
extern void metarpcclose(CLIENT *clntp);
extern void metarpccloseall(void);
+extern int cl_sto(CLIENT *clntp, char *hostname, long time_out,
+ md_error_t *ep);
/* metasplitname.c */
extern int splitname(char *devname, md_splitname *splitname);
@@ -1815,10 +1817,11 @@ extern int mdmn_send_message_with_msgid(set_t setno,
int size, md_mn_result_t **resp,
md_mn_msgid_t *msgid, md_error_t *ep);
extern int mdmn_create_msgid(md_mn_msgid_t *id);
-extern int mdmn_reinit_set(set_t setno);
+extern int mdmn_reinit_set(set_t setno, long timeout);
extern int mdmn_resume(set_t setno, md_mn_msgclass_t class,
- uint_t flags);
-extern int mdmn_suspend(set_t setno, md_mn_msgclass_t class);
+ uint_t flags, long timeout);
+extern int mdmn_suspend(set_t setno, md_mn_msgclass_t class,
+ long timeout);
extern int mdmn_msgtype_lock(md_mn_msgtype_t msgtype,
uint_t locktype);
extern void mdmn_abort(void);
diff --git a/usr/src/lib/lvm/libmeta/common/meta_mn_comm.c b/usr/src/lib/lvm/libmeta/common/meta_mn_comm.c
index 02ad7bf1e6..e005e83348 100644
--- a/usr/src/lib/lvm/libmeta/common/meta_mn_comm.c
+++ b/usr/src/lib/lvm/libmeta/common/meta_mn_comm.c
@@ -2,9 +2,8 @@
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
@@ -21,7 +20,7 @@
*/
/*
- * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -791,11 +790,12 @@ out:
* MDE_DS_COMMDCTL_SUSPEND_FAIL if any failure occurred
*/
int
-mdmn_suspend(set_t setno, md_mn_msgclass_t class)
+mdmn_suspend(set_t setno, md_mn_msgclass_t class, long timeout)
{
- int *resp;
- CLIENT *local_daemon;
- md_mn_set_and_class_t msc;
+ int *resp;
+ CLIENT *local_daemon;
+ md_mn_set_and_class_t msc;
+ md_error_t xep = mdnullerror;
if ((setno >= MD_MAXSETS) || (class >= MD_MN_NCLASSES)) {
return (MDE_DS_COMMDCTL_SUSPEND_FAIL);
@@ -806,6 +806,14 @@ mdmn_suspend(set_t setno, md_mn_msgclass_t class)
clnt_pcreateerror("local_daemon");
return (MDE_DS_COMMDCTL_SUSPEND_FAIL);
}
+
+ if (timeout != 0) {
+ if (cl_sto(local_daemon, LOCALHOST_IPv4, timeout, &xep) != 0) {
+ clnt_destroy(local_daemon);
+ return (1);
+ }
+ }
+
msc.msc_set = setno;
msc.msc_class = class;
msc.msc_flags = 0;
@@ -842,12 +850,13 @@ mdmn_suspend(set_t setno, md_mn_msgclass_t class)
* MDE_DS_COMMDCTL_RESUME_FAIL on failure
*/
int
-mdmn_resume(set_t setno, md_mn_msgclass_t class, uint_t flags)
+mdmn_resume(set_t setno, md_mn_msgclass_t class, uint_t flags, long timeout)
{
- md_mn_set_and_class_t msc;
- int ret = MDE_DS_COMMDCTL_RESUME_FAIL;
- int *resp;
- CLIENT *local_daemon;
+ md_mn_set_and_class_t msc;
+ int ret = MDE_DS_COMMDCTL_RESUME_FAIL;
+ int *resp;
+ CLIENT *local_daemon;
+ md_error_t xep = mdnullerror;
if ((setno >= MD_MAXSETS) || (class >= MD_MN_NCLASSES)) {
return (MDE_DS_COMMDCTL_RESUME_FAIL);
@@ -859,6 +868,13 @@ mdmn_resume(set_t setno, md_mn_msgclass_t class, uint_t flags)
return (MDE_DS_COMMDCTL_RESUME_FAIL);
}
+ if (timeout != 0) {
+ if (cl_sto(local_daemon, LOCALHOST_IPv4, timeout, &xep) != 0) {
+ clnt_destroy(local_daemon);
+ return (1);
+ }
+ }
+
msc.msc_set = setno;
msc.msc_class = class;
msc.msc_flags = flags;
@@ -909,12 +925,12 @@ mdmn_abort(void)
* 1 on failure
*/
int
-mdmn_reinit_set(set_t setno)
+mdmn_reinit_set(set_t setno, long timeout)
{
- int ret = 1;
- int *resp;
- CLIENT *local_daemon;
-
+ int ret = 1;
+ int *resp;
+ CLIENT *local_daemon;
+ md_error_t xep = mdnullerror;
if ((setno == 0) || (setno >= MD_MAXSETS)) {
return (1);
@@ -926,6 +942,13 @@ mdmn_reinit_set(set_t setno)
return (1);
}
+ if (timeout != 0) {
+ if (cl_sto(local_daemon, LOCALHOST_IPv4, timeout, &xep) != 0) {
+ clnt_destroy(local_daemon);
+ return (1);
+ }
+ }
+
resp = mdmn_comm_reinit_set_1(&setno, local_daemon);
if (resp != NULL) {
diff --git a/usr/src/lib/lvm/libmeta/common/meta_set.c b/usr/src/lib/lvm/libmeta/common/meta_set.c
index 397f016f7b..4b84be7b09 100644
--- a/usr/src/lib/lvm/libmeta/common/meta_set.c
+++ b/usr/src/lib/lvm/libmeta/common/meta_set.c
@@ -1928,6 +1928,10 @@ metadrivename_withdrkey(
* devid code path can set and propagate the error and
* eventually prevent did disks from being added to the
* diskset under SunCluster systems
+ *
+ * Note that this code can be called through rpc.mdcommd.
+ * sdssc_version cannot be used because the library won't
+ * be bound.
*/
if ((strncmp(dnp->rname, "/dev/did/", strlen("/dev/did/"))
== 0) || (MD_MNSET_DESC(sd)))
@@ -1950,8 +1954,7 @@ metadrivename_withdrkey(
* that's OK. dnp->devid will be null as it is in any
* configuration with no devids.
*/
- if (meta_setdid(MD_LOCAL_SET, sideno + SKEW, key,
- ep) < 0)
+ if (meta_setdid(MD_LOCAL_SET, sideno + SKEW, key, ep) < 0)
return (NULL);
if ((devidp = (ddi_devid_t)meta_getdidbykey(MD_LOCAL_SET,
sideno+SKEW, key, ep)) != NULL) {
@@ -4224,6 +4227,7 @@ out:
*/
int
meta_reconfig_choose_master(
+ long timeout,
md_error_t *ep
)
{
@@ -4356,8 +4360,13 @@ meta_reconfig_choose_master(
return (205);
}
- /* Send new nodelist to rpc.mdcommd */
- (void) mdmn_reinit_set(sp->setno);
+ /* reinit rpc.mdcommd with new nodelist */
+ if (mdmn_reinit_set(sp->setno, timeout)) {
+ md_eprintf(dgettext(TEXT_DOMAIN,
+ "Could not re-initialise rpc.mdcommd for "
+ "set %s\n"), sp->setname);
+ return (1);
+ }
meta_mc_log(MC_LOG5, dgettext(TEXT_DOMAIN,
"Choose master for set %s completed: %s"),
diff --git a/usr/src/lib/lvm/libmeta/common/meta_set_drv.c b/usr/src/lib/lvm/libmeta/common/meta_set_drv.c
index a2abef7eac..4c4eaf0d78 100644
--- a/usr/src/lib/lvm/libmeta/common/meta_set_drv.c
+++ b/usr/src/lib/lvm/libmeta/common/meta_set_drv.c
@@ -480,6 +480,26 @@ meta_set_adddrives(
goto rollback;
}
+ /*
+ * If this is not a MN set and the state flags do not indicate the
+ * presence of devids, update the set records on all nodes.
+ */
+ if (!(sd->sd_flags & MD_SR_MB_DEVID) && !(MD_MNSET_DESC(sd))) {
+ if (meta_update_mb(sp, dd, ep) == 0) {
+ mdclrerror(ep);
+
+ /* update the sr_flags on all hosts */
+ for (i = 0; i < MD_MAXSIDES; i++) {
+ if (sd->sd_nodes[i][0] == '\0')
+ continue;
+
+ if (clnt_upd_sr_flags(sd->sd_nodes[i],
+ sp, (sd->sd_flags | MD_SR_MB_DEVID), ep))
+ goto rollback;
+ }
+ }
+ }
+
RB_TEST(6, "adddrives", ep)
RB_PREEMPT;
diff --git a/usr/src/lib/lvm/libmeta/common/metarpcopen.c b/usr/src/lib/lvm/libmeta/common/metarpcopen.c
index bd0f4232f5..4e86a847eb 100644
--- a/usr/src/lib/lvm/libmeta/common/metarpcopen.c
+++ b/usr/src/lib/lvm/libmeta/common/metarpcopen.c
@@ -2,9 +2,8 @@
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
@@ -20,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -146,7 +145,7 @@ cc_destroy(client_header_t *header)
/*
* Set the timeout value for this client handle.
*/
-static int
+int
cl_sto(
CLIENT *clntp,
char *hostname,
diff --git a/usr/src/uts/common/io/lvm/md/md_subr.c b/usr/src/uts/common/io/lvm/md/md_subr.c
index 95f206d91f..bff37b242c 100644
--- a/usr/src/uts/common/io/lvm/md/md_subr.c
+++ b/usr/src/uts/common/io/lvm/md/md_subr.c
@@ -3964,6 +3964,7 @@ mdmn_send_capability_message(minor_t mnum, volcap_t vc, IOLOCK *lockp)
md_mn_kresult_t *kres;
mdi_unit_t *ui = MDI_UNIT(mnum);
int ret;
+ k_sigset_t oldmask, newmask;
(void) strncpy((char *)&msg.msg_setcap_driver,
md_ops[ui->ui_opsindex]->md_driver.md_drivername, MD_DRIVERNAMELEN);
@@ -3973,9 +3974,19 @@ mdmn_send_capability_message(minor_t mnum, volcap_t vc, IOLOCK *lockp)
if (lockp)
IOLOCK_RETURN_RELEASE(0, lockp);
kres = kmem_zalloc(sizeof (md_mn_kresult_t), KM_SLEEP);
+
+ /*
+ * Mask signals for the mdmd_ksend_message call. This keeps the door
+ * interface from failing if the user process receives a signal while
+ * in mdmn_ksend_message.
+ */
+ sigfillset(&newmask);
+ sigreplace(&newmask, &oldmask);
ret = (mdmn_ksend_message(MD_MIN2SET(mnum), MD_MN_MSG_SET_CAP,
MD_MSGF_NO_LOG, (char *)&msg, sizeof (md_mn_msg_setcap_t),
kres));
+ sigreplace(&oldmask, (k_sigset_t *)NULL);
+
if (!MDMN_KSEND_MSG_OK(ret, kres)) {
mdmn_ksend_show_error(ret, kres, "MD_MN_MSG_SET_CAP");
ret = EIO;
@@ -4001,6 +4012,7 @@ mdmn_clear_all_capabilities(minor_t mnum)
int ret;
md_mn_kresult_t *kresult;
volcap_t vc;
+ k_sigset_t oldmask, newmask;
clumsg.dev = md_makedevice(md_major, mnum);
clumsg.mde = mdnullerror;
@@ -4009,10 +4021,20 @@ mdmn_clear_all_capabilities(minor_t mnum)
* result be stored in the MCT. We want an up-to-date state.
*/
kresult = kmem_zalloc(sizeof (md_mn_kresult_t), KM_SLEEP);
+
+ /*
+ * Mask signals for the mdmd_ksend_message call. This keeps the door
+ * interface from failing if the user process receives a signal while
+ * in mdmn_ksend_message.
+ */
+ sigfillset(&newmask);
+ sigreplace(&newmask, &oldmask);
ret = mdmn_ksend_message(MD_MIN2SET(mnum),
MD_MN_MSG_CLU_CHECK,
MD_MSGF_STOP_ON_ERROR | MD_MSGF_NO_LOG | MD_MSGF_NO_MCT,
(char *)&clumsg, sizeof (clumsg), kresult);
+ sigreplace(&oldmask, (k_sigset_t *)NULL);
+
if ((ret == 0) && (kresult->kmmr_exitval == 0)) {
/*
* Not open on any node, clear all capabilities, eg ABR and