1 /*
   2  * This file and its contents are supplied under the terms of the
   3  * Common Development and Distribution License ("CDDL"), version 1.0.
   4  * You may only use this file in accordance with the terms of version
   5  * 1.0 of the CDDL.
   6  *
   7  * A full copy of the text of the CDDL should have accompanied this
   8  * source.  A copy is of the CDDL is also available via the Internet
   9  * at http://www.illumos.org/license/CDDL.
  10  */
  11 
  12 /*
  13  * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
  14  */
  15 
  16 /*
  17  * NFS Lock Manager, client-side
  18  * Note: depends on (links with) klmmod
  19  *
  20  * This file contains all the external entry points of klmops.
  21  * Basically, this is the "glue" to the BSD nlm code.
  22  */
  23 
  24 #include <sys/types.h>
  25 #include <sys/errno.h>
  26 #include <sys/modctl.h>
  27 #include <sys/flock.h>
  28 
  29 #include <nfs/lm.h>
  30 #include <rpcsvc/nlm_prot.h>
  31 #include "nlm_impl.h"
  32 
  33 
  34 static struct modlmisc modlmisc = {
  35         &mod_miscops, "lock mgr calls"
  36 };
  37 
  38 static struct modlinkage modlinkage = {
  39         MODREV_1, &modlmisc, NULL
  40 };
  41 
  42 
  43 
  44 /*
  45  * ****************************************************************
  46  * module init, fini, info
  47  */
  48 int
  49 _init()
  50 {
  51         return (mod_install(&modlinkage));
  52 }
  53 
  54 int
  55 _fini()
  56 {
  57         /* Don't unload. */
  58         return (EBUSY);
  59 }
  60 
  61 int
  62 _info(struct modinfo *modinfop)
  63 {
  64         return (mod_info(&modlinkage, modinfop));
  65 }
  66 
  67 
  68 
  69 /*
  70  * ****************************************************************
  71  * Stubs listed in modstubs.s
  72  * These are called from fs/nfs
  73  */
  74 
  75 /*
  76  * NFSv2 lock/unlock.  Called by nfs_frlock()
  77  * Uses NLM version 1 (NLM_VERS)
  78  */
  79 int
  80 lm_frlock(struct vnode *vp, int cmd, struct flock64 *flk, int flags,
  81     u_offset_t off, struct cred *cr, struct netobj *fh,
  82     struct flk_callback *flcb)
  83 {
  84         return (nlm_frlock(vp, cmd, flk, flags, off,
  85             cr, fh, flcb, NLM_VERS));
  86 }
  87 
  88 /*
  89  * NFSv3 lock/unlock.  Called by nfs3_frlock()
  90  * Uses NLM version 4 (NLM4_VERS)
  91  */
  92 int
  93 lm4_frlock(struct vnode *vp, int cmd, struct flock64 *flk, int flags,
  94         u_offset_t off, struct cred *cr, struct netobj *fh,
  95         struct flk_callback *flcb)
  96 {
  97         int err;
  98         err = nlm_frlock(vp, cmd, flk, flags, off,
  99             cr, fh, flcb, NLM4_VERS);
 100         return (err);
 101 }
 102 
 103 /*
 104  * NFSv2 shrlk/unshrlk.  See nfs_shrlock
 105  * Uses NLM version 3 (NLM_VERSX)
 106  */
 107 int
 108 lm_shrlock(struct vnode *vp, int cmd,
 109     struct shrlock *shr, int flags, struct netobj *fh)
 110 {
 111         return (nlm_shrlock(vp, cmd, shr, flags, fh, NLM_VERSX));
 112 }
 113 
 114 /*
 115  * NFSv3 shrlk/unshrlk.  See nfs3_shrlock
 116  * Uses NLM version 4 (NLM4_VERS)
 117  */
 118 int
 119 lm4_shrlock(struct vnode *vp, int cmd,
 120     struct shrlock *shr, int flags, struct netobj *fh)
 121 {
 122         return (nlm_shrlock(vp, cmd, shr, flags, fh, NLM4_VERS));
 123 }
 124 
 125 /*
 126  * Helper for lm_frlock, lm4_frlock, nfs_lockrelease
 127  * After getting a lock from a remote lock manager,
 128  * register the lock locally.
 129  */
 130 void
 131 lm_register_lock_locally(struct vnode *vp, struct lm_sysid *ls,
 132     struct flock64 *flk, int flags, u_offset_t offset)
 133 {
 134         nlm_register_lock_locally(vp, (struct nlm_host *)ls,
 135             flk, flags, offset);
 136 }
 137 
 138 /*
 139  * Old RPC service dispatch functions, no longer used.
 140  * Here only to satisfy modstubs.s references.
 141  */
 142 void
 143 lm_nlm_dispatch(struct svc_req *req, SVCXPRT *xprt)
 144 {
 145         _NOTE(ARGUNUSED(req, xprt))
 146 }
 147 
 148 void
 149 lm_nlm4_dispatch(struct svc_req *req, SVCXPRT *xprt)
 150 {
 151         _NOTE(ARGUNUSED(req, xprt))
 152 }
 153 
 154 /*
 155  * Old internal functions used for reclaiming locks
 156  * our NFS client holds after some server restarts.
 157  * The new NLM code does this differently, so these
 158  * are here only to satisfy modstubs.s references.
 159  */
 160 void
 161 lm_nlm_reclaim(struct vnode *vp, struct flock64 *flkp)
 162 {
 163         _NOTE(ARGUNUSED(vp, flkp))
 164 }
 165 
 166 void
 167 lm_nlm4_reclaim(struct vnode *vp, struct flock64 *flkp)
 168 {
 169         _NOTE(ARGUNUSED(vp, flkp))
 170 }