diff options
Diffstat (limited to 'usr/src/uts/common/klm')
| -rw-r--r-- | usr/src/uts/common/klm/klmmod.c | 5 | ||||
| -rw-r--r-- | usr/src/uts/common/klm/mapfile-mod | 6 | ||||
| -rw-r--r-- | usr/src/uts/common/klm/nlm_dispatch.c | 11 | ||||
| -rw-r--r-- | usr/src/uts/common/klm/nlm_impl.c | 37 | ||||
| -rw-r--r-- | usr/src/uts/common/klm/nlm_impl.h | 2 |
5 files changed, 51 insertions, 10 deletions
diff --git a/usr/src/uts/common/klm/klmmod.c b/usr/src/uts/common/klm/klmmod.c index 51ed43e198..58e0f2d874 100644 --- a/usr/src/uts/common/klm/klmmod.c +++ b/usr/src/uts/common/klm/klmmod.c @@ -12,6 +12,7 @@ /* * Copyright 2011 Nexenta Systems, Inc. All rights reserved. * Copyright (c) 2012 by Delphix. All rights reserved. + * Copyright 2017 Joyent, Inc. */ /* @@ -278,6 +279,10 @@ lm_svc(struct lm_svc_args *args) rfs4_lease_time = args->grace; } + if (args->n_v4_only == -1) { + g->nlm_v4_only = B_TRUE; + } + mutex_exit(&g->lock); err = nlm_svc_starting(g, fp, netid, &knc); mutex_enter(&g->lock); diff --git a/usr/src/uts/common/klm/mapfile-mod b/usr/src/uts/common/klm/mapfile-mod index 0debe6d986..b7789d81fd 100644 --- a/usr/src/uts/common/klm/mapfile-mod +++ b/usr/src/uts/common/klm/mapfile-mod @@ -11,6 +11,7 @@ # # Copyright 2011 Nexenta Systems, Inc. All rights reserved. +# Copyright 2017 Joyent, Inc. # @@ -49,6 +50,11 @@ SYMBOL_SCOPE { nlm_frlock; nlm_register_lock_locally; nlm_shrlock; +# These four functions are available for use within a branded zone. + nlm_nsm_clnt_init; + nlm_netbuf_to_netobj; + sm_mon_1; + sm_unmon_1; local: *; diff --git a/usr/src/uts/common/klm/nlm_dispatch.c b/usr/src/uts/common/klm/nlm_dispatch.c index a0ca2a56c4..8fa9940eae 100644 --- a/usr/src/uts/common/klm/nlm_dispatch.c +++ b/usr/src/uts/common/klm/nlm_dispatch.c @@ -11,6 +11,7 @@ /* * Copyright 2013 Nexenta Systems, Inc. All rights reserved. + * Copyright 2017 Joyent, Inc. All rights reserved. */ /* @@ -412,13 +413,13 @@ nlm_prog_3_dtable[] = { 0, 0 }, - { /* 16: not used */ - NLM_SVC_FUNC(0), - (xdrproc_t)0, - (xdrproc_t)0, + { /* 16: Linux NLMPROC_NSM_NOTIFY (same handling as NLM_SM_NOTIFY1) */ + NLM_SVC_FUNC(nlm_sm_notify1_2_svc), + (xdrproc_t)xdr_nlm_sm_status, + (xdrproc_t)xdr_void, NULL, 0, - 0 }, + NLM_DISP_NOREMOTE }, { /* 17: NLM_SM_NOTIFY1 */ NLM_SVC_FUNC(nlm_sm_notify1_2_svc), diff --git a/usr/src/uts/common/klm/nlm_impl.c b/usr/src/uts/common/klm/nlm_impl.c index 1e9033a17c..e787f70ebd 100644 --- a/usr/src/uts/common/klm/nlm_impl.c +++ b/usr/src/uts/common/klm/nlm_impl.c @@ -28,6 +28,7 @@ /* * Copyright 2015 Nexenta Systems, Inc. All rights reserved. * Copyright (c) 2012 by Delphix. All rights reserved. + * Copyright 2017 Joyent, Inc. All rights reserved. */ /* @@ -57,6 +58,7 @@ #include <sys/queue.h> #include <sys/bitmap.h> #include <sys/sdt.h> +#include <sys/brand.h> #include <netinet/in.h> #include <rpc/rpc.h> @@ -202,6 +204,12 @@ static struct nlm_knc nlm_netconfigs[] = { /* (g) */ }; /* + * NLM functions which can be called by a brand hook. + */ +void nlm_netbuf_to_netobj(struct netbuf *, int *, netobj *); +void nlm_nsm_clnt_init(CLIENT *, struct nlm_nsm *); + +/* * NLM misc. function */ static void nlm_copy_netbuf(struct netbuf *, struct netbuf *); @@ -210,8 +218,6 @@ static void nlm_kmem_reclaim(void *); static void nlm_pool_shutdown(void); static void nlm_suspend_zone(struct nlm_globals *); static void nlm_resume_zone(struct nlm_globals *); -static void nlm_nsm_clnt_init(CLIENT *, struct nlm_nsm *); -static void nlm_netbuf_to_netobj(struct netbuf *, int *, netobj *); /* * NLM thread functions @@ -1839,6 +1845,12 @@ nlm_host_unmonitor(struct nlm_globals *g, struct nlm_host *host) return; host->nh_flags &= ~NLM_NH_MONITORED; + + if (ZONE_IS_BRANDED(curzone) && ZBROP(curzone)->b_rpc_statd != NULL) { + ZBROP(curzone)->b_rpc_statd(SM_UNMON, g, host); + return; + } + stat = nlm_nsm_unmon(&g->nlm_nsm, host->nh_name); if (stat != RPC_SUCCESS) { NLM_WARN("NLM: Failed to contact statd, stat=%d\n", stat); @@ -1877,6 +1889,11 @@ nlm_host_monitor(struct nlm_globals *g, struct nlm_host *host, int state) host->nh_flags |= NLM_NH_MONITORED; mutex_exit(&host->nh_lock); + if (ZONE_IS_BRANDED(curzone) && ZBROP(curzone)->b_rpc_statd != NULL) { + ZBROP(curzone)->b_rpc_statd(SM_MON, g, host); + return; + } + /* * Before we begin monitoring the host register the network address * associated with this hostname. @@ -2353,6 +2370,13 @@ nlm_svc_starting(struct nlm_globals *g, struct file *fp, VERIFY(g->run_status == NLM_ST_STARTING); VERIFY(g->nlm_gc_thread == NULL); + if (g->nlm_v4_only) { + NLM_WARN("Zone %d has no rpcbind, NLM is v4 only", getzoneid()); + bzero(&g->nlm_nsm, sizeof (struct nlm_nsm)); + g->nlm_nsm.ns_addr_handle = (void *)-1; + goto v4_only; + } + error = nlm_nsm_init_local(&g->nlm_nsm); if (error != 0) { NLM_ERR("Failed to initialize NSM handler " @@ -2389,6 +2413,7 @@ nlm_svc_starting(struct nlm_globals *g, struct file *fp, "(rpcerr=%d)\n", stat); goto shutdown_lm; } +v4_only: g->grace_threshold = ddi_get_lbolt() + SEC_TO_TICK(g->grace_period); @@ -2512,7 +2537,9 @@ nlm_svc_stopping(struct nlm_globals *g) ASSERT(TAILQ_EMPTY(&g->nlm_slocks)); - nlm_nsm_fini(&g->nlm_nsm); + /* If started with rpcbind (the normal case) */ + if (g->nlm_nsm.ns_addr_handle != (void *)-1) + nlm_nsm_fini(&g->nlm_nsm); g->lockd_pid = 0; g->run_status = NLM_ST_DOWN; } @@ -2781,14 +2808,14 @@ nlm_cprresume(void) rw_exit(&lm_lck); } -static void +void nlm_nsm_clnt_init(CLIENT *clnt, struct nlm_nsm *nsm) { (void) clnt_tli_kinit(clnt, &nsm->ns_knc, &nsm->ns_addr, 0, NLM_RPC_RETRIES, kcred); } -static void +void nlm_netbuf_to_netobj(struct netbuf *addr, int *family, netobj *obj) { /* LINTED pointer alignment */ diff --git a/usr/src/uts/common/klm/nlm_impl.h b/usr/src/uts/common/klm/nlm_impl.h index 6b2df7f8b0..2ac711f3c7 100644 --- a/usr/src/uts/common/klm/nlm_impl.h +++ b/usr/src/uts/common/klm/nlm_impl.h @@ -30,6 +30,7 @@ /* * Copyright 2012 Nexenta Systems, Inc. All rights reserved. * Copyright (c) 2012 by Delphix. All rights reserved. + * Copyright 2016 Joyent, Inc. */ /* @@ -459,6 +460,7 @@ struct nlm_globals { int cn_idle_tmo; /* (z) */ int grace_period; /* (z) */ int retrans_tmo; /* (z) */ + boolean_t nlm_v4_only; /* (z) */ kmutex_t clean_lock; /* (c) */ TAILQ_ENTRY(nlm_globals) nlm_link; /* (g) */ }; |
