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
_init()49 _init()
50 {
51 return (mod_install(&modlinkage));
52 }
53
54 int
_fini()55 _fini()
56 {
57 /* Don't unload. */
58 return (EBUSY);
59 }
60
61 int
_info(struct modinfo * modinfop)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
lm_frlock(struct vnode * vp,int cmd,struct flock64 * flk,int flags,u_offset_t off,struct cred * cr,struct netobj * fh,struct flk_callback * flcb)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
lm4_frlock(struct vnode * vp,int cmd,struct flock64 * flk,int flags,u_offset_t off,struct cred * cr,struct netobj * fh,struct flk_callback * flcb)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
lm_shrlock(struct vnode * vp,int cmd,struct shrlock * shr,int flags,struct netobj * fh)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
lm4_shrlock(struct vnode * vp,int cmd,struct shrlock * shr,int flags,struct netobj * fh)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 nfs_lockrelease.
127 */
128 void
lm_register_lock_locally(struct vnode * vp,struct lm_sysid * ls,struct flock64 * flk,int flags,u_offset_t offset)129 lm_register_lock_locally(struct vnode *vp, struct lm_sysid *ls,
130 struct flock64 *flk, int flags, u_offset_t offset)
131 {
132 nlm_register_lock_locally(vp, (struct nlm_host *)ls,
133 flk, flags, offset);
134 }
135
136 /*
137 * Old RPC service dispatch functions, no longer used.
138 * Here only to satisfy modstubs.S references.
139 */
140 void
lm_nlm_dispatch(struct svc_req * req,SVCXPRT * xprt)141 lm_nlm_dispatch(struct svc_req *req, SVCXPRT *xprt)
142 {
143 _NOTE(ARGUNUSED(req, xprt))
144 }
145
146 void
lm_nlm4_dispatch(struct svc_req * req,SVCXPRT * xprt)147 lm_nlm4_dispatch(struct svc_req *req, SVCXPRT *xprt)
148 {
149 _NOTE(ARGUNUSED(req, xprt))
150 }
151
152 /*
153 * Old internal functions used for reclaiming locks
154 * our NFS client holds after some server restarts.
155 * The new NLM code does this differently, so these
156 * are here only to satisfy modstubs.S references.
157 */
158 void
lm_nlm_reclaim(struct vnode * vp,struct flock64 * flkp)159 lm_nlm_reclaim(struct vnode *vp, struct flock64 *flkp)
160 {
161 _NOTE(ARGUNUSED(vp, flkp))
162 }
163
164 void
lm_nlm4_reclaim(struct vnode * vp,struct flock64 * flkp)165 lm_nlm4_reclaim(struct vnode *vp, struct flock64 *flkp)
166 {
167 _NOTE(ARGUNUSED(vp, flkp))
168 }
169