xref: /dragonfly/contrib/lvm2/dist/include/segtype.h (revision 0ca59c34)
1 /*	$NetBSD: segtype.h,v 1.1.1.2 2009/12/02 00:25:42 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 LVM2.
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 _SEGTYPES_H
19 #define _SEGTYPES_H
20 
21 #include "metadata-exported.h"
22 
23 struct segtype_handler;
24 struct cmd_context;
25 struct config_tree;
26 struct lv_segment;
27 struct formatter;
28 struct config_node;
29 struct dev_manager;
30 
31 /* Feature flags */
32 #define SEG_CAN_SPLIT		0x00000001U
33 #define SEG_AREAS_STRIPED	0x00000002U
34 #define SEG_AREAS_MIRRORED	0x00000004U
35 #define SEG_SNAPSHOT		0x00000008U
36 #define SEG_FORMAT1_SUPPORT	0x00000010U
37 #define SEG_VIRTUAL		0x00000020U
38 #define SEG_CANNOT_BE_ZEROED	0x00000040U
39 #define SEG_MONITORED		0x00000080U
40 #define SEG_UNKNOWN		0x80000000U
41 
42 #define seg_is_mirrored(seg)	((seg)->segtype->flags & SEG_AREAS_MIRRORED ? 1 : 0)
43 #define seg_is_striped(seg)	((seg)->segtype->flags & SEG_AREAS_STRIPED ? 1 : 0)
44 #define seg_is_snapshot(seg)	((seg)->segtype->flags & SEG_SNAPSHOT ? 1 : 0)
45 #define seg_is_virtual(seg)	((seg)->segtype->flags & SEG_VIRTUAL ? 1 : 0)
46 #define seg_can_split(seg)	((seg)->segtype->flags & SEG_CAN_SPLIT ? 1 : 0)
47 #define seg_cannot_be_zeroed(seg) ((seg)->segtype->flags & SEG_CANNOT_BE_ZEROED ? 1 : 0)
48 #define seg_monitored(seg)	((seg)->segtype->flags & SEG_MONITORED ? 1 : 0)
49 #define seg_unknown(seg)	((seg)->segtype->flags & SEG_UNKNOWN ? 1 : 0)
50 
51 #define segtype_is_striped(segtype)	((segtype)->flags & SEG_AREAS_STRIPED ? 1 : 0)
52 #define segtype_is_mirrored(segtype)	((segtype)->flags & SEG_AREAS_MIRRORED ? 1 : 0)
53 #define segtype_is_virtual(segtype)	((segtype)->flags & SEG_VIRTUAL ? 1 : 0)
54 
55 struct segment_type {
56 	struct dm_list list;		/* Internal */
57 	struct cmd_context *cmd;	/* lvm_register_segtype() sets this. */
58 	uint32_t flags;
59 	struct segtype_handler *ops;
60 	const char *name;
61 	void *library;			/* lvm_register_segtype() sets this. */
62 	void *private;			/* For the segtype handler to use. */
63 };
64 
65 struct segtype_handler {
66 	const char *(*name) (const struct lv_segment * seg);
67 	void (*display) (const struct lv_segment * seg);
68 	int (*text_export) (const struct lv_segment * seg,
69 			    struct formatter * f);
70 	int (*text_import_area_count) (struct config_node * sn,
71 				       uint32_t *area_count);
72 	int (*text_import) (struct lv_segment * seg,
73 			    const struct config_node * sn,
74 			    struct dm_hash_table * pv_hash);
75 	int (*merge_segments) (struct lv_segment * seg1,
76 			       struct lv_segment * seg2);
77 	int (*add_target_line) (struct dev_manager *dm, struct dm_pool *mem,
78                                 struct cmd_context *cmd, void **target_state,
79                                 struct lv_segment *seg,
80                                 struct dm_tree_node *node, uint64_t len,
81                                 uint32_t *pvmove_mirror_count);
82 	int (*target_percent) (void **target_state,
83 			       percent_range_t *percent_range,
84 			       struct dm_pool * mem,
85 			       struct cmd_context *cmd,
86 			       struct lv_segment *seg, char *params,
87 			       uint64_t *total_numerator,
88 			       uint64_t *total_denominator);
89 	int (*target_present) (struct cmd_context *cmd,
90 			       const struct lv_segment *seg,
91 			       unsigned *attributes);
92 	int (*modules_needed) (struct dm_pool *mem,
93 			       const struct lv_segment *seg,
94 			       struct dm_list *modules);
95 	void (*destroy) (const struct segment_type * segtype);
96 	int (*target_monitored) (struct lv_segment *seg, int *pending);
97 	int (*target_monitor_events) (struct lv_segment *seg, int events);
98 	int (*target_unmonitor_events) (struct lv_segment *seg, int events);
99 };
100 
101 struct segment_type *get_segtype_from_string(struct cmd_context *cmd,
102 					     const char *str);
103 
104 struct segtype_library;
105 int lvm_register_segtype(struct segtype_library *seglib,
106 			 struct segment_type *segtype);
107 
108 struct segment_type *init_striped_segtype(struct cmd_context *cmd);
109 struct segment_type *init_zero_segtype(struct cmd_context *cmd);
110 struct segment_type *init_error_segtype(struct cmd_context *cmd);
111 struct segment_type *init_free_segtype(struct cmd_context *cmd);
112 struct segment_type *init_unknown_segtype(struct cmd_context *cmd, const char *name);
113 
114 #ifdef SNAPSHOT_INTERNAL
115 struct segment_type *init_snapshot_segtype(struct cmd_context *cmd);
116 #endif
117 
118 #ifdef MIRRORED_INTERNAL
119 struct segment_type *init_mirrored_segtype(struct cmd_context *cmd);
120 #endif
121 
122 #ifdef CRYPT_INTERNAL
123 struct segment_type *init_crypt_segtype(struct cmd_context *cmd);
124 #endif
125 
126 #endif
127