1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 #ifndef _NFS_LM_H 28 #define _NFS_LM_H 29 30 #pragma ident "%Z%%M% %I% %E% SMI" 31 32 /* 33 * Interface definitions for the NFSv2/v3 lock manager. 34 */ 35 36 #ifdef __cplusplus 37 extern "C" { 38 #endif 39 40 #include <sys/cred.h> 41 #include <sys/fcntl.h> 42 #include <sys/types.h> 43 #include <sys/vnode.h> 44 #include <rpc/rpc.h> 45 #include <nfs/export.h> 46 47 #ifdef _KERNEL 48 49 /* 50 * Common interfaces. 51 */ 52 53 /* 54 * The numeric sysid is used to identify a host and transport. 55 * 56 * The local locking code uses (pid, sysid) to uniquely identify a process. 57 * This means that the client-side code must doctor up the sysid before 58 * registering a lock, so that the local locking code doesn't confuse a 59 * remote process with a local process just because they have the same pid. 60 * We currently do this by ORing LM_SYSID_CLIENT into the sysid before 61 * registering a lock. 62 * 63 * If you change LM_SYSID and LM_SYSID_MAX, be sure to pick values so that 64 * LM_SYSID_MAX > LM_SYSID using signed arithmetic, and don't use zero. 65 * You may also need a different way to tag lock manager locks that are 66 * registered locally. 67 */ 68 #define LM_SYSID ((sysid_t)0x0001) 69 #define LM_SYSID_MAX ((sysid_t)0x3FFF) 70 #define LM_SYSID_CLIENT ((sysid_t)0x4000) 71 #define LM_NOSYSID ((sysid_t)-1) 72 73 /* 74 * Struct used to represent a host. 75 */ 76 struct lm_sysid; 77 78 /* 79 * Given a knetconfig and network address, returns a reference to the 80 * associated lm_sysid. The 3rd argument is the hostname to assign to the 81 * lm_sysid. The 4th argument is an output parameter. It is set non-zero 82 * if the returned lm_sysid has a different protocol 83 * (knetconfig::knc_proto) than what was requested. 84 */ 85 extern struct lm_sysid *lm_get_sysid(struct knetconfig *, struct netbuf *, 86 char *, bool_t *); 87 extern void lm_rel_sysid(struct lm_sysid *); 88 89 /* 90 * Return the integer sysid for the given lm_sysid. 91 */ 92 extern sysid_t lm_sysidt(struct lm_sysid *); 93 94 extern void lm_free_config(struct knetconfig *); 95 96 extern void lm_cprsuspend(void); 97 extern void lm_cprresume(void); 98 99 /* 100 * Client-side interfaces. 101 */ 102 103 extern int lm_frlock(struct vnode *vp, int cmd, 104 struct flock64 *flk, int flag, 105 u_offset_t offset, struct cred *cr, 106 netobj *fh, struct flk_callback *); 107 extern int lm_has_sleep(const struct vnode *); 108 extern void lm_register_lock_locally(vnode_t *, 109 struct lm_sysid *, struct flock64 *, int, 110 u_offset_t); 111 extern int lm_safelock(vnode_t *, const struct flock64 *, 112 cred_t *); 113 extern int lm_safemap(const vnode_t *); 114 extern int lm_shrlock(struct vnode *vp, int cmd, 115 struct shrlock *shr, int flag, netobj *fh); 116 extern int lm4_frlock(struct vnode *vp, int cmd, 117 struct flock64 *flk, int flag, 118 u_offset_t offset, struct cred *cr, 119 netobj *fh, struct flk_callback *); 120 extern int lm4_shrlock(struct vnode *vp, int cmd, 121 struct shrlock *shr, int flag, netobj *fh); 122 123 /* 124 * Server-side interfaces. 125 */ 126 127 extern void lm_unexport(struct exportinfo *); 128 129 /* 130 * Clustering: functions to encode the nlmid of the node where this NLM 131 * server is running in the l_sysid of the flock struct or the s_sysid 132 * field of the shrlock struct (respectively). 133 */ 134 extern void lm_set_nlmid_flk(int *); 135 extern void lm_set_nlmid_shr(int32_t *); 136 /* Hook for deleting all mandatory NFSv4 file locks held by a remote client */ 137 extern void (*lm_remove_file_locks)(int); 138 139 /* 140 * The following global variable is the node id of the node where this 141 * NLM server is running. 142 */ 143 extern int lm_global_nlmid; 144 145 /* 146 * End of clustering hooks. 147 */ 148 149 /* 150 * Return non-zero if the given local vnode is in use. 151 */ 152 extern int lm_vp_active(const struct vnode *); 153 154 extern sysid_t lm_alloc_sysidt(void); 155 extern void lm_free_sysidt(sysid_t); 156 157 #else /* _KERNEL */ 158 159 #ifdef __STDC__ 160 extern int lm_shutdown(void); 161 #else 162 extern int lm_shutdown(); 163 #endif /* __STDC__ */ 164 165 #endif /* _KERNEL */ 166 167 #ifdef __cplusplus 168 } 169 #endif 170 171 #endif /* _NFS_LM_H */ 172