bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin/*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * This file and its contents are supplied under the terms of the
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Common Development and Distribution License ("CDDL"), version 1.0.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * You may only use this file in accordance with the terms of version
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * 1.0 of the CDDL.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin *
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * A full copy of the text of the CDDL should have accompanied this
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * source. A copy is of the CDDL is also available via the Internet
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * at http://www.illumos.org/license/CDDL.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin/*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Copyright (c) 2012 by Delphix. All rights reserved.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin/*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * NFS Lock Manager, server-side and common.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin *
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * This file contains all the external entry points of klmmod.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Basically, this is the "glue" to the BSD nlm code.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#include <sys/types.h>
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#include <sys/errno.h>
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#include <sys/modctl.h>
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#include <sys/flock.h>
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#include <nfs/nfs.h>
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#include <nfs/nfssys.h>
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#include <nfs/lm.h>
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#include <rpcsvc/nlm_prot.h>
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#include "nlm_impl.h"
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininstatic struct modlmisc modlmisc = {
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin &mod_miscops, "lock mgr common module"
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin};
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininstatic struct modlinkage modlinkage = {
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin MODREV_1, &modlmisc, NULL
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin};
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin/*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Cluster node ID. Zero unless we're part of a cluster.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Set by lm_set_nlmid_flk. Pass to lm_set_nlm_status.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * We're not yet doing "clustered" NLM stuff.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininint lm_global_nlmid = 0;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin/*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Call-back hook for clusters: Set lock manager status.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * If this hook is set, call this instead of the ususal
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * flk_set_lockmgr_status(FLK_LOCKMGR_UP / DOWN);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininvoid (*lm_set_nlm_status)(int nlm_id, flk_nlm_status_t) = NULL;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin/*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Call-back hook for clusters: Delete all locks held by sysid.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Call from code that drops all client locks (for which we're
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * the server) i.e. after the SM tells us a client has crashed.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininvoid (*lm_remove_file_locks)(int) = NULL;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininkrwlock_t lm_lck;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininzone_key_t nlm_zone_key;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin/*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Init/fini per-zone stuff for klm
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin/* ARGSUSED */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininvoid *
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininlm_zone_init(zoneid_t zoneid)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin{
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin struct nlm_globals *g;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin g = kmem_zalloc(sizeof (*g), KM_SLEEP);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin avl_create(&g->nlm_hosts_tree, nlm_host_cmp,
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin sizeof (struct nlm_host),
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin offsetof(struct nlm_host, nh_by_addr));
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin g->nlm_hosts_hash = mod_hash_create_idhash("nlm_host_by_sysid",
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin 64, mod_hash_null_valdtor);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin TAILQ_INIT(&g->nlm_idle_hosts);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin TAILQ_INIT(&g->nlm_slocks);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin mutex_init(&g->lock, NULL, MUTEX_DEFAULT, NULL);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin cv_init(&g->nlm_gc_sched_cv, NULL, CV_DEFAULT, NULL);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin cv_init(&g->nlm_gc_finish_cv, NULL, CV_DEFAULT, NULL);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin mutex_init(&g->clean_lock, NULL, MUTEX_DEFAULT, NULL);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin g->lockd_pid = 0;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin g->run_status = NLM_ST_DOWN;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin nlm_globals_register(g);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin return (g);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin}
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin/* ARGSUSED */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininvoid
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininlm_zone_fini(zoneid_t zoneid, void *data)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin{
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin struct nlm_globals *g = data;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin ASSERT(avl_is_empty(&g->nlm_hosts_tree));
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin avl_destroy(&g->nlm_hosts_tree);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin mod_hash_destroy_idhash(g->nlm_hosts_hash);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin ASSERT(g->nlm_gc_thread == NULL);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin mutex_destroy(&g->lock);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin cv_destroy(&g->nlm_gc_sched_cv);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin cv_destroy(&g->nlm_gc_finish_cv);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin mutex_destroy(&g->clean_lock);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin nlm_globals_unregister(g);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin kmem_free(g, sizeof (*g));
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin}
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin/*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * ****************************************************************
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * module init, fini, info
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininint
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin_init()
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin{
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin int retval;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin rw_init(&lm_lck, NULL, RW_DEFAULT, NULL);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin nlm_init();
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin zone_key_create(&nlm_zone_key, lm_zone_init, NULL, lm_zone_fini);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /* Per-zone lockmgr data. See: os/flock.c */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin zone_key_create(&flock_zone_key, flk_zone_init, NULL, flk_zone_fini);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin retval = mod_install(&modlinkage);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin if (retval == 0)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin return (0);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * mod_install failed! undo above, reverse order
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin (void) zone_key_delete(flock_zone_key);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin flock_zone_key = ZONE_KEY_UNINITIALIZED;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin (void) zone_key_delete(nlm_zone_key);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin rw_destroy(&lm_lck);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin return (retval);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin}
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininint
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin_fini()
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin{
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /* Don't unload. */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin return (EBUSY);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin}
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininint
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin_info(struct modinfo *modinfop)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin{
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin return (mod_info(&modlinkage, modinfop));
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin}
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin/*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * ****************************************************************
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Stubs listed in modstubs.s
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin/*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * klm system calls. Start service on some endpoint.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Called by nfssys() LM_SVC, from lockd.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininint
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininlm_svc(struct lm_svc_args *args)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin{
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin struct knetconfig knc;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin const char *netid;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin struct nlm_globals *g;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin struct file *fp = NULL;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin int err = 0;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /* Get our "globals" */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin g = zone_getspecific(nlm_zone_key, curzone);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Check version of lockd calling.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin if (args->version != LM_SVC_CUR_VERS) {
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin NLM_ERR("lm_svc: Version mismatch "
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin "(given 0x%x, expected 0x%x)\n",
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin args->version, LM_SVC_CUR_VERS);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin return (EINVAL);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin }
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Build knetconfig, checking arg values.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Also come up with the "netid" string.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * (With some knowledge of /etc/netconfig)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin bzero(&knc, sizeof (knc));
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin switch (args->n_proto) {
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin case LM_TCP:
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin knc.knc_semantics = NC_TPI_COTS_ORD;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin knc.knc_proto = NC_TCP;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin break;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin case LM_UDP:
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin knc.knc_semantics = NC_TPI_CLTS;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin knc.knc_proto = NC_UDP;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin break;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin default:
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin NLM_ERR("nlm_build_knetconfig: Unknown "
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin "lm_proto=0x%x\n", args->n_proto);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin return (EINVAL);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin }
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin switch (args->n_fmly) {
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin case LM_INET:
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin knc.knc_protofmly = NC_INET;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin break;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin case LM_INET6:
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin knc.knc_protofmly = NC_INET6;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin break;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin case LM_LOOPBACK:
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin knc.knc_protofmly = NC_LOOPBACK;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /* Override what we set above. */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin knc.knc_proto = NC_NOPROTO;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin break;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin default:
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin NLM_ERR("nlm_build_knetconfig: Unknown "
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin "lm_fmly=0x%x\n", args->n_fmly);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin return (EINVAL);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin }
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin knc.knc_rdev = args->n_rdev;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin netid = nlm_knc_to_netid(&knc);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin if (!netid)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin return (EINVAL);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Setup service on the passed transport.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * NB: must releasef(fp) after this.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin if ((fp = getf(args->fd)) == NULL)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin return (EBADF);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin mutex_enter(&g->lock);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Don't try to start while still shutting down,
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * or lots of things will fail...
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin if (g->run_status == NLM_ST_STOPPING) {
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin err = EAGAIN;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin goto out;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin }
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * There is no separate "initialize" sub-call for nfssys,
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * and we want to do some one-time work when the first
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * binding comes in from lockd.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin if (g->run_status == NLM_ST_DOWN) {
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin g->run_status = NLM_ST_STARTING;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin g->lockd_pid = curproc->p_pid;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /* Save the options. */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin g->cn_idle_tmo = args->timout;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin g->grace_period = args->grace;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin g->retrans_tmo = args->retransmittimeout;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /* See nfs_sys.c (not yet per-zone) */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin if (INGLOBALZONE(curproc)) {
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin rfs4_grace_period = args->grace;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin rfs4_lease_time = args->grace;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin }
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin mutex_exit(&g->lock);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin err = nlm_svc_starting(g, fp, netid, &knc);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin mutex_enter(&g->lock);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin } else {
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * If KLM is not started and the very first endpoint lockd
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * tries to add is not a loopback device, report an error.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin if (g->run_status != NLM_ST_UP) {
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin err = ENOTACTIVE;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin goto out;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin }
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin if (g->lockd_pid != curproc->p_pid) {
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /* Check if caller has the same PID lockd does */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin err = EPERM;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin goto out;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin }
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin err = nlm_svc_add_ep(fp, netid, &knc);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin }
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininout:
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin mutex_exit(&g->lock);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin if (fp != NULL)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin releasef(args->fd);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin return (err);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin}
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin/*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * klm system calls. Kill the lock manager.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Called by nfssys() KILL_LOCKMGR,
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * liblm:lm_shutdown() <- unused?
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininint
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininlm_shutdown(void)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin{
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin struct nlm_globals *g;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin proc_t *p;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin pid_t pid;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /* Get our "globals" */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin g = zone_getspecific(nlm_zone_key, curzone);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin mutex_enter(&g->lock);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin if (g->run_status != NLM_ST_UP) {
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin mutex_exit(&g->lock);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin return (EBUSY);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin }
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin g->run_status = NLM_ST_STOPPING;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin pid = g->lockd_pid;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin mutex_exit(&g->lock);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin nlm_svc_stopping(g);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin mutex_enter(&pidlock);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin p = prfind(pid);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin if (p != NULL)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin psignal(p, SIGTERM);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin mutex_exit(&pidlock);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin return (0);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin}
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin/*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Cleanup remote locks on FS un-export.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin *
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * NOTE: called from nfs_export.c:unexport()
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * right before the share is going to
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * be unexported.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininvoid
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininlm_unexport(struct exportinfo *exi)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin{
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin nlm_unexport(exi);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin}
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin/*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * CPR suspend/resume hooks.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * See:cpr_suspend, cpr_resume
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin *
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Before suspend, get current state from "statd" on
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * all remote systems for which we have locks.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin *
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * After resume, check with those systems again,
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * and either reclaim locks, or do SIGLOST.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininvoid
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininlm_cprsuspend(void)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin{
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin nlm_cprsuspend();
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin}
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininvoid
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininlm_cprresume(void)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin{
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin nlm_cprresume();
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin}
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin/*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Add the nlm_id bits to the sysid (by ref).
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininvoid
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininlm_set_nlmid_flk(int *new_sysid)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin{
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin if (lm_global_nlmid != 0)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin *new_sysid |= (lm_global_nlmid << BITS_IN_SYSID);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin}
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin/*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * It seems that closed source klmmod used
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * this function to release knetconfig stored
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * in mntinfo structure (see mntinfo's mi_klmconfig
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * field).
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * We store knetconfigs differently, thus we don't
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * need this function.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininvoid
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininlm_free_config(struct knetconfig *knc)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin{
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin _NOTE(ARGUNUSED(knc));
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin}
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin/*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Called by NFS4 delegation code to check if there are any
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * NFSv2/v3 locks for the file, so it should not delegate.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin *
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * NOTE: called from NFSv4 code
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * (see nfs4_srv_deleg.c:rfs4_bgrant_delegation())
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininint
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininlm_vp_active(const vnode_t *vp)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin{
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin return (nlm_vp_active(vp));
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin}
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin/*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Find or create a "sysid" for given knc+addr.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * name is optional. Sets nc_changed if the
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * found knc_proto is different from passed.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Increments the reference count.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin *
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Called internally, and in nfs4_find_sysid()
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininstruct lm_sysid *
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininlm_get_sysid(struct knetconfig *knc, struct netbuf *addr,
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin char *name, bool_t *nc_changed)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin{
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin struct nlm_globals *g;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin const char *netid;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin struct nlm_host *hostp;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin _NOTE(ARGUNUSED(nc_changed));
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin netid = nlm_knc_to_netid(knc);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin if (netid == NULL)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin return (NULL);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin g = zone_getspecific(nlm_zone_key, curzone);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin hostp = nlm_host_findcreate(g, name, netid, addr);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin if (hostp == NULL)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin return (NULL);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin return ((struct lm_sysid *)hostp);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin}
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin/*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Release a reference on a "sysid".
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininvoid
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininlm_rel_sysid(struct lm_sysid *sysid)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin{
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin struct nlm_globals *g;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin g = zone_getspecific(nlm_zone_key, curzone);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin nlm_host_release(g, (struct nlm_host *)sysid);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin}
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin/*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Alloc/free a sysid_t (a unique number between
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * LM_SYSID and LM_SYSID_MAX).
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin *
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Used by NFSv4 rfs4_op_lockt and smbsrv/smb_fsop_frlock,
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * both to represent non-local locks outside of klm.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin *
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * NOTE: called from NFSv4 and SMBFS to allocate unique
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * sysid.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininsysid_t
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininlm_alloc_sysidt(void)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin{
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin return (nlm_sysid_alloc());
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin}
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininvoid
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininlm_free_sysidt(sysid_t sysid)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin{
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin nlm_sysid_free(sysid);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin}
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin/* Access private member lms->sysid */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininsysid_t
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininlm_sysidt(struct lm_sysid *lms)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin{
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin return (((struct nlm_host *)lms)->nh_sysid);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin}
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin/*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Called by nfs_frlock to check lock constraints.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Return non-zero if the lock request is "safe", i.e.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * the range is not mapped, not MANDLOCK, etc.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin *
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * NOTE: callde from NFSv3/NFSv2 frlock() functions to
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * determine whether it's safe to add new lock.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininint
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininlm_safelock(vnode_t *vp, const struct flock64 *fl, cred_t *cr)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin{
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin return (nlm_safelock(vp, fl, cr));
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin}
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin/*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Called by nfs_lockcompletion to check whether it's "safe"
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * to map the file (and cache it's data). Walks the list of
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * file locks looking for any that are not "whole file".
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin *
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * NOTE: called from nfs_client.c:nfs_lockcompletion()
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininint
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininlm_safemap(const vnode_t *vp)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin{
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin return (nlm_safemap(vp));
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin}
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin/*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Called by nfs_map() for the MANDLOCK case.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Return non-zero if the file has any locks with a
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * blocked request (sleep).
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin *
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * NOTE: called from NFSv3/NFSv2 map() functions in
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * order to determine whether it's safe to add new
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * mapping.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininint
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininlm_has_sleep(const vnode_t *vp)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin{
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin return (nlm_has_sleep(vp));
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin}
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin/*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * ****************************************************************
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Stuff needed by klmops?
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */