8442 uts: startup_bios_disk() should check for BIOS
[unleashed.git] / include / sys / flock.h
blob1347f2ffe2cafded99174d1989ffc94c67b7ab6c
1 /*
2 * CDDL HEADER START
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.
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.
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]
20 * CDDL HEADER END
22 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
23 /* All Rights Reserved */
27 * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
28 * Use is subject to license terms.
31 * Copyright 2013 Nexenta Systems, Inc. All rights reserved.
32 * Copyright 2015 Joyent, Inc.
35 #ifndef _SYS_FLOCK_H
36 #define _SYS_FLOCK_H
38 #include <sys/types.h>
39 #include <sys/fcntl.h>
40 #include <sys/vnode.h>
41 #include <sys/t_lock.h> /* for <sys/callb.h> */
42 #include <sys/callb.h>
43 #include <sys/param.h>
44 #include <sys/zone.h>
45 #if defined(_KERNEL)
46 #include <sys/file.h>
47 #endif
49 #ifdef __cplusplus
50 extern "C" {
51 #endif
54 * Private declarations and instrumentation for local locking.
58 * The command passed to reclock() is made by ORing together one or more of
59 * the following values.
62 #define INOFLCK 0x01 /* Vnode is locked when reclock() is called. */
63 #define SETFLCK 0x02 /* Set a file lock. */
64 #define SLPFLCK 0x04 /* Wait if blocked. */
65 #define RCMDLCK 0x08 /* F_REMOTELOCK specified */
66 #define NBMLCK 0x20 /* non-blocking mandatory locking */
69 * Special pid value that can be passed to cleanlocks(). It means that
70 * cleanlocks() should flush all locks for the given sysid, not just the
71 * locks owned by a specific process.
74 #define IGN_PID (-1)
76 /* file locking structure (connected to vnode) */
78 #define l_end l_len
81 * The lock manager is allowed to use unsigned offsets and lengths, though
82 * regular Unix processes are still required to use signed offsets and
83 * lengths.
85 typedef ulong_t u_off_t;
87 #define MAX_U_OFF_T ((u_off_t)~0)
88 #define MAX_U_OFFSET_T ((uoff_t)~0)
91 * define MAXEND as the largest positive value the signed offset_t will hold.
93 #define MAXEND MAXOFFSET_T
96 * Definitions for accessing the l_pad area of struct flock. The
97 * descriminant of the pad_info_t union is the fcntl command used in
98 * conjunction with the flock struct.
101 typedef union {
102 int pi_pad[4]; /* (original pad area) */
103 int pi_has_rmt; /* F_HASREMOTELOCKS */
104 } pad_info_t;
106 #define l_has_rmt(flockp) (((pad_info_t *)((flockp)->l_pad))->pi_has_rmt)
109 * Optional callbacks for blocking lock requests. Each function is called
110 * twice.
111 * The first call is after the request is put in the "sleeping" list, but
112 * before waiting. At most one callback may return a callb_cpr_t object;
113 * the others must return NULL. If a callb_cpr_t is returned, the thread
114 * will be marked as safe to suspend while waiting for the lock.
115 * The second call is after the request wakes up. Note that the request
116 * might not have been granted at the second call (e.g., the request was
117 * signalled).
118 * New callbacks should be added to the head of the list. For the first
119 * call the list is walked in order. For the second call the list is
120 * walked backwards (in case the callbacks need to reacquire locks).
123 typedef enum {FLK_BEFORE_SLEEP, FLK_AFTER_SLEEP} flk_cb_when_t;
125 struct flk_callback {
126 struct flk_callback *cb_next; /* circular linked list */
127 struct flk_callback *cb_prev;
128 callb_cpr_t *(*cb_callback)(flk_cb_when_t, void *); /* fcn ptr */
129 void *cb_data; /* ptr to callback data */
132 typedef struct flk_callback flk_callback_t;
135 * This structure members are not used any more inside the kernel.
136 * The structure is used for casting some pointer assignments only.
139 typedef struct filock {
140 kcondvar_t cv;
141 struct flock set; /* contains type, start, and end */
142 struct {
143 int granted_flag; /* granted flag */
144 struct filock *blk; /* for sleeping locks only */
145 struct attacher *blocking_list;
146 struct attacher *my_attacher;
147 } stat;
148 struct filock *prev;
149 struct filock *next;
150 } filock_t;
152 #define FLP_DELAYED_FREE -1 /* special value for granted_flag */
154 /* structure that contains list of locks to be granted */
156 #define MAX_GRANT_LOCKS 52
158 typedef struct grant_lock {
159 struct filock *grant_lock_list[MAX_GRANT_LOCKS];
160 struct grant_lock *next;
161 } grant_lock_t;
164 * Provide a way to cleanly enable and disable Network Lock Manager locking
165 * requests (i.e., requests from remote clients):
166 * FLK_NLM_SHUTTING_DOWN: Forces all blocked NLM requests to bail out
167 * and return ENOLCK.
168 * FLK_NLM_DOWN: Clears all granted NLM server locks. Both status
169 * codes cause new NLM lock requests to fail immediately with ENOLCK.
170 * FLK_NLM_UP: Changes the state of all locks to UP, after a server has
171 * shutdown and is restarting on the same node.
175 * Enumerated type of the four possible states an NLM server can be in.
177 typedef enum {
178 FLK_NLM_UP,
179 FLK_NLM_SHUTTING_DOWN,
180 FLK_NLM_DOWN,
181 FLK_NLM_UNKNOWN
182 } flk_nlm_status_t;
185 * Provide a way to cleanly enable and disable lock manager locking
186 * requests (i.e., requests from remote clients). FLK_WAKEUP_SLEEPERS
187 * forces all blocked lock manager requests to bail out and return ENOLCK.
188 * FLK_LOCKMGR_DOWN clears all granted lock manager locks. Both status
189 * codes cause new lock manager requests to fail immediately with ENOLCK.
192 typedef enum {
193 FLK_LOCKMGR_UP,
194 FLK_WAKEUP_SLEEPERS,
195 FLK_LOCKMGR_DOWN
196 } flk_lockmgr_status_t;
198 #if defined(_KERNEL)
201 * The following structure is used to hold a list of locks returned
202 * by the F_ACTIVELIST or F_SLEEPINGLIST commands to fs_frlock.
204 * N.B. The lists returned by these commands are dynamically
205 * allocated and must be freed by the caller. The vnodes returned
206 * in the lists are held and must be released when the caller is done.
209 typedef struct locklist {
210 struct vnode *ll_vp;
211 struct flock64 ll_flock;
212 struct locklist *ll_next;
213 } locklist_t;
215 #define FLK_QUERY_ACTIVE 0x1
216 #define FLK_QUERY_SLEEPING 0x2
218 #if defined(_KERNEL)
219 int ofdlock(file_t *, int, struct flock64 *, int, uoff_t);
220 void ofdcleanlock(file_t *);
221 #endif
222 int reclock(struct vnode *, struct flock64 *, int, int, uoff_t,
223 flk_callback_t *);
224 int chklock(struct vnode *, int, uoff_t, ssize_t, int,
225 caller_context_t *);
226 int convoff(struct vnode *, struct flock64 *, int, offset_t);
227 void cleanlocks(struct vnode *, pid_t, int);
228 locklist_t *flk_get_sleeping_locks(int sysid, pid_t pid);
229 locklist_t *flk_get_active_locks(int sysid, pid_t pid);
230 locklist_t *flk_active_locks_for_vp(const struct vnode *vp);
231 locklist_t *flk_active_nbmand_locks_for_vp(const struct vnode *vp);
232 locklist_t *flk_active_nbmand_locks(pid_t pid);
233 void flk_free_locklist(locklist_t *);
234 int flk_convert_lock_data(struct vnode *, struct flock64 *,
235 uoff_t *, uoff_t *, offset_t);
236 int flk_check_lock_data(uoff_t, uoff_t, offset_t);
237 int flk_has_remote_locks(struct vnode *vp);
238 void flk_set_lockmgr_status(flk_lockmgr_status_t status);
239 int flk_sysid_has_locks(int sysid, int chklck);
240 int flk_has_remote_locks_for_sysid(vnode_t *vp, int);
241 void flk_init_callback(flk_callback_t *,
242 callb_cpr_t *(*)(flk_cb_when_t, void *), void *);
243 void flk_add_callback(flk_callback_t *,
244 callb_cpr_t *(*)(flk_cb_when_t, void *), void *,
245 flk_callback_t *);
246 void flk_del_callback(flk_callback_t *);
247 callb_cpr_t *flk_invoke_callbacks(flk_callback_t *, flk_cb_when_t);
249 /* Zones hooks */
250 extern zone_key_t flock_zone_key;
252 void *flk_zone_init(zoneid_t);
253 void flk_zone_fini(zoneid_t, void *);
255 #endif /* _KERNEL */
257 #ifdef __cplusplus
259 #endif
261 #endif /* _SYS_FLOCK_H */