1 /*        $NetBSD: disk-rep.h,v 1.1.1.2 2009/12/02 00:26:48 haad Exp $          */
2 
3 /*
4  * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved.
5  * Copyright (C) 2004-2006 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 DISK_REP_FORMAT1_H
19 #define DISK_REP_FORMAT1_H
20 
21 #include "lvm-types.h"
22 #include "metadata.h"
23 #include "toolcontext.h"
24 
25 #define MAX_PV 256
26 #define MAX_LV 256
27 #define MAX_VG 99
28 
29 #define LVM_BLK_MAJOR 58
30 
31 #define MAX_PV_SIZE ((uint32_t) -1)     /* 2TB in sectors - 1 */
32 #define MIN_PE_SIZE (8192L >> SECTOR_SHIFT)       /* 8 KB in sectors */
33 #define MAX_PE_SIZE (16L * 1024L * (1024L >> SECTOR_SHIFT) * 1024L)
34 #define PE_SIZE_PV_SIZE_REL 5 /* PV size must be at least 5 times PE size */
35 #define   MAX_LE_TOTAL        65534     /* 2^16 - 2 */
36 #define   MAX_PE_TOTAL        ((uint32_t) -2)
37 
38 #define UNMAPPED_EXTENT 0
39 
40 /* volume group */
41 #define   VG_ACTIVE            0x01     /* vg_status */
42 #define   VG_EXPORTED          0x02     /*     "     */
43 #define   VG_EXTENDABLE        0x04     /*     "     */
44 
45 #define   VG_READ              0x01     /* vg_access */
46 #define   VG_WRITE             0x02     /*     "     */
47 #define   VG_CLUSTERED         0x04     /*     "     */
48 #define   VG_SHARED            0x08     /*     "     */
49 
50 /* logical volume */
51 #define   LV_ACTIVE            0x01     /* lv_status */
52 #define   LV_SPINDOWN          0x02     /*     "     */
53 #define LV_PERSISTENT_MINOR  0x04       /*     "     */
54 
55 #define   LV_READ              0x01     /* lv_access */
56 #define   LV_WRITE             0x02     /*     "     */
57 #define   LV_SNAPSHOT          0x04     /*     "     */
58 #define   LV_SNAPSHOT_ORG      0x08     /*     "     */
59 
60 #define   LV_BADBLOCK_ON       0x01     /* lv_badblock */
61 
62 #define   LV_STRICT            0x01     /* lv_allocation */
63 #define   LV_CONTIGUOUS        0x02     /*       "       */
64 
65 /* physical volume */
66 #define   PV_ACTIVE            0x01     /* pv_status */
67 #define   PV_ALLOCATABLE       0x02     /* pv_allocatable */
68 
69 #define EXPORTED_TAG "PV_EXP" /* Identifier for exported PV */
70 #define IMPORTED_TAG "PV_IMP" /* Identifier for imported PV */
71 
72 struct data_area {
73           uint32_t base;
74           uint32_t size;
75 } __attribute__ ((packed));
76 
77 struct pv_disk {
78           int8_t id[2];
79           uint16_t version;   /* lvm version */
80           struct data_area pv_on_disk;
81           struct data_area vg_on_disk;
82           struct data_area pv_uuidlist_on_disk;
83           struct data_area lv_on_disk;
84           struct data_area pe_on_disk;
85           int8_t pv_uuid[NAME_LEN];
86           int8_t vg_name[NAME_LEN];
87           int8_t system_id[NAME_LEN];   /* for vgexport/vgimport */
88           uint32_t pv_major;
89           uint32_t pv_number;
90           uint32_t pv_status;
91           uint32_t pv_allocatable;
92           uint32_t pv_size;
93           uint32_t lv_cur;
94           uint32_t pe_size;
95           uint32_t pe_total;
96           uint32_t pe_allocated;
97 
98           /* only present on version == 2 pv's */
99           uint32_t pe_start;
100 } __attribute__ ((packed));
101 
102 struct lv_disk {
103           int8_t lv_name[NAME_LEN];
104           int8_t vg_name[NAME_LEN];
105           uint32_t lv_access;
106           uint32_t lv_status;
107           uint32_t lv_open;
108           uint32_t lv_dev;
109           uint32_t lv_number;
110           uint32_t lv_mirror_copies;    /* for future use */
111           uint32_t lv_recovery;         /*       "        */
112           uint32_t lv_schedule;         /*       "        */
113           uint32_t lv_size;
114           uint32_t lv_snapshot_minor;   /* minor number of original */
115           uint16_t lv_chunk_size;       /* chunk size of snapshot */
116           uint16_t dummy;
117           uint32_t lv_allocated_le;
118           uint32_t lv_stripes;
119           uint32_t lv_stripesize;
120           uint32_t lv_badblock;         /* for future use */
121           uint32_t lv_allocation;
122           uint32_t lv_io_timeout;       /* for future use */
123           uint32_t lv_read_ahead;
124 } __attribute__ ((packed));
125 
126 struct vg_disk {
127           int8_t vg_uuid[ID_LEN];       /* volume group UUID */
128           int8_t vg_name_dummy[NAME_LEN - ID_LEN];          /* rest of v1 VG name */
129           uint32_t vg_number; /* volume group number */
130           uint32_t vg_access; /* read/write */
131           uint32_t vg_status; /* active or not */
132           uint32_t lv_max;    /* maximum logical volumes */
133           uint32_t lv_cur;    /* current logical volumes */
134           uint32_t lv_open;   /* open logical volumes */
135           uint32_t pv_max;    /* maximum physical volumes */
136           uint32_t pv_cur;    /* current physical volumes FU */
137           uint32_t pv_act;    /* active physical volumes */
138           uint32_t dummy;
139           uint32_t vgda;                /* volume group descriptor arrays FU */
140           uint32_t pe_size;   /* physical extent size in sectors */
141           uint32_t pe_total;  /* total of physical extents */
142           uint32_t pe_allocated;        /* allocated physical extents */
143           uint32_t pvg_total; /* physical volume groups FU */
144 } __attribute__ ((packed));
145 
146 struct pe_disk {
147           uint16_t lv_num;
148           uint16_t le_num;
149 } __attribute__ ((packed));
150 
151 struct uuid_list {
152           struct dm_list list;
153           char uuid[NAME_LEN] __attribute((aligned(8)));
154 };
155 
156 struct lvd_list {
157           struct dm_list list;
158           struct lv_disk lvd;
159 };
160 
161 struct disk_list {
162           struct dm_list list;
163           struct dm_pool *mem;
164           struct device *dev;
165 
166           struct pv_disk pvd __attribute((aligned(8)));
167           struct vg_disk vgd __attribute((aligned(8)));
168           struct dm_list uuids __attribute((aligned(8)));
169           struct dm_list lvds __attribute((aligned(8)));
170           struct pe_disk *extents __attribute((aligned(8)));
171 };
172 
173 /*
174  * Layout constants.
175  */
176 #define METADATA_ALIGN 4096UL
177 #define LVM1_PE_ALIGN (65536UL >> SECTOR_SHIFT)      /* PE alignment */
178 
179 #define   METADATA_BASE 0UL
180 #define   PV_SIZE 1024UL
181 #define   VG_SIZE 4096UL
182 
183 /*
184  * Functions to calculate layout info.
185  */
186 int calculate_layout(struct disk_list *dl);
187 int calculate_extent_count(struct physical_volume *pv, uint32_t extent_size,
188                                  uint32_t max_extent_count, uint64_t pe_start);
189 
190 /*
191  * Low level io routines which read/write
192  * disk_lists.
193  */
194 
195 struct disk_list *read_disk(const struct format_type *fmt, struct device *dev,
196                                   struct dm_pool *mem, const char *vg_name);
197 
198 int read_pvs_in_vg(const struct format_type *fmt, const char *vg_name,
199                        struct dev_filter *filter,
200                        struct dm_pool *mem, struct dm_list *results);
201 
202 int write_disks(const struct format_type *fmt, struct dm_list *pvds);
203 
204 /*
205  * Functions to translate to between disk and in
206  * core structures.
207  */
208 int import_pv(const struct format_type *fmt, struct dm_pool *mem,
209                 struct device *dev, struct volume_group *vg,
210                 struct physical_volume *pv, struct pv_disk *pvd,
211                 struct vg_disk *vgd);
212 int export_pv(struct cmd_context *cmd, struct dm_pool *mem,
213                 struct volume_group *vg,
214                 struct pv_disk *pvd, struct physical_volume *pv);
215 
216 int import_vg(struct dm_pool *mem,
217                 struct volume_group *vg, struct disk_list *dl);
218 int export_vg(struct vg_disk *vgd, struct volume_group *vg);
219 
220 int import_lv(struct cmd_context *cmd, struct dm_pool *mem,
221                 struct logical_volume *lv, struct lv_disk *lvd);
222 
223 int import_extents(struct cmd_context *cmd, struct volume_group *vg,
224                        struct dm_list *pvds);
225 int export_extents(struct disk_list *dl, uint32_t lv_num,
226                        struct logical_volume *lv, struct physical_volume *pv);
227 
228 int import_pvs(const struct format_type *fmt, struct dm_pool *mem,
229                  struct volume_group *vg,
230                  struct dm_list *pvds, struct dm_list *results, uint32_t *count);
231 
232 int import_lvs(struct dm_pool *mem, struct volume_group *vg, struct dm_list *pvds);
233 int export_lvs(struct disk_list *dl, struct volume_group *vg,
234                  struct physical_volume *pv, const char *dev_dir);
235 
236 int import_snapshots(struct dm_pool *mem, struct volume_group *vg,
237                          struct dm_list *pvds);
238 
239 int export_uuids(struct disk_list *dl, struct volume_group *vg);
240 
241 void export_numbers(struct dm_list *pvds, struct volume_group *vg);
242 
243 void export_pv_act(struct dm_list *pvds);
244 int munge_pvd(struct device *dev, struct pv_disk *pvd);
245 int read_vgd(struct device *dev, struct vg_disk *vgd, struct pv_disk *pvd);
246 
247 /* blech */
248 int get_free_vg_number(struct format_instance *fid, struct dev_filter *filter,
249                            const char *candidate_vg, int *result);
250 int export_vg_number(struct format_instance *fid, struct dm_list *pvds,
251                          const char *vg_name, struct dev_filter *filter);
252 
253 #endif
254