1/* $NetBSD: libdevmapper.h,v 1.1.1.2 2009/12/02 00:26:09 haad Exp $ */
2
3/*
4 * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved.
5 * Copyright (C) 2004-2007 Red Hat, Inc. All rights reserved.
6 *
7 * This file is part of the device-mapper userspace tools.
8 *
9 * This copyrighted material is made available to anyone wishing to use,
10 * modify, copy, or redistribute it subject to the terms and conditions
11 * of the GNU Lesser General Public License v.2.1.
12 *
13 * You should have received a copy of the GNU Lesser General Public License
14 * along with this program; if not, write to the Free Software Foundation,
15 * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16 */
17
18#ifndef LIB_DEVICE_MAPPER_H
19#define LIB_DEVICE_MAPPER_H
20
21#include <inttypes.h>
22#include <stdarg.h>
23#include <sys/types.h>
24
25#ifdef linux
26# include <linux/types.h>
27#endif
28
29#include <limits.h>
30#include <string.h>
31#include <stdlib.h>
32#include <stdio.h>
33
34/*****************************************************************
35 * The first section of this file provides direct access to the
36 * individual device-mapper ioctls. Since it is quite laborious to
37 * build the ioctl arguments for the device-mapper, people are
38 * encouraged to use this library.
39 ****************************************************************/
40
41/*
42 * The library user may wish to register their own
43 * logging function. By default errors go to stderr.
44 * Use dm_log_with_errno_init(NULL) to restore the default log fn.
45 */
46
47typedef void (*dm_log_with_errno_fn) (int level, const char *file, int line,
48 int dm_errno, const char *f, ...)
49 __attribute__ ((format(printf, 5, 6)));
50
51void dm_log_with_errno_init(dm_log_with_errno_fn fn);
52void dm_log_init_verbose(int level);
53
54/*
55 * Original version of this function.
56 * dm_errno is set to 0.
57 *
58 * Deprecated: Use the _with_errno_ versions above instead.
59 */
60typedef void (*dm_log_fn) (int level, const char *file, int line,
61 const char *f, ...)
62 __attribute__ ((format(printf, 4, 5)));
63void dm_log_init(dm_log_fn fn);
64/*
65 * For backward-compatibility, indicate that dm_log_init() was used
66 * to set a non-default value of dm_log().
67 */
68int dm_log_is_non_default(void);
69
70enum {
71 DM_DEVICE_CREATE,
72 DM_DEVICE_RELOAD,
73 DM_DEVICE_REMOVE,
74 DM_DEVICE_REMOVE_ALL,
75
76 DM_DEVICE_SUSPEND,
77 DM_DEVICE_RESUME,
78
79 DM_DEVICE_INFO,
80 DM_DEVICE_DEPS,
81 DM_DEVICE_RENAME,
82
83 DM_DEVICE_VERSION,
84
85 DM_DEVICE_STATUS,
86 DM_DEVICE_TABLE,
87 DM_DEVICE_WAITEVENT,
88
89 DM_DEVICE_LIST,
90
91 DM_DEVICE_CLEAR,
92
93 DM_DEVICE_MKNODES,
94
95 DM_DEVICE_LIST_VERSIONS,
96
97 DM_DEVICE_TARGET_MSG,
98
99 DM_DEVICE_SET_GEOMETRY
100};
101
102/*
103 * You will need to build a struct dm_task for
104 * each ioctl command you want to execute.
105 */
106
107struct dm_task;
108
109struct dm_task *dm_task_create(int type);
110void dm_task_destroy(struct dm_task *dmt);
111
112int dm_task_set_name(struct dm_task *dmt, const char *name);
113int dm_task_set_uuid(struct dm_task *dmt, const char *uuid);
114
115/*
116 * Retrieve attributes after an info.
117 */
118struct dm_info {
119 int exists;
120 int suspended;
121 int live_table;
122 int inactive_table;
123 int32_t open_count;
124 uint32_t event_nr;
125 uint32_t major;
126 uint32_t minor; /* minor device number */
127 int read_only; /* 0:read-write; 1:read-only */
128
129 int32_t target_count;
130};
131
132struct dm_deps {
133 uint32_t count;
134 uint32_t filler;
135 uint64_t device[0];
136};
137
138struct dm_names {
139 uint64_t dev;
140 uint32_t next; /* Offset to next struct from start of this struct */
141 char name[0];
142};
143
144struct dm_versions {
145 uint32_t next; /* Offset to next struct from start of this struct */
146 uint32_t version[3];
147
148 char name[0];
149};
150
151int dm_get_library_version(char *version, size_t size);
152int dm_task_get_driver_version(struct dm_task *dmt, char *version, size_t size);
153int dm_task_get_info(struct dm_task *dmt, struct dm_info *dmi);
154const char *dm_task_get_name(const struct dm_task *dmt);
155const char *dm_task_get_uuid(const struct dm_task *dmt);
156
157struct dm_deps *dm_task_get_deps(struct dm_task *dmt);
158struct dm_names *dm_task_get_names(struct dm_task *dmt);
159struct dm_versions *dm_task_get_versions(struct dm_task *dmt);
160
161int dm_task_set_ro(struct dm_task *dmt);
162int dm_task_set_newname(struct dm_task *dmt, const char *newname);
163int dm_task_set_minor(struct dm_task *dmt, int minor);
164int dm_task_set_major(struct dm_task *dmt, int major);
165int dm_task_set_major_minor(struct dm_task *dmt, int major, int minor, int allow_default_major_fallback);
166int dm_task_set_uid(struct dm_task *dmt, uid_t uid);
167int dm_task_set_gid(struct dm_task *dmt, gid_t gid);
168int dm_task_set_mode(struct dm_task *dmt, mode_t mode);
169int dm_task_set_cookie(struct dm_task *dmt, uint32_t *cookie, uint16_t flags);
170int dm_task_set_event_nr(struct dm_task *dmt, uint32_t event_nr);
171int dm_task_set_geometry(struct dm_task *dmt, const char *cylinders, const char *heads, const char *sectors, const char *start);
172int dm_task_set_message(struct dm_task *dmt, const char *message);
173int dm_task_set_sector(struct dm_task *dmt, uint64_t sector);
174int dm_task_no_flush(struct dm_task *dmt);
175int dm_task_no_open_count(struct dm_task *dmt);
176int dm_task_skip_lockfs(struct dm_task *dmt);
177int dm_task_query_inactive_table(struct dm_task *dmt);
178int dm_task_suppress_identical_reload(struct dm_task *dmt);
179
180/*
181 * Control read_ahead.
182 */
183#define DM_READ_AHEAD_AUTO UINT32_MAX /* Use kernel default readahead */
184#define DM_READ_AHEAD_NONE 0 /* Disable readahead */
185
186#define DM_READ_AHEAD_MINIMUM_FLAG 0x1 /* Value supplied is minimum */
187
188/*
189 * Read ahead is set with DM_DEVICE_CREATE with a table or DM_DEVICE_RESUME.
190 */
191int dm_task_set_read_ahead(struct dm_task *dmt, uint32_t read_ahead,
192 uint32_t read_ahead_flags);
193uint32_t dm_task_get_read_ahead(const struct dm_task *dmt,
194 uint32_t *read_ahead);
195
196/*
197 * Use these to prepare for a create or reload.
198 */
199int dm_task_add_target(struct dm_task *dmt,
200 uint64_t start,
201 uint64_t size, const char *ttype, const char *params);
202
203/*
204 * Format major/minor numbers correctly for input to driver.
205 */
206#define DM_FORMAT_DEV_BUFSIZE 13 /* Minimum bufsize to handle worst case. */
207int dm_format_dev(char *buf, int bufsize, uint32_t dev_major, uint32_t dev_minor);
208
209/* Use this to retrive target information returned from a STATUS call */
210void *dm_get_next_target(struct dm_task *dmt,
211 void *next, uint64_t *start, uint64_t *length,
212 char **target_type, char **params);
213
214/*
215 * Call this to actually run the ioctl.
216 */
217int dm_task_run(struct dm_task *dmt);
218
219/*
220 * Call this to make or remove the device nodes associated with previously
221 * issued commands.
222 */
223void dm_task_update_nodes(void);
224
225/*
226 * Configure the device-mapper directory
227 */
228int dm_set_dev_dir(const char *dir);
229const char *dm_dir(void);
230
231/*
232 * Determine whether a major number belongs to device-mapper or not.
233 */
234int dm_is_dm_major(uint32_t major);
235
236/*
237 * Release library resources
238 */
239void dm_lib_release(void);
240void dm_lib_exit(void) __attribute((destructor));
241
242/*
243 * Use NULL for all devices.
244 */
245int dm_mknodes(const char *name);
246int dm_driver_version(char *version, size_t size);
247
248/******************************************************
249 * Functions to build and manipulate trees of devices *
250 ******************************************************/
251struct dm_tree;
252struct dm_tree_node;
253
254/*
255 * Initialise an empty dependency tree.
256 *
257 * The tree consists of a root node together with one node for each mapped
258 * device which has child nodes for each device referenced in its table.
259 *
260 * Every node in the tree has one or more children and one or more parents.
261 *
262 * The root node is the parent/child of every node that doesn't have other
263 * parents/children.
264 */
265struct dm_tree *dm_tree_create(void);
266void dm_tree_free(struct dm_tree *tree);
267
268/*
269 * Add nodes to the tree for a given device and all the devices it uses.
270 */
271int dm_tree_add_dev(struct dm_tree *tree, uint32_t major, uint32_t minor);
272
273/*
274 * Add a new node to the tree if it doesn't already exist.
275 */
276struct dm_tree_node *dm_tree_add_new_dev(struct dm_tree *tree,
277 const char *name,
278 const char *uuid,
279 uint32_t major, uint32_t minor,
280 int read_only,
281 int clear_inactive,
282 void *context);
283struct dm_tree_node *dm_tree_add_new_dev_with_udev_flags(struct dm_tree *tree,
284 const char *name,
285 const char *uuid,
286 uint32_t major,
287 uint32_t minor,
288 int read_only,
289 int clear_inactive,
290 void *context,
291 uint16_t udev_flags);
292
293/*
294 * Search for a node in the tree.
295 * Set major and minor to 0 or uuid to NULL to get the root node.
296 */
297struct dm_tree_node *dm_tree_find_node(struct dm_tree *tree,
298 uint32_t major,
299 uint32_t minor);
300struct dm_tree_node *dm_tree_find_node_by_uuid(struct dm_tree *tree,
301 const char *uuid);
302
303/*
304 * Use this to walk through all children of a given node.
305 * Set handle to NULL in first call.
306 * Returns NULL after the last child.
307 * Set inverted to use inverted tree.
308 */
309struct dm_tree_node *dm_tree_next_child(void **handle,
310 struct dm_tree_node *parent,
311 uint32_t inverted);
312
313/*
314 * Get properties of a node.
315 */
316const char *dm_tree_node_get_name(struct dm_tree_node *node);
317const char *dm_tree_node_get_uuid(struct dm_tree_node *node);
318const struct dm_info *dm_tree_node_get_info(struct dm_tree_node *node);
319void *dm_tree_node_get_context(struct dm_tree_node *node);
320int dm_tree_node_size_changed(struct dm_tree_node *dnode);
321
322/*
323 * Returns the number of children of the given node (excluding the root node).
324 * Set inverted for the number of parents.
325 */
326int dm_tree_node_num_children(struct dm_tree_node *node, uint32_t inverted);
327
328/*
329 * Deactivate a device plus all dependencies.
330 * Ignores devices that don't have a uuid starting with uuid_prefix.
331 */
332int dm_tree_deactivate_children(struct dm_tree_node *dnode,
333 const char *uuid_prefix,
334 size_t uuid_prefix_len);
335/*
336 * Preload/create a device plus all dependencies.
337 * Ignores devices that don't have a uuid starting with uuid_prefix.
338 */
339int dm_tree_preload_children(struct dm_tree_node *dnode,
340 const char *uuid_prefix,
341 size_t uuid_prefix_len);
342
343/*
344 * Resume a device plus all dependencies.
345 * Ignores devices that don't have a uuid starting with uuid_prefix.
346 */
347int dm_tree_activate_children(struct dm_tree_node *dnode,
348 const char *uuid_prefix,
349 size_t uuid_prefix_len);
350
351/*
352 * Suspend a device plus all dependencies.
353 * Ignores devices that don't have a uuid starting with uuid_prefix.
354 */
355int dm_tree_suspend_children(struct dm_tree_node *dnode,
356 const char *uuid_prefix,
357 size_t uuid_prefix_len);
358
359/*
360 * Skip the filesystem sync when suspending.
361 * Does nothing with other functions.
362 * Use this when no snapshots are involved.
363 */
364void dm_tree_skip_lockfs(struct dm_tree_node *dnode);
365
366/*
367 * Set the 'noflush' flag when suspending devices.
368 * If the kernel supports it, instead of erroring outstanding I/O that
369 * cannot be completed, the I/O is queued and resubmitted when the
370 * device is resumed. This affects multipath devices when all paths
371 * have failed and queue_if_no_path is set, and mirror devices when
372 * block_on_error is set and the mirror log has failed.
373 */
374void dm_tree_use_no_flush_suspend(struct dm_tree_node *dnode);
375
376/*
377 * Is the uuid prefix present in the tree?
378 * Only returns 0 if every node was checked successfully.
379 * Returns 1 if the tree walk has to be aborted.
380 */
381int dm_tree_children_use_uuid(struct dm_tree_node *dnode,
382 const char *uuid_prefix,
383 size_t uuid_prefix_len);
384
385/*
386 * Construct tables for new nodes before activating them.
387 */
388int dm_tree_node_add_snapshot_origin_target(struct dm_tree_node *dnode,
389 uint64_t size,
390 const char *origin_uuid);
391int dm_tree_node_add_snapshot_target(struct dm_tree_node *node,
392 uint64_t size,
393 const char *origin_uuid,
394 const char *cow_uuid,
395 int persistent,
396 uint32_t chunk_size);
397int dm_tree_node_add_error_target(struct dm_tree_node *node,
398 uint64_t size);
399int dm_tree_node_add_zero_target(struct dm_tree_node *node,
400 uint64_t size);
401int dm_tree_node_add_linear_target(struct dm_tree_node *node,
402 uint64_t size);
403int dm_tree_node_add_striped_target(struct dm_tree_node *node,
404 uint64_t size,
405 uint32_t stripe_size);
406
407#define DM_CRYPT_IV_DEFAULT UINT64_C(-1) /* iv_offset == seg offset */
408/*
409 * Function accepts one string in cipher specification
410 * (chainmode and iv should be NULL because included in cipher string)
411 * or
412 * separate arguments which will be joined to "cipher-chainmode-iv"
413 */
414int dm_tree_node_add_crypt_target(struct dm_tree_node *node,
415 uint64_t size,
416 const char *cipher,
417 const char *chainmode,
418 const char *iv,
419 uint64_t iv_offset,
420 const char *key);
421int dm_tree_node_add_mirror_target(struct dm_tree_node *node,
422 uint64_t size);
423
424/* Mirror log flags */
425#define DM_NOSYNC 0x00000001 /* Known already in sync */
426#define DM_FORCESYNC 0x00000002 /* Force resync */
427#define DM_BLOCK_ON_ERROR 0x00000004 /* On error, suspend I/O */
428#define DM_CORELOG 0x00000008 /* In-memory log */
429
430int dm_tree_node_add_mirror_target_log(struct dm_tree_node *node,
431 uint32_t region_size,
432 unsigned clustered,
433 const char *log_uuid,
434 unsigned area_count,
435 uint32_t flags);
436int dm_tree_node_add_target_area(struct dm_tree_node *node,
437 const char *dev_name,
438 const char *dlid,
439 uint64_t offset);
440
441/*
442 * Set readahead (in sectors) after loading the node.
443 */
444void dm_tree_node_set_read_ahead(struct dm_tree_node *dnode,
445 uint32_t read_ahead,
446 uint32_t read_ahead_flags);
447
448void dm_tree_set_cookie(struct dm_tree_node *node, uint32_t cookie);
449uint32_t dm_tree_get_cookie(struct dm_tree_node *node);
450
451/*****************************************************************************
452 * Library functions
453 *****************************************************************************/
454
455/*******************
456 * Memory management
457 *******************/
458
459void *dm_malloc_aux(size_t s, const char *file, int line);
460void *dm_malloc_aux_debug(size_t s, const char *file, int line);
461char *dm_strdup_aux(const char *str, const char *file, int line);
462void dm_free_aux(void *p);
463void *dm_realloc_aux(void *p, unsigned int s, const char *file, int line);
464int dm_dump_memory_debug(void);
465void dm_bounds_check_debug(void);
466
467#ifdef DEBUG_MEM
468
469# define dm_malloc(s) dm_malloc_aux_debug((s), __FILE__, __LINE__)
470# define dm_strdup(s) dm_strdup_aux((s), __FILE__, __LINE__)
471# define dm_free(p) dm_free_aux(p)
472# define dm_realloc(p, s) dm_realloc_aux(p, s, __FILE__, __LINE__)
473# define dm_dump_memory() dm_dump_memory_debug()
474# define dm_bounds_check() dm_bounds_check_debug()
475
476#else
477
478# define dm_malloc(s) dm_malloc_aux((s), __FILE__, __LINE__)
479# define dm_strdup(s) strdup(s)
480# define dm_free(p) free(p)
481# define dm_realloc(p, s) realloc(p, s)
482# define dm_dump_memory() {}
483# define dm_bounds_check() {}
484
485#endif
486
487
488/*
489 * The pool allocator is useful when you are going to allocate
490 * lots of memory, use the memory for a bit, and then free the
491 * memory in one go. A surprising amount of code has this usage
492 * profile.
493 *
494 * You should think of the pool as an infinite, contiguous chunk
495 * of memory. The front of this chunk of memory contains
496 * allocated objects, the second half is free. dm_pool_alloc grabs
497 * the next 'size' bytes from the free half, in effect moving it
498 * into the allocated half. This operation is very efficient.
499 *
500 * dm_pool_free frees the allocated object *and* all objects
501 * allocated after it. It is important to note this semantic
502 * difference from malloc/free. This is also extremely
503 * efficient, since a single dm_pool_free can dispose of a large
504 * complex object.
505 *
506 * dm_pool_destroy frees all allocated memory.
507 *
508 * eg, If you are building a binary tree in your program, and
509 * know that you are only ever going to insert into your tree,
510 * and not delete (eg, maintaining a symbol table for a
511 * compiler). You can create yourself a pool, allocate the nodes
512 * from it, and when the tree becomes redundant call dm_pool_destroy
513 * (no nasty iterating through the tree to free nodes).
514 *
515 * eg, On the other hand if you wanted to repeatedly insert and
516 * remove objects into the tree, you would be better off
517 * allocating the nodes from a free list; you cannot free a
518 * single arbitrary node with pool.
519 */
520
521struct dm_pool;
522
523/* constructor and destructor */
524struct dm_pool *dm_pool_create(const char *name, size_t chunk_hint);
525void dm_pool_destroy(struct dm_pool *p);
526
527/* simple allocation/free routines */
528void *dm_pool_alloc(struct dm_pool *p, size_t s);
529void *dm_pool_alloc_aligned(struct dm_pool *p, size_t s, unsigned alignment);
530void dm_pool_empty(struct dm_pool *p);
531void dm_pool_free(struct dm_pool *p, void *ptr);
532
533/*
534 * Object building routines:
535 *
536 * These allow you to 'grow' an object, useful for
537 * building strings, or filling in dynamic
538 * arrays.
539 *
540 * It's probably best explained with an example:
541 *
542 * char *build_string(struct dm_pool *mem)
543 * {
544 * int i;
545 * char buffer[16];
546 *
547 * if (!dm_pool_begin_object(mem, 128))
548 * return NULL;
549 *
550 * for (i = 0; i < 50; i++) {
551 * snprintf(buffer, sizeof(buffer), "%d, ", i);
552 * if (!dm_pool_grow_object(mem, buffer, 0))
553 * goto bad;
554 * }
555 *
556 * // add null
557 * if (!dm_pool_grow_object(mem, "\0", 1))
558 * goto bad;
559 *
560 * return dm_pool_end_object(mem);
561 *
562 * bad:
563 *
564 * dm_pool_abandon_object(mem);
565 * return NULL;
566 *}
567 *
568 * So start an object by calling dm_pool_begin_object
569 * with a guess at the final object size - if in
570 * doubt make the guess too small.
571 *
572 * Then append chunks of data to your object with
573 * dm_pool_grow_object. Finally get your object with
574 * a call to dm_pool_end_object.
575 *
576 * Setting delta to 0 means it will use strlen(extra).
577 */
578int dm_pool_begin_object(struct dm_pool *p, size_t hint);
579int dm_pool_grow_object(struct dm_pool *p, const void *extra, size_t delta);
580void *dm_pool_end_object(struct dm_pool *p);
581void dm_pool_abandon_object(struct dm_pool *p);
582
583/* utilities */
584char *dm_pool_strdup(struct dm_pool *p, const char *str);
585char *dm_pool_strndup(struct dm_pool *p, const char *str, size_t n);
586void *dm_pool_zalloc(struct dm_pool *p, size_t s);
587
588/******************
589 * bitset functions
590 ******************/
591
592typedef uint32_t *dm_bitset_t;
593
594dm_bitset_t dm_bitset_create(struct dm_pool *mem, unsigned num_bits);
595void dm_bitset_destroy(dm_bitset_t bs);
596
597void dm_bit_union(dm_bitset_t out, dm_bitset_t in1, dm_bitset_t in2);
598int dm_bit_get_first(dm_bitset_t bs);
599int dm_bit_get_next(dm_bitset_t bs, int last_bit);
600
601#define DM_BITS_PER_INT (sizeof(int) * CHAR_BIT)
602
603#define dm_bit(bs, i) \
604 (bs[(i / DM_BITS_PER_INT) + 1] & (0x1 << (i & (DM_BITS_PER_INT - 1))))
605
606#define dm_bit_set(bs, i) \
607 (bs[(i / DM_BITS_PER_INT) + 1] |= (0x1 << (i & (DM_BITS_PER_INT - 1))))
608
609#define dm_bit_clear(bs, i) \
610 (bs[(i / DM_BITS_PER_INT) + 1] &= ~(0x1 << (i & (DM_BITS_PER_INT - 1))))
611
612#define dm_bit_set_all(bs) \
613 memset(bs + 1, -1, ((*bs / DM_BITS_PER_INT) + 1) * sizeof(int))
614
615#define dm_bit_clear_all(bs) \
616 memset(bs + 1, 0, ((*bs / DM_BITS_PER_INT) + 1) * sizeof(int))
617
618#define dm_bit_copy(bs1, bs2) \
619 memcpy(bs1 + 1, bs2 + 1, ((*bs1 / DM_BITS_PER_INT) + 1) * sizeof(int))
620
621/* Returns number of set bits */
622static inline unsigned hweight32(uint32_t i)
623{
624 unsigned r = (i & 0x55555555) + ((i >> 1) & 0x55555555);
625
626 r = (r & 0x33333333) + ((r >> 2) & 0x33333333);
627 r = (r & 0x0F0F0F0F) + ((r >> 4) & 0x0F0F0F0F);
628 r = (r & 0x00FF00FF) + ((r >> 8) & 0x00FF00FF);
629 return (r & 0x0000FFFF) + ((r >> 16) & 0x0000FFFF);
630}
631
632/****************
633 * hash functions
634 ****************/
635
636struct dm_hash_table;
637struct dm_hash_node;
638
639typedef void (*dm_hash_iterate_fn) (void *data);
640
641struct dm_hash_table *dm_hash_create(unsigned size_hint);
642void dm_hash_destroy(struct dm_hash_table *t);
643void dm_hash_wipe(struct dm_hash_table *t);
644
645void *dm_hash_lookup(struct dm_hash_table *t, const char *key);
646int dm_hash_insert(struct dm_hash_table *t, const char *key, void *data);
647void dm_hash_remove(struct dm_hash_table *t, const char *key);
648
649void *dm_hash_lookup_binary(struct dm_hash_table *t, const char *key, uint32_t len);
650int dm_hash_insert_binary(struct dm_hash_table *t, const char *key, uint32_t len,
651 void *data);
652void dm_hash_remove_binary(struct dm_hash_table *t, const char *key, uint32_t len);
653
654unsigned dm_hash_get_num_entries(struct dm_hash_table *t);
655void dm_hash_iter(struct dm_hash_table *t, dm_hash_iterate_fn f);
656
657char *dm_hash_get_key(struct dm_hash_table *t, struct dm_hash_node *n);
658void *dm_hash_get_data(struct dm_hash_table *t, struct dm_hash_node *n);
659struct dm_hash_node *dm_hash_get_first(struct dm_hash_table *t);
660struct dm_hash_node *dm_hash_get_next(struct dm_hash_table *t, struct dm_hash_node *n);
661
662#define dm_hash_iterate(v, h) \
663 for (v = dm_hash_get_first(h); v; \
664 v = dm_hash_get_next(h, v))
665
666/****************
667 * list functions
668 ****************/
669
670/*
671 * A list consists of a list head plus elements.
672 * Each element has 'next' and 'previous' pointers.
673 * The list head's pointers point to the first and the last element.
674 */
675
676struct dm_list {
677 struct dm_list *n, *p;
678};
679
680/*
681 * Initialise a list before use.
682 * The list head's next and previous pointers point back to itself.
683 */
684#define DM_LIST_INIT(name) struct dm_list name = { &(name), &(name) }
685void dm_list_init(struct dm_list *head);
686
687/*
688 * Insert an element before 'head'.
689 * If 'head' is the list head, this adds an element to the end of the list.
690 */
691void dm_list_add(struct dm_list *head, struct dm_list *elem);
692
693/*
694 * Insert an element after 'head'.
695 * If 'head' is the list head, this adds an element to the front of the list.
696 */
697void dm_list_add_h(struct dm_list *head, struct dm_list *elem);
698
699/*
700 * Delete an element from its list.
701 * Note that this doesn't change the element itself - it may still be safe
702 * to follow its pointers.
703 */
704void dm_list_del(struct dm_list *elem);
705
706/*
707 * Remove an element from existing list and insert before 'head'.
708 */
709void dm_list_move(struct dm_list *head, struct dm_list *elem);
710
711/*
712 * Is the list empty?
713 */
714int dm_list_empty(const struct dm_list *head);
715
716/*
717 * Is this the first element of the list?
718 */
719int dm_list_start(const struct dm_list *head, const struct dm_list *elem);
720
721/*
722 * Is this the last element of the list?
723 */
724int dm_list_end(const struct dm_list *head, const struct dm_list *elem);
725
726/*
727 * Return first element of the list or NULL if empty
728 */
729struct dm_list *dm_list_first(const struct dm_list *head);
730
731/*
732 * Return last element of the list or NULL if empty
733 */
734struct dm_list *dm_list_last(const struct dm_list *head);
735
736/*
737 * Return the previous element of the list, or NULL if we've reached the start.
738 */
739struct dm_list *dm_list_prev(const struct dm_list *head, const struct dm_list *elem);
740
741/*
742 * Return the next element of the list, or NULL if we've reached the end.
743 */
744struct dm_list *dm_list_next(const struct dm_list *head, const struct dm_list *elem);
745
746/*
747 * Given the address v of an instance of 'struct dm_list' called 'head'
748 * contained in a structure of type t, return the containing structure.
749 */
750#define dm_list_struct_base(v, t, head) \
751 ((t *)((uintptr_t)(v) - (uintptr_t)&((t *) 0)->head))
752
753/*
754 * Given the address v of an instance of 'struct dm_list list' contained in
755 * a structure of type t, return the containing structure.
756 */
757#define dm_list_item(v, t) dm_list_struct_base((v), t, list)
758
759/*
760 * Given the address v of one known element e in a known structure of type t,
761 * return another element f.
762 */
763#define dm_struct_field(v, t, e, f) \
764 (((t *)((uintptr_t)(v) - (uintptr_t)&((t *) 0)->e))->f)
765
766/*
767 * Given the address v of a known element e in a known structure of type t,
768 * return the list head 'list'
769 */
770#define dm_list_head(v, t, e) dm_struct_field(v, t, e, list)
771
772/*
773 * Set v to each element of a list in turn.
774 */
775#define dm_list_iterate(v, head) \
776 for (v = (head)->n; v != head; v = v->n)
777
778/*
779 * Set v to each element in a list in turn, starting from the element
780 * in front of 'start'.
781 * You can use this to 'unwind' a list_iterate and back out actions on
782 * already-processed elements.
783 * If 'start' is 'head' it walks the list backwards.
784 */
785#define dm_list_uniterate(v, head, start) \
786 for (v = (start)->p; v != head; v = v->p)
787
788/*
789 * A safe way to walk a list and delete and free some elements along
790 * the way.
791 * t must be defined as a temporary variable of the same type as v.
792 */
793#define dm_list_iterate_safe(v, t, head) \
794 for (v = (head)->n, t = v->n; v != head; v = t, t = v->n)
795
796/*
797 * Walk a list, setting 'v' in turn to the containing structure of each item.
798 * The containing structure should be the same type as 'v'.
799 * The 'struct dm_list' variable within the containing structure is 'field'.
800 */
801#define dm_list_iterate_items_gen(v, head, field) \
802 for (v = dm_list_struct_base((head)->n, typeof(*v), field); \
803 &v->field != (head); \
804 v = dm_list_struct_base(v->field.n, typeof(*v), field))
805
806/*
807 * Walk a list, setting 'v' in turn to the containing structure of each item.
808 * The containing structure should be the same type as 'v'.
809 * The list should be 'struct dm_list list' within the containing structure.
810 */
811#define dm_list_iterate_items(v, head) dm_list_iterate_items_gen(v, (head), list)
812
813/*
814 * Walk a list, setting 'v' in turn to the containing structure of each item.
815 * The containing structure should be the same type as 'v'.
816 * The 'struct dm_list' variable within the containing structure is 'field'.
817 * t must be defined as a temporary variable of the same type as v.
818 */
819#define dm_list_iterate_items_gen_safe(v, t, head, field) \
820 for (v = dm_list_struct_base((head)->n, typeof(*v), field), \
821 t = dm_list_struct_base(v->field.n, typeof(*v), field); \
822 &v->field != (head); \
823 v = t, t = dm_list_struct_base(v->field.n, typeof(*v), field))
824/*
825 * Walk a list, setting 'v' in turn to the containing structure of each item.
826 * The containing structure should be the same type as 'v'.
827 * The list should be 'struct dm_list list' within the containing structure.
828 * t must be defined as a temporary variable of the same type as v.
829 */
830#define dm_list_iterate_items_safe(v, t, head) \
831 dm_list_iterate_items_gen_safe(v, t, (head), list)
832
833/*
834 * Walk a list backwards, setting 'v' in turn to the containing structure
835 * of each item.
836 * The containing structure should be the same type as 'v'.
837 * The 'struct dm_list' variable within the containing structure is 'field'.
838 */
839#define dm_list_iterate_back_items_gen(v, head, field) \
840 for (v = dm_list_struct_base((head)->p, typeof(*v), field); \
841 &v->field != (head); \
842 v = dm_list_struct_base(v->field.p, typeof(*v), field))
843
844/*
845 * Walk a list backwards, setting 'v' in turn to the containing structure
846 * of each item.
847 * The containing structure should be the same type as 'v'.
848 * The list should be 'struct dm_list list' within the containing structure.
849 */
850#define dm_list_iterate_back_items(v, head) dm_list_iterate_back_items_gen(v, (head), list)
851
852/*
853 * Return the number of elements in a list by walking it.
854 */
855unsigned int dm_list_size(const struct dm_list *head);
856
857/*********
858 * selinux
859 *********/
860int dm_set_selinux_context(const char *path, mode_t mode);
861
862/*********************
863 * string manipulation
864 *********************/
865
866/*
867 * Break up the name of a mapped device into its constituent
868 * Volume Group, Logical Volume and Layer (if present).
869 * If mem is supplied, the result is allocated from the mempool.
870 * Otherwise the strings are changed in situ.
871 */
872int dm_split_lvm_name(struct dm_pool *mem, const char *dmname,
873 char **vgname, char **lvname, char **layer);
874
875/*
876 * Destructively split buffer into NULL-separated words in argv.
877 * Returns number of words.
878 */
879int dm_split_words(char *buffer, unsigned max,
880 unsigned ignore_comments, /* Not implemented */
881 char **argv);
882
883/*
884 * Returns -1 if buffer too small
885 */
886int dm_snprintf(char *buf, size_t bufsize, const char *format, ...);
887
888/*
889 * Returns pointer to the last component of the path.
890 */
891char *dm_basename(const char *path);
892
893/**************************
894 * file/stream manipulation
895 **************************/
896
897/*
898 * Create a directory (with parent directories if necessary).
899 * Returns 1 on success, 0 on failure.
900 */
901int dm_create_dir(const char *dir);
902
903/*
904 * Close a stream, with nicer error checking than fclose's.
905 * Derived from gnulib's close-stream.c.
906 *
907 * Close "stream". Return 0 if successful, and EOF (setting errno)
908 * otherwise. Upon failure, set errno to 0 if the error number
909 * cannot be determined. Useful mainly for writable streams.
910 */
911int dm_fclose(FILE *stream);
912
913/*
914 * Returns size of a buffer which is allocated with dm_malloc.
915 * Pointer to the buffer is stored in *buf.
916 * Returns -1 on failure leaving buf undefined.
917 */
918int dm_asprintf(char **buf, const char *format, ...);
919
920/*********************
921 * regular expressions
922 *********************/
923struct dm_regex;
924
925/*
926 * Initialise an array of num patterns for matching.
927 * Uses memory from mem.
928 */
929struct dm_regex *dm_regex_create(struct dm_pool *mem, const char **patterns,
930 unsigned num_patterns);
931
932/*
933 * Match string s against the patterns.
934 * Returns the index of the highest pattern in the array that matches,
935 * or -1 if none match.
936 */
937int dm_regex_match(struct dm_regex *regex, const char *s);
938
939/*********************
940 * reporting functions
941 *********************/
942
943struct dm_report_object_type {
944 uint32_t id; /* Powers of 2 */
945 const char *desc;
946 const char *prefix; /* field id string prefix (optional) */
947 void *(*data_fn)(void *object); /* callback from report_object() */
948};
949
950struct dm_report_field;
951
952/*
953 * dm_report_field_type flags
954 */
955#define DM_REPORT_FIELD_MASK 0x000000FF
956#define DM_REPORT_FIELD_ALIGN_MASK 0x0000000F
957#define DM_REPORT_FIELD_ALIGN_LEFT 0x00000001
958#define DM_REPORT_FIELD_ALIGN_RIGHT 0x00000002
959#define DM_REPORT_FIELD_TYPE_MASK 0x000000F0
960#define DM_REPORT_FIELD_TYPE_STRING 0x00000010
961#define DM_REPORT_FIELD_TYPE_NUMBER 0x00000020
962
963struct dm_report;
964struct dm_report_field_type {
965 uint32_t type; /* object type id */
966 uint32_t flags; /* DM_REPORT_FIELD_* */
967 uint32_t offset; /* byte offset in the object */
968 int32_t width; /* default width */
969 const char id[32]; /* string used to specify the field */
970 const char heading[32]; /* string printed in header */
971 int (*report_fn)(struct dm_report *rh, struct dm_pool *mem,
972 struct dm_report_field *field, const void *data,
973 void *private);
974 const char *desc; /* description of the field */
975};
976
977/*
978 * dm_report_init output_flags
979 */
980#define DM_REPORT_OUTPUT_MASK 0x000000FF
981#define DM_REPORT_OUTPUT_ALIGNED 0x00000001
982#define DM_REPORT_OUTPUT_BUFFERED 0x00000002
983#define DM_REPORT_OUTPUT_HEADINGS 0x00000004
984#define DM_REPORT_OUTPUT_FIELD_NAME_PREFIX 0x00000008
985#define DM_REPORT_OUTPUT_FIELD_UNQUOTED 0x00000010
986#define DM_REPORT_OUTPUT_COLUMNS_AS_ROWS 0x00000020
987
988struct dm_report *dm_report_init(uint32_t *report_types,
989 const struct dm_report_object_type *types,
990 const struct dm_report_field_type *fields,
991 const char *output_fields,
992 const char *output_separator,
993 uint32_t output_flags,
994 const char *sort_keys,
995 void *private);
996int dm_report_object(struct dm_report *rh, void *object);
997int dm_report_output(struct dm_report *rh);
998void dm_report_free(struct dm_report *rh);
999
1000/*
1001 * Prefix added to each field name with DM_REPORT_OUTPUT_FIELD_NAME_PREFIX
1002 */
1003int dm_report_set_output_field_name_prefix(struct dm_report *rh,
1004 const char *report_prefix);
1005
1006/*
1007 * Report functions are provided for simple data types.
1008 * They take care of allocating copies of the data.
1009 */
1010int dm_report_field_string(struct dm_report *rh, struct dm_report_field *field,
1011 const char **data);
1012int dm_report_field_int32(struct dm_report *rh, struct dm_report_field *field,
1013 const int32_t *data);
1014int dm_report_field_uint32(struct dm_report *rh, struct dm_report_field *field,
1015 const uint32_t *data);
1016int dm_report_field_int(struct dm_report *rh, struct dm_report_field *field,
1017 const int *data);
1018int dm_report_field_uint64(struct dm_report *rh, struct dm_report_field *field,
1019 const uint64_t *data);
1020
1021/*
1022 * For custom fields, allocate the data in 'mem' and use
1023 * dm_report_field_set_value().
1024 * 'sortvalue' may be NULL if it matches 'value'
1025 */
1026void dm_report_field_set_value(struct dm_report_field *field, const void *value,
1027 const void *sortvalue);
1028
1029/* Cookie prefixes.
1030 * The cookie value consists of a prefix (16 bits) and a base (16 bits).
1031 * We can use the prefix to store the flags. These flags are sent to
1032 * kernel within given dm task. When returned back to userspace in
1033 * DM_COOKIE udev environment variable, we can control several aspects
1034 * of udev rules we use by decoding the cookie prefix. When doing the
1035 * notification, we replace the cookie prefix with DM_COOKIE_MAGIC,
1036 * so we notify the right semaphore.
1037 * It is still possible to use cookies for passing the flags to udev
1038 * rules even when udev_sync is disabled. The base part of the cookie
1039 * will be zero (there's no notification semaphore) and prefix will be
1040 * set then. However, having udev_sync enabled is highly recommended.
1041 */
1042#define DM_COOKIE_MAGIC 0x0D4D
1043#define DM_UDEV_FLAGS_MASK 0xFFFF0000
1044#define DM_UDEV_FLAGS_SHIFT 16
1045
1046/*
1047 * DM_UDEV_DISABLE_DM_RULES_FLAG is set in case we need to disable
1048 * basic device-mapper udev rules that create symlinks in /dev/<DM_DIR>
1049 * directory. However, we can't reliably prevent creating default
1050 * nodes by udev (commonly /dev/dm-X, where X is a number).
1051 */
1052#define DM_UDEV_DISABLE_DM_RULES_FLAG 0x0001
1053/*
1054 * DM_UDEV_DISABLE_SUBSYTEM_RULES_FLAG is set in case we need to disable
1055 * subsystem udev rules, but still we need the general DM udev rules to
1056 * be applied (to create the nodes and symlinks under /dev and /dev/disk).
1057 */
1058#define DM_UDEV_DISABLE_SUBSYSTEM_RULES_FLAG 0x0002
1059/*
1060 * DM_UDEV_DISABLE_DISK_RULES_FLAG is set in case we need to disable
1061 * general DM rules that set symlinks in /dev/disk directory.
1062 */
1063#define DM_UDEV_DISABLE_DISK_RULES_FLAG 0x0004
1064/*
1065 * DM_UDEV_DISABLE_OTHER_RULES_FLAG is set in case we need to disable
1066 * all the other rules that are not general device-mapper nor subsystem
1067 * related (the rules belong to other software or packages). All foreign
1068 * rules should check this flag directly and they should ignore further
1069 * rule processing for such event.
1070 */
1071#define DM_UDEV_DISABLE_OTHER_RULES_FLAG 0x0008
1072/*
1073 * DM_UDEV_LOW_PRIORITY_FLAG is set in case we need to instruct the
1074 * udev rules to give low priority to the device that is currently
1075 * processed. For example, this provides a way to select which symlinks
1076 * could be overwritten by high priority ones if their names are equal.
1077 * Common situation is a name based on FS UUID while using origin and
1078 * snapshot devices.
1079 */
1080#define DM_UDEV_LOW_PRIORITY_FLAG 0x0010
1081
1082int dm_cookie_supported(void);
1083
1084/*
1085 * Udev synchronisation functions.
1086 */
1087void dm_udev_set_sync_support(int sync_with_udev);
1088int dm_udev_get_sync_support(void);
1089int dm_udev_complete(uint32_t cookie);
1090int dm_udev_wait(uint32_t cookie);
1091
1092#define DM_DEV_DIR_UMASK 0022
1093
1094#endif /* LIB_DEVICE_MAPPER_H */
1095