Coda Distributed File System
rvm.h
Go to the documentation of this file.
1/* BLURB lgpl
2
3 Coda File System
4 Release 8
5
6 Copyright (c) 1987-2025 Carnegie Mellon University
7 Additional copyrights listed below
8
9This code is distributed "AS IS" without warranty of any kind under
10the terms of the GNU Library General Public Licence Version 2, as
11shown in the file LICENSE. The technical and financial contributors to
12Coda are listed in the file CREDITS.
13
14 Additional copyrights
15 none currently
16
17#*/
18
19/*
20* Definitions for RVM
21*
22*
23*/
24
25/*LINTLIBRARY*/
26
27/* permit multiple includes */
28#ifndef RVM_VERSION
29
30/* Version string for initialization */
31#define RVM_VERSION "RVM Interface Version 1.3 7 Mar 1994"
32#define RVM_VERSION_MAX 128 /* 128 char maximum version str length */
33
34/* be sure parallel libraries are used */
35#ifndef _PARALLEL_LIBRARIES
36#define _PARALLEL_LIBRARIES 1
37#endif
38
39/* get timestamp structures and system constants */
40#include <sys/time.h>
41#include <sys/param.h>
42
43/* define bool, TRUE, and FALSE */
44
45#ifndef TRUE
46#define TRUE 1
47#endif
48
49#ifndef FALSE
50#define FALSE 0
51#endif
52
53/* RVM's use of false, true and bool causes trouble with versions of gcc
54 above 2.6 or so; because of this, the names of RVM's definitions
55 have been changed to rvm_{false,true,bool_t}. (Originally changed
56 in rvm.h by Satya (7/31/96); propogated to the rest of the RVM code
57 8/23/96 by tilt */
58
59typedef enum
60{
62 rvm_true = 1
64
65/* structure identifiers: rvm_struct_id_t
66 codes placed in the first field of each
67 structure instance to identify the object.
68*/
69typedef enum
70{
71 rvm_first_struct_id = 39, /* internal use only */
72
73 rvm_region_id, /* identifier for rvm_region's */
74 rvm_options_id, /* identifier for rvm_options */
75 rvm_tid_id, /* identifier for rvm_tid's */
76 rvm_statistics_id, /* identifier for rvm_statistics rec's */
77 rvm_last_struct_id /* internal use only */
79
80/* Transaction mode codes: rvm_mode_t */
81typedef enum
82{
83 rvm_first_mode = 139, /* internal use only */
84
85 restore, /* restore memory on abort */
86 no_restore, /* do not restore memory on abort */
87 flush, /* flush records to logdev on commit */
88 no_flush, /* do not flush records on commit */
89
90 rvm_last_mode /* internal use only */
92
93/* Function return codes: rvm_return_t */
94typedef int rvm_return_t;
95#define RVM_SUCCESS 0 /* success return code */
96#define rvm_first_code 199 /* internal use only */
97#define RVM_EINIT 200 /* RVM not initialized */
98#define RVM_EINTERNAL 201 /* internal error, see rvm_errmsg */
99#define RVM_EIO 202 /* I/O error, see errno */
100#define RVM_ELOG 204 /* invalid log device */
101#define RVM_ELOG_VERSION_SKEW 205 /* RVM log format version skew */
102#define RVM_EMODE 206 /* invalid transaction begin/end mode */
103#define RVM_ENAME_TOO_LONG 207 /* device name longer than 1023 chars */
104#define RVM_ENO_MEMORY 208 /* heap exhausted */
105#define RVM_ENOT_MAPPED 209 /* designated region not mapped */
106#define RVM_EOFFSET 210 /* invalid segment offset */
107#define RVM_EOPTIONS 211 /* invalid options record or pointer */
108#define RVM_EOVERLAP 212 /* region overlaps existing seg mapping */
109#define RVM_EPAGER 213 /* invalid external pager */
110#define RVM_ERANGE 214 /* invalid virtual memory address */
111#define RVM_EREGION 215 /* invalid region descriptor or pointer */
112#define RVM_EREGION_DEF 216 /* invalid region definition descriptor */
113#define RVM_ESRC 217 /* invalid address range for new values */
114#define RVM_ESTATISTICS 218 /* invalid statistics record */
115#define RVM_ESTAT_VERSION_SKEW 219 /* RVM statistics format version skew */
116#define RVM_ETERMINATED 220 /* terminated by error already reported */
117#define RVM_ETHREADS 221 /* illegal C Thread library */
118#define RVM_ETID 222 /* invalid transaction identifier or ptr */
119#define RVM_ETOO_BIG 223 /* internal resouces exceeded */
120#define RVM_EUNCOMMIT 224 /* uncommitted transaction(s) pending */
121#define RVM_EVERSION_SKEW 225 /* RVM library version skew */
122#define RVM_EVM_OVERLAP 226 /* region overlaps existing vm mapping */
123#define rvm_last_code 227 /* internal use only */
124
125/* Enumeration type print name functions */
126char *rvm_return(rvm_return_t code);
127char *rvm_mode(rvm_mode_t mode);
128char *rvm_type(rvm_struct_id_t id);
129
130/* RVM basic length and offset types:
131 these types are used throughout RVM to hide machine-dependent
132 representations of maximum virtual memory region lengths and
133 64 bit offsets. Do not use internal types or fields or
134 portability can be compromised
135*/
136/* region length: rvm_length_t
137 size must be >= sizeof(char *),
138 type must be unsigned arithmetic */
139
140typedef unsigned long rvm_length_t;
141
142/* region offset descriptor: rvm_offset_t supports 64 bit unsigned integers
143 struct unnecessary if machine has 64-bit ops */
144
145typedef struct { /* INTERNAL FIELDS static */
146 rvm_length_t high; /* private */
147 rvm_length_t low; /* private */
149
150/* construct offset from two rvm_length_t sized quantities x,y
151 -- this will construct an offset from two lengths even if
152 8*sizeof(rvm_length_t) is > sizeof(rvm_offset_t); the "extra"
153 bits, the highest order bits of parameter y, will be discarded */
154#define RVM_MK_OFFSET(x, y) rvm_mk_offset((rvm_length_t)(x), (rvm_length_t)(y))
155
156/* offset initializer -- same as RVM_MK_OFFSET, but compile time */
157#define RVM_OFFSET_INITIALIZER(x, y) { (x), (y) }
158
159/* Zero an offset: create a zero offset and assign it to the parameter. */
160#define RVM_ZERO_OFFSET(x) (x) = RVM_MK_OFFSET(0, 0)
161
162/* offset and length conversion macros */
163
164/* return low-order bits of offset x as length
165 -- "low-order bits" are the lowest numerically valued bits
166 of the same size as rvm_length_t */
167#define RVM_OFFSET_TO_LENGTH(x) ((x).low)
168
169/* return high order bits of offset x as length
170 -- "high-order bits" are defined as the highest ordered
171 bits remaining after the low-order bits are extracted
172 they are returned as rvm_length_t */
173#define RVM_OFFSET_HIGH_BITS_TO_LENGTH(x) ((x).high)
174
175/* return length x as rvm_offset_t */
176#define RVM_LENGTH_TO_OFFSET(x) RVM_MK_OFFSET(0, (x))
177
178/* rvm_offset_t and rvm_length_t arithmetic support */
179
180/* add rvm_offset to rvm_offset; returns result (x+y)
181 implemented as function call -- or simple add if
182 machine has 64-bit integer operations */
183#define RVM_ADD_OFFSETS(x, y) rvm_add_offsets(&(x), &(y))
184
185/* add rvm_length to rvm_offset; return result (length+offset)
186 as rvm_offset_t
187 implemented as function call -- or simple add if
188 machine has 64-bit integer operations */
189#define RVM_ADD_LENGTH_TO_OFFSET(x, y) rvm_add_length_to_offset(&(x), (y))
190
191/* add rvm_length_t to vm address; returns address (char *)
192 always implemented as simple add */
193#define RVM_ADD_LENGTH_TO_ADDR(length, vmaddr) \
194 ((char *)((rvm_length_t)(length) + (rvm_length_t)(vmaddr)))
195
196/* subtract rvm_offset from rvm_offset; return result (x-y) as rvm_offset_t
197 implemented as function call -- or simple subtract if
198 machine has 64-bit integer operations */
199#define RVM_SUB_OFFSETS(x, y) rvm_sub_offsets(&(x), &(y))
200
201/* subtract rvm_length from rvm_offset; return result (offset-length)
202 as rvm_offset_t
203 implemented as function call or simple subtract if
204 machine has 64-bit integer operations */
205#define RVM_SUB_LENGTH_FROM_OFFSET(x, y) rvm_sub_length_from_offset(&(x), (y))
206
207/* subtract rvm_length_t from vm address; returns address (char *)
208 always implemented as simple subtract */
209#define RVM_SUB_LENGTH_FROM_ADDR(vmaddr, length) \
210 ((char *)((rvm_length_t)(vmaddr) - (rvm_length_t)(length)))
211
212/* rvm_offset_t comparison macros */
213#define RVM_OFFSET_LSS(x, y) \
214 (((x).high < (y).high) || ((((x).high == (y).high) && ((x).low < (y).low))))
215#define RVM_OFFSET_GTR(x, y) \
216 (((x).high > (y).high) || ((((x).high == (y).high) && ((x).low > (y).low))))
217#define RVM_OFFSET_LEQ(x, y) (!RVM_OFFSET_GTR((x), (y)))
218#define RVM_OFFSET_GEQ(x, y) (!RVM_OFFSET_LSS((x), (y)))
219#define RVM_OFFSET_EQL(x, y) (((x).high == (y).high) && ((x).low == (y).low))
220#define RVM_OFFSET_EQL_ZERO(x) (((x).high == 0) && ((x).low == 0))
221
222/* page-size rounding macros */
223
224/* return page size as rvm_length_t */
225#define RVM_PAGE_SIZE rvm_page_size()
226
227/* return rvm_length x rounded up to next integral page-size length */
228#define RVM_ROUND_LENGTH_UP_TO_PAGE_SIZE(x) \
229 ((rvm_length_t)(((rvm_length_t)(x) + rvm_page_size() - 1) & \
230 rvm_page_mask()))
231
232/* return rvm_length x rounded down to integral page-size length */
233#define RVM_ROUND_LENGTH_DOWN_TO_PAGE_SIZE(x) \
234 ((rvm_length_t)((rvm_length_t)(x) & rvm_page_mask()))
235
236/* return address x rounded up to next page boundary */
237#define RVM_ROUND_ADDR_UP_TO_PAGE_SIZE(x) \
238 ((char *)(((rvm_length_t)(x) + rvm_page_size() - 1) & rvm_page_mask()))
239
240/* return address x rounded down to page boundary */
241#define RVM_ROUND_ADDR_DOWN_TO_PAGE_SIZE(x) \
242 ((char *)((rvm_length_t)(x) & rvm_page_mask()))
243
244/* return rvm_offset x rounded up to next integral page-size offset */
245#define RVM_ROUND_OFFSET_UP_TO_PAGE_SIZE(x) rvm_rnd_offset_up_to_page(&(x))
246
247/* return rvm_offset x rounded down to integral page-size offset */
248#define RVM_ROUND_OFFSET_DOWN_TO_PAGE_SIZE(x) rvm_rnd_offset_dn_to_page(&(x))
249
250/* transaction identifier descriptor */
251typedef struct {
252 rvm_struct_id_t struct_id; /* self-identifier, do not change */
253 rvm_bool_t from_heap; /* true if heap allocated, do not change */
254 struct timeval uname; /* unique name (timestamp) */
255
256 void *tid; /* internal use only */
257 rvm_length_t reserved; /* internal use only */
258} rvm_tid_t;
259
260/* rvm_tid_t initializer, copier & finalizer */
261
263
264void rvm_init_tid(rvm_tid_t *tid); /* pointer to record to initialize */
265rvm_tid_t *rvm_copy_tid(rvm_tid_t *tid); /* pointer to record to be copied */
266void rvm_free_tid(rvm_tid_t *tid); /* pointer to record to be copied */
267
268/* options descriptor: rvm_options_t */
269typedef struct {
270 rvm_struct_id_t struct_id; /* self-identifier, do not change */
271 rvm_bool_t from_heap; /* true if heap allocated, do not change */
272
273 char *log_dev; /* device name */
274 long truncate; /* truncation threshold, % of log */
275 rvm_length_t recovery_buf_len; /* length of recovery buffer */
276 rvm_length_t flush_buf_len; /* length of flush buffer (partitions only) */
277 rvm_length_t max_read_len; /* maximum single read length */
278 rvm_bool_t log_empty; /* TRUE ==> log empty */
279 char *pager; /* char array for external pager name */
280 long n_uncommit; /* length of uncommitted tid array */
281 rvm_tid_t *tid_array; /* ptr to array of uncommitted tid's */
282
283 rvm_length_t flags; /* bit vector for optimization and other flags */
284 rvm_bool_t create_log_file; /* TRUE ==> create the log file */
286 create_log_size; /* when creating a new log file, this is the wanted size */
287 long create_log_mode; /* when creating a new log file, this is the wanted mode */
289
290/* rvm_options default values and other constants */
291
292#define TRUNCATE 50 /* 50% default truncation threshold */
293#define RECOVERY_BUF_LEN (256 * 1024) /* default recovery buffer length */
294#define MIN_RECOVERY_BUF_LEN (64 * 1024) /* minimum recovery buffer length */
295#define FLUSH_BUF_LEN (256 * 1024) /* default flush buffer length */
296#define MIN_FLUSH_BUF_LEN (64 * 1024) /* minimum flush buffer length */
297#define MAX_READ_LEN (512 * 1024) /* default maximum single read length */
298
299#define RVM_COALESCE_RANGES \
300 1 /* coalesce adjacent or shadowed ranges within a transaction */
301#define RVM_COALESCE_TRANS \
302 2 /* coalesce adjacent or shadowed ranges within no_flush transactions */
303
304#define RVM_ALL_OPTIMIZATIONS (RVM_COALESCE_RANGES | RVM_COALESCE_TRANS)
305
306/* Other flags */
307
308#define RVM_MAP_PRIVATE 8 /* Use private mapping, if available */
309
310/* rvm_options_t initializer, copier & finalizer */
311
313
317
318/* region descriptor: rvm_region_t */
319typedef struct {
320 rvm_struct_id_t struct_id; /* self-identifier, do not change */
321 rvm_bool_t from_heap; /* true if heap allocated, do not change */
322
323 char *data_dev; /* device name */
324 rvm_offset_t dev_length; /* maximum device length */
325 rvm_offset_t offset; /* offset of region in segment */
326 char *vmaddr; /* vm address of region/range */
327 rvm_length_t length; /* length of region/range */
328 rvm_bool_t no_copy; /* do not copy mapped data if true */
330
331/* rvm_region_t allocator, initializer, copier & finalizer */
334/* note: copier copies pointers to the char arrays */
337
338/*
339 Main Function Declarations
340*/
341
342/* RVM initialization: pass version and optional options
343 descriptor */
344rvm_return_t rvm_initialize(const char *version, rvm_options_t *opts);
345/* init macro */
346#define RVM_INIT(options) rvm_initialize(RVM_VERSION, (options))
347
348/* shutdown RVM */
349rvm_return_t rvm_terminate(void); /* no parameters */
350
351/* map recoverable storage */
353rvm_map(rvm_region_t *region, /* pointer to region descriptor */
354 rvm_options_t *options /* optional ptr to option descriptor */
355);
356
357/* unmap recoverable storage */
359
360/* set RVM options */
362
363/* query RVM options */
365 rvm_options_t *options, /* address of pointer to option descriptor [out] */
366 rvm_region_t *region /* optional pointer to region descriptor */
367);
368
369/* begin a transaction */
371rvm_begin_transaction(rvm_tid_t *tid, /* pointer to transaction identifier */
372 rvm_mode_t mode /* transaction begin mode */
373);
374
375/* declare a modification region for a transaction */
377rvm_set_range(rvm_tid_t *tid, /* pointer to transaction identifier */
378 void *dest, /* base address of modification range */
379 rvm_length_t length /* length of modification range */
380);
381
382/* modification of a region for a transaction */
384rvm_modify_bytes(rvm_tid_t *tid, /* pointer to transaction identifier */
385 void *dest, /* base address of modification range */
386 const void *src, /* base address of source range */
387 rvm_length_t length /* length of modification range */
388);
389
390/* abort a transaction */
392rvm_abort_transaction(rvm_tid_t *tid /* pointer to transaction identifier */
393);
394
395/* commit a transaction */
397rvm_end_transaction(rvm_tid_t *tid, /* pointer to transaction identifier */
398 rvm_mode_t mode /* transaction commit mode */
399);
400
401/* flush log cache buffer to log device */
402rvm_return_t rvm_flush(void); /* no parameters */
403
404/* apply logged changes to segments and garbage collect the log device */
405rvm_return_t rvm_truncate(void); /* no parameters */
406
407/* initialize log */
409rvm_create_log(rvm_options_t *rvm_options, /* ptr to options record */
410 rvm_offset_t *log_len, /* length of log data area */
411 long mode /* file creation protection mode */
412);
413
414/* underlying support functions for length, offset, and rounding macros
415
416 *** use outside of the macros can compromise portability ***
417
418 these functions will not be implemented on machines with 64-bit
419 integer formats since their operations will be available in the
420 native instruction set
421*/
425 rvm_length_t length);
428 rvm_length_t length);
429
430/* private functions to support page rounding */
431
436
437#endif /* RVM_VERSION */
y
Definition: pwdtopdbtool.py:40
x
Definition: pwdtopdbtool.py:40
rvm_options_t * rvm_malloc_options(void)
Definition: rvm_utils.c:947
void rvm_init_tid(rvm_tid_t *tid)
Definition: rvm_utils.c:1032
rvm_offset_t rvm_mk_offset(rvm_length_t x, rvm_length_t y)
Definition: rvm_utils.c:2119
void rvm_free_options(rvm_options_t *options)
Definition: rvm_utils.c:961
int rvm_return_t
Definition: rvm.h:94
rvm_return_t rvm_terminate(void)
Definition: rvm_init.c:114
rvm_offset_t rvm_add_offsets(rvm_offset_t *x, rvm_offset_t *y)
Definition: rvm_utils.c:2159
rvm_return_t rvm_map(rvm_region_t *region, rvm_options_t *options)
Definition: rvm_map.c:922
void rvm_init_options(rvm_options_t *options)
Definition: rvm_utils.c:977
rvm_options_t * rvm_copy_options(rvm_options_t *options)
Definition: rvm_utils.c:992
char * rvm_return(rvm_return_t code)
Definition: rvm_utils.c:1084
rvm_bool_t
Definition: rvm.h:60
@ rvm_true
Definition: rvm.h:62
@ rvm_false
Definition: rvm.h:61
rvm_return_t rvm_flush(void)
Definition: rvm_logflush.c:647
rvm_return_t rvm_modify_bytes(rvm_tid_t *tid, void *dest, const void *src, rvm_length_t length)
Definition: rvm_trans.c:464
void rvm_init_region(rvm_region_t *region)
Definition: rvm_utils.c:873
rvm_return_t rvm_set_options(rvm_options_t *options)
Definition: rvm_status.c:62
rvm_return_t rvm_abort_transaction(rvm_tid_t *tid)
Definition: rvm_trans.c:888
rvm_region_t * rvm_copy_region(rvm_region_t *region)
Definition: rvm_utils.c:879
rvm_return_t rvm_create_log(rvm_options_t *rvm_options, rvm_offset_t *log_len, long mode)
Definition: rvm_logstatus.c:990
rvm_mode_t
Definition: rvm.h:82
@ rvm_last_mode
Definition: rvm.h:90
@ no_flush
Definition: rvm.h:88
@ restore
Definition: rvm.h:85
@ flush
Definition: rvm.h:87
@ no_restore
Definition: rvm.h:86
@ rvm_first_mode
Definition: rvm.h:83
char * rvm_type(rvm_struct_id_t id)
Definition: rvm_utils.c:1105
rvm_return_t rvm_end_transaction(rvm_tid_t *tid, rvm_mode_t mode)
Definition: rvm_trans.c:919
rvm_offset_t rvm_rnd_offset_up_to_page(rvm_offset_t *x)
Definition: rvm_utils.c:2185
rvm_length_t rvm_page_mask()
Definition: rvm_utils.c:2211
rvm_offset_t rvm_add_length_to_offset(rvm_offset_t *offset, rvm_length_t length)
Definition: rvm_utils.c:2130
rvm_return_t rvm_query(rvm_options_t *options, rvm_region_t *region)
Definition: rvm_status.c:135
rvm_return_t rvm_initialize(const char *version, rvm_options_t *opts)
Definition: rvm_init.c:50
rvm_length_t rvm_page_size()
Definition: rvm_utils.c:2206
rvm_tid_t * rvm_copy_tid(rvm_tid_t *tid)
Definition: rvm_utils.c:1040
rvm_region_t * rvm_malloc_region(void)
Definition: rvm_utils.c:852
rvm_tid_t * rvm_malloc_tid(void)
Definition: rvm_utils.c:1012
rvm_return_t rvm_truncate(void)
Definition: rvm_logrecovr.c:2641
unsigned long rvm_length_t
Definition: rvm.h:140
void rvm_free_region(rvm_region_t *region)
Definition: rvm_utils.c:866
char * rvm_mode(rvm_mode_t mode)
Definition: rvm_utils.c:1096
rvm_return_t rvm_set_range(rvm_tid_t *tid, void *dest, rvm_length_t length)
Definition: rvm_trans.c:426
rvm_struct_id_t
Definition: rvm.h:70
@ rvm_statistics_id
Definition: rvm.h:76
@ rvm_region_id
Definition: rvm.h:73
@ rvm_tid_id
Definition: rvm.h:75
@ rvm_options_id
Definition: rvm.h:74
@ rvm_first_struct_id
Definition: rvm.h:71
@ rvm_last_struct_id
Definition: rvm.h:77
rvm_offset_t rvm_sub_offsets(rvm_offset_t *x, rvm_offset_t *y)
Definition: rvm_utils.c:2172
rvm_return_t rvm_unmap(rvm_region_t *region)
Definition: rvm_unmap.c:33
rvm_offset_t rvm_sub_length_from_offset(rvm_offset_t *offset, rvm_length_t length)
Definition: rvm_utils.c:2145
void rvm_free_tid(rvm_tid_t *tid)
Definition: rvm_utils.c:1026
rvm_return_t rvm_begin_transaction(rvm_tid_t *tid, rvm_mode_t mode)
Definition: rvm_trans.c:853
rvm_offset_t rvm_rnd_offset_dn_to_page(rvm_offset_t *x)
Definition: rvm_utils.c:2195
Definition: rvm.h:145
rvm_length_t high
Definition: rvm.h:146
rvm_length_t low
Definition: rvm.h:147
Definition: rvm.h:269
rvm_bool_t from_heap
Definition: rvm.h:271
rvm_length_t recovery_buf_len
Definition: rvm.h:275
long truncate
Definition: rvm.h:274
rvm_bool_t log_empty
Definition: rvm.h:278
char * log_dev
Definition: rvm.h:273
rvm_struct_id_t struct_id
Definition: rvm.h:270
long create_log_mode
Definition: rvm.h:287
char * pager
Definition: rvm.h:279
rvm_length_t flags
Definition: rvm.h:283
rvm_tid_t * tid_array
Definition: rvm.h:281
rvm_offset_t create_log_size
Definition: rvm.h:286
rvm_bool_t create_log_file
Definition: rvm.h:284
long n_uncommit
Definition: rvm.h:280
rvm_length_t flush_buf_len
Definition: rvm.h:276
rvm_length_t max_read_len
Definition: rvm.h:277
Definition: rvm.h:319
rvm_offset_t dev_length
Definition: rvm.h:324
rvm_length_t length
Definition: rvm.h:327
rvm_offset_t offset
Definition: rvm.h:325
char * vmaddr
Definition: rvm.h:326
char * data_dev
Definition: rvm.h:323
rvm_bool_t no_copy
Definition: rvm.h:328
rvm_bool_t from_heap
Definition: rvm.h:321
rvm_struct_id_t struct_id
Definition: rvm.h:320
Definition: rvm.h:251
rvm_struct_id_t struct_id
Definition: rvm.h:252
rvm_bool_t from_heap
Definition: rvm.h:253
rvm_length_t reserved
Definition: rvm.h:257
void * tid
Definition: rvm.h:256
rvm_region_t * region
Definition: testrvm.c:34
rvm_options_t * options
Definition: testrvm.c:33