lm.h revision b819cea2f73f98c5662230cc9affc8cc84f77fcf
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2005 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/*
* Copyright 2013 Nexenta Systems, Inc. All rights reserved.
*/
#ifndef _NFS_LM_H
#define _NFS_LM_H
/*
* Interface definitions for the NFSv2/v3 lock manager.
*/
#ifdef __cplusplus
extern "C" {
#endif
#include <sys/cred.h>
#include <sys/fcntl.h>
#include <sys/types.h>
#include <sys/vnode.h>
#include <rpc/xdr.h>
#if defined(_KERNEL) || defined(_FAKE_KERNEL)
/*
* Common interfaces.
*/
struct exportinfo;
/*
* The numeric sysid is used to identify a host and transport.
*
* The local locking code uses (pid, sysid) to uniquely identify a process.
* This means that the client-side code must doctor up the sysid before
* registering a lock, so that the local locking code doesn't confuse a
* remote process with a local process just because they have the same pid.
* We currently do this by ORing LM_SYSID_CLIENT into the sysid before
* registering a lock.
*
* If you change LM_SYSID and LM_SYSID_MAX, be sure to pick values so that
* LM_SYSID_MAX > LM_SYSID using signed arithmetic, and don't use zero.
* You may also need a different way to tag lock manager locks that are
* registered locally.
*/
#define LM_SYSID ((sysid_t)0x0001)
#define LM_SYSID_MAX ((sysid_t)0x3FFF)
#define LM_SYSID_CLIENT ((sysid_t)0x4000)
#define LM_NOSYSID ((sysid_t)-1)
/*
* Struct used to represent a host.
*/
struct lm_sysid;
struct knetconfig;
struct netbuf;
/*
* Given a knetconfig and network address, returns a reference to the
* associated lm_sysid. The 3rd argument is the hostname to assign to the
* lm_sysid. The 4th argument is an output parameter. It is set non-zero
* if the returned lm_sysid has a different protocol
* (knetconfig::knc_proto) than what was requested.
*/
extern struct lm_sysid *lm_get_sysid(struct knetconfig *, struct netbuf *,
char *, bool_t *);
extern void lm_rel_sysid(struct lm_sysid *);
/*
* Return the integer sysid for the given lm_sysid.
*/
extern sysid_t lm_sysidt(struct lm_sysid *);
extern void lm_free_config(struct knetconfig *);
extern void lm_cprsuspend(void);
extern void lm_cprresume(void);
/*
* Client-side interfaces.
*/
extern int lm_frlock(struct vnode *vp, int cmd,
struct flock64 *flk, int flag,
u_offset_t offset, struct cred *cr,
netobj *fh, struct flk_callback *);
extern int lm_has_sleep(const struct vnode *);
extern void lm_register_lock_locally(vnode_t *,
struct lm_sysid *, struct flock64 *, int,
u_offset_t);
extern int lm_safelock(vnode_t *, const struct flock64 *,
cred_t *);
extern int lm_safemap(const vnode_t *);
extern int lm_shrlock(struct vnode *vp, int cmd,
struct shrlock *shr, int flag, netobj *fh);
extern int lm4_frlock(struct vnode *vp, int cmd,
struct flock64 *flk, int flag,
u_offset_t offset, struct cred *cr,
netobj *fh, struct flk_callback *);
extern int lm4_shrlock(struct vnode *vp, int cmd,
struct shrlock *shr, int flag, netobj *fh);
/*
* Server-side interfaces.
*/
extern void lm_unexport(struct exportinfo *);
/*
* Clustering: functions to encode the nlmid of the node where this NLM
* server is running in the l_sysid of the flock struct or the s_sysid
* field of the shrlock struct (respectively).
*/
extern void lm_set_nlmid_flk(int *);
extern void lm_set_nlmid_shr(int32_t *);
/* Hook for deleting all mandatory NFSv4 file locks held by a remote client */
extern void (*lm_remove_file_locks)(int);
/*
* The following global variable is the node id of the node where this
* NLM server is running.
*/
extern int lm_global_nlmid;
/*
* End of clustering hooks.
*/
/*
* Return non-zero if the given local vnode is in use.
*/
extern int lm_vp_active(const struct vnode *);
extern sysid_t lm_alloc_sysidt(void);
extern void lm_free_sysidt(sysid_t);
#endif /* _KERNEL */
#ifdef __STDC__
extern int lm_shutdown(void);
#else
extern int lm_shutdown();
#endif /* __STDC__ */
#ifdef __cplusplus
}
#endif
#endif /* _NFS_LM_H */