summaryrefslogtreecommitdiff
path: root/usr/src/cmd/fs.d/nfs/statd/sm_proc.c
diff options
context:
space:
mode:
authorDan Kruchinin <dan.kruchinin@nexenta.com>2013-08-26 20:42:32 -0800
committerChristopher Siden <chris.siden@delphix.com>2013-08-26 21:42:32 -0700
commitbbaa8b60dd95d714741fc474adad3cf710ef4efd (patch)
tree996c4e12a768ed7d389f5a56b8605318955067b3 /usr/src/cmd/fs.d/nfs/statd/sm_proc.c
parent69962b5647e4a8b9b14998733b765925381b727e (diff)
downloadillumos-joyent-bbaa8b60dd95d714741fc474adad3cf710ef4efd.tar.gz
195 Need replacement for nfs/lockd+klm
Reviewed by: Gordon Ross <gordon.ross@nexenta.com> Reviewed by: Jeremy Jones <jeremy@delphix.com> Reviewed by: Jeff Biseda <jbiseda@delphix.com> Approved by: Garrett D'Amore <garrett@damore.org>
Diffstat (limited to 'usr/src/cmd/fs.d/nfs/statd/sm_proc.c')
-rw-r--r--usr/src/cmd/fs.d/nfs/statd/sm_proc.c159
1 files changed, 118 insertions, 41 deletions
diff --git a/usr/src/cmd/fs.d/nfs/statd/sm_proc.c b/usr/src/cmd/fs.d/nfs/statd/sm_proc.c
index 492cb9c639..22592eb95d 100644
--- a/usr/src/cmd/fs.d/nfs/statd/sm_proc.c
+++ b/usr/src/cmd/fs.d/nfs/statd/sm_proc.c
@@ -25,6 +25,7 @@
*/
/*
* Copyright 2013 Nexenta Systems, Inc. All rights reserved.
+ * Copyright (c) 2012 by Delphix. All rights reserved.
*/
/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
@@ -59,6 +60,8 @@
#include <netdir.h>
#include <synch.h>
#include <thread.h>
+#include <ifaddrs.h>
+#include <errno.h>
#include <assert.h>
#include "sm_statd.h"
@@ -89,14 +92,12 @@ extern struct lifconf *getmyaddrs(void);
/* ARGSUSED */
void
-sm_status(namep, resp)
- sm_name *namep;
- sm_stat_res *resp;
+sm_stat_svc(sm_name *namep, sm_stat_res *resp)
{
if (debug)
(void) printf("proc sm_stat: mon_name = %s\n",
- namep->mon_name);
+ namep->mon_name);
resp->res_stat = stat_succ;
resp->state = LOCAL_STATE;
@@ -104,9 +105,7 @@ sm_status(namep, resp)
/* ARGSUSED */
void
-sm_mon(monp, resp)
- mon *monp;
- sm_stat_res *resp;
+sm_mon_svc(mon *monp, sm_stat_res *resp)
{
mon_id *monidp;
monidp = &monp->mon_id;
@@ -114,7 +113,7 @@ sm_mon(monp, resp)
rw_rdlock(&thr_rwlock);
if (debug) {
(void) printf("proc sm_mon: mon_name = %s, id = %d\n",
- monidp->mon_name, * ((int *)monp->priv));
+ monidp->mon_name, * ((int *)monp->priv));
pr_mon(monp->mon_id.mon_name);
}
@@ -132,17 +131,15 @@ sm_mon(monp, resp)
/* ARGSUSED */
void
-sm_unmon(monidp, resp)
- mon_id *monidp;
- sm_stat *resp;
+sm_unmon_svc(mon_id *monidp, sm_stat *resp)
{
rw_rdlock(&thr_rwlock);
if (debug) {
(void) printf(
- "proc sm_unmon: mon_name = %s, [%s, %d, %d, %d]\n",
- monidp->mon_name, monidp->my_id.my_name,
- monidp->my_id.my_prog, monidp->my_id.my_vers,
- monidp->my_id.my_proc);
+ "proc sm_unmon: mon_name = %s, [%s, %d, %d, %d]\n",
+ monidp->mon_name, monidp->my_id.my_name,
+ monidp->my_id.my_prog, monidp->my_id.my_vers,
+ monidp->my_id.my_proc);
pr_mon(monidp->mon_name);
}
@@ -154,16 +151,14 @@ sm_unmon(monidp, resp)
/* ARGSUSED */
void
-sm_unmon_all(myidp, resp)
- my_id *myidp;
- sm_stat *resp;
+sm_unmon_all_svc(my_id *myidp, sm_stat *resp)
{
rw_rdlock(&thr_rwlock);
if (debug)
(void) printf("proc sm_unmon_all: [%s, %d, %d, %d]\n",
- myidp->my_name,
- myidp->my_prog, myidp->my_vers,
- myidp->my_proc);
+ myidp->my_name,
+ myidp->my_prog, myidp->my_vers,
+ myidp->my_proc);
delete_mon((char *)NULL, myidp);
pr_mon(NULL);
resp->state = local_state;
@@ -174,21 +169,19 @@ sm_unmon_all(myidp, resp)
* Notifies lockd specified by name that state has changed for this server.
*/
void
-sm_notify(ntfp)
- stat_chge *ntfp;
+sm_notify_svc(stat_chge *ntfp)
{
rw_rdlock(&thr_rwlock);
if (debug)
(void) printf("sm_notify: %s state =%d\n",
- ntfp->mon_name, ntfp->state);
+ ntfp->mon_name, ntfp->state);
send_notice(ntfp->mon_name, ntfp->state);
rw_unlock(&thr_rwlock);
}
/* ARGSUSED */
void
-sm_simu_crash(myidp)
- void *myidp;
+sm_simu_crash_svc(void *myidp)
{
int i;
struct mon_entry *monitor_q;
@@ -727,7 +720,6 @@ thr_send_notice(void *arg)
moninfo_t *minfop;
minfop = (moninfo_t *)arg;
-
if (statd_call_lockd(&minfop->id, minfop->state) == -1) {
if (debug && minfop->id.mon_id.mon_name)
(void) printf("problem with notifying %s failure, "
@@ -759,7 +751,7 @@ statd_call_lockd(monp, state)
{
enum clnt_stat clnt_stat;
struct timeval tottimeout;
- struct status stat;
+ struct sm_status stat;
my_id *my_idp;
char *mon_name;
int i;
@@ -768,7 +760,7 @@ statd_call_lockd(monp, state)
mon_name = monp->mon_id.mon_name;
my_idp = &monp->mon_id.my_id;
- (void) memset(&stat, 0, sizeof (struct status));
+ (void) memset(&stat, 0, sizeof (stat));
stat.mon_name = mon_name;
stat.state = state;
for (i = 0; i < 16; i++) {
@@ -781,12 +773,14 @@ statd_call_lockd(monp, state)
tottimeout.tv_sec = SM_RPC_TIMEOUT;
tottimeout.tv_usec = 0;
- if ((clnt = create_client(my_idp->my_name, my_idp->my_prog,
- my_idp->my_vers, &tottimeout)) == (CLIENT *) NULL) {
- return (-1);
+ clnt = create_client(my_idp->my_name, my_idp->my_prog, my_idp->my_vers,
+ "ticotsord", &tottimeout);
+ if (clnt == NULL) {
+ return (-1);
}
- clnt_stat = clnt_call(clnt, my_idp->my_proc, xdr_status, (char *)&stat,
+ clnt_stat = clnt_call(clnt, my_idp->my_proc,
+ xdr_sm_status, (char *)&stat,
xdr_void, NULL, tottimeout);
if (debug) {
(void) printf("clnt_stat=%s(%d)\n",
@@ -808,21 +802,35 @@ statd_call_lockd(monp, state)
* Client handle created.
*/
CLIENT *
-create_client(host, prognum, versnum, utimeout)
- char *host;
- int prognum;
- int versnum;
- struct timeval *utimeout;
+create_client(char *host, int prognum, int versnum, char *netid,
+ struct timeval *utimeout)
{
int fd;
struct timeval timeout;
CLIENT *client;
struct t_info tinfo;
- if ((client = clnt_create_timed(host, prognum, versnum,
- "netpath", utimeout)) == NULL) {
+ if (netid == NULL) {
+ client = clnt_create_timed(host, prognum, versnum,
+ "netpath", utimeout);
+ } else {
+ struct netconfig *nconf;
+
+ nconf = getnetconfigent(netid);
+ if (nconf == NULL) {
+ return (NULL);
+ }
+
+ client = clnt_tp_create_timed(host, prognum, versnum, nconf,
+ utimeout);
+
+ freenetconfigent(nconf);
+ }
+
+ if (client == NULL) {
return (NULL);
}
+
(void) CLNT_CONTROL(client, CLGET_FD, (caddr_t)&fd);
if (t_getinfo(fd, &tinfo) != -1) {
if (tinfo.servtype == T_CLTS) {
@@ -832,7 +840,7 @@ create_client(host, prognum, versnum, utimeout)
timeout.tv_usec = 0;
timeout.tv_sec = SM_CLTS_TIMEOUT;
(void) CLNT_CONTROL(client,
- CLSET_RETRY_TIMEOUT, (caddr_t)&timeout);
+ CLSET_RETRY_TIMEOUT, (caddr_t)&timeout);
}
} else
return (NULL);
@@ -1301,3 +1309,72 @@ str_cmp_address_specifier(char *specifier1, char *specifier2)
}
return (1);
}
+
+/*
+ * Add IP address strings to the host_name list.
+ */
+void
+merge_ips(void)
+{
+ struct ifaddrs *ifap, *cifap;
+ int error;
+
+ error = getifaddrs(&ifap);
+ if (error) {
+ syslog(LOG_WARNING, "getifaddrs error: '%s'",
+ strerror(errno));
+ return;
+ }
+
+ for (cifap = ifap; cifap != NULL; cifap = cifap->ifa_next) {
+ struct sockaddr *sa = cifap->ifa_addr;
+ char addr_str[INET6_ADDRSTRLEN];
+ void *addr = NULL;
+
+ switch (sa->sa_family) {
+ case AF_INET: {
+ struct sockaddr_in *sin = (struct sockaddr_in *)sa;
+
+ /* Skip loopback addresses. */
+ if (sin->sin_addr.s_addr == htonl(INADDR_LOOPBACK)) {
+ continue;
+ }
+
+ addr = &sin->sin_addr;
+ break;
+ }
+
+ case AF_INET6: {
+ struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa;
+
+ /* Skip loopback addresses. */
+ if (IN6_IS_ADDR_LOOPBACK(&sin6->sin6_addr)) {
+ continue;
+ }
+
+ addr = &sin6->sin6_addr;
+ break;
+ }
+
+ default:
+ syslog(LOG_WARNING, "Unknown address family %d for "
+ "interface %s", sa->sa_family, cifap->ifa_name);
+ continue;
+ }
+
+ if (inet_ntop(sa->sa_family, addr, addr_str, sizeof (addr_str))
+ == NULL) {
+ syslog(LOG_WARNING, "Failed to convert address into "
+ "string representation for interface '%s' "
+ "address family %d", cifap->ifa_name,
+ sa->sa_family);
+ continue;
+ }
+
+ if (!in_host_array(addr_str)) {
+ add_to_host_array(addr_str);
+ }
+ }
+
+ freeifaddrs(ifap);
+}