1 |
1275 |
phoenix |
/*
|
2 |
|
|
* include/linux/lvm.h
|
3 |
|
|
* kernel/lvm.h
|
4 |
|
|
* tools/lib/lvm.h
|
5 |
|
|
*
|
6 |
|
|
* Copyright (C) 1997 - 2002 Heinz Mauelshagen, Sistina Software
|
7 |
|
|
*
|
8 |
|
|
* February-November 1997
|
9 |
|
|
* May-July 1998
|
10 |
|
|
* January-March,July,September,October,Dezember 1999
|
11 |
|
|
* January,February,July,November 2000
|
12 |
|
|
* January-March,June,July 2001
|
13 |
|
|
* May 2002
|
14 |
|
|
*
|
15 |
|
|
* lvm is free software; you can redistribute it and/or modify
|
16 |
|
|
* it under the terms of the GNU General Public License as published by
|
17 |
|
|
* the Free Software Foundation; either version 2, or (at your option)
|
18 |
|
|
* any later version.
|
19 |
|
|
*
|
20 |
|
|
* lvm is distributed in the hope that it will be useful,
|
21 |
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
22 |
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
23 |
|
|
* GNU General Public License for more details.
|
24 |
|
|
*
|
25 |
|
|
* You should have received a copy of the GNU General Public License
|
26 |
|
|
* along with GNU CC; see the file COPYING. If not, write to
|
27 |
|
|
* the Free Software Foundation, 59 Temple Place - Suite 330,
|
28 |
|
|
* Boston, MA 02111-1307, USA.
|
29 |
|
|
*
|
30 |
|
|
*/
|
31 |
|
|
|
32 |
|
|
/*
|
33 |
|
|
* Changelog
|
34 |
|
|
*
|
35 |
|
|
* 10/10/1997 - beginning of new structure creation
|
36 |
|
|
* 12/05/1998 - incorporated structures from lvm_v1.h and deleted lvm_v1.h
|
37 |
|
|
* 07/06/1998 - avoided LVM_KMALLOC_MAX define by using vmalloc/vfree
|
38 |
|
|
* instead of kmalloc/kfree
|
39 |
|
|
* 01/07/1998 - fixed wrong LVM_MAX_SIZE
|
40 |
|
|
* 07/07/1998 - extended pe_t structure by ios member (for statistic)
|
41 |
|
|
* 02/08/1998 - changes for official char/block major numbers
|
42 |
|
|
* 07/08/1998 - avoided init_module() and cleanup_module() to be static
|
43 |
|
|
* 29/08/1998 - seprated core and disk structure type definitions
|
44 |
|
|
* 01/09/1998 - merged kernel integration version (mike)
|
45 |
|
|
* 20/01/1999 - added LVM_PE_DISK_OFFSET macro for use in
|
46 |
|
|
* vg_read_with_pv_and_lv(), pv_move_pe(), pv_show_pe_text()...
|
47 |
|
|
* 18/02/1999 - added definition of time_disk_t structure for;
|
48 |
|
|
* keeps time stamps on disk for nonatomic writes (future)
|
49 |
|
|
* 15/03/1999 - corrected LV() and VG() macro definition to use argument
|
50 |
|
|
* instead of minor
|
51 |
|
|
* 03/07/1999 - define for genhd.c name handling
|
52 |
|
|
* 23/07/1999 - implemented snapshot part
|
53 |
|
|
* 08/12/1999 - changed LVM_LV_SIZE_MAX macro to reflect current 1TB limit
|
54 |
|
|
* 01/01/2000 - extended lv_v2 core structure by wait_queue member
|
55 |
|
|
* 12/02/2000 - integrated Andrea Arcagnelli's snapshot work
|
56 |
|
|
* 18/02/2000 - seperated user and kernel space parts by
|
57 |
|
|
* #ifdef them with __KERNEL__
|
58 |
|
|
* 08/03/2000 - implemented cluster/shared bits for vg_access
|
59 |
|
|
* 26/06/2000 - implemented snapshot persistency and resizing support
|
60 |
|
|
* 02/11/2000 - added hash table size member to lv structure
|
61 |
|
|
* 12/11/2000 - removed unneeded timestamp definitions
|
62 |
|
|
* 24/12/2000 - removed LVM_TO_{CORE,DISK}*, use cpu_{from, to}_le*
|
63 |
|
|
* instead - Christoph Hellwig
|
64 |
|
|
* 22/01/2001 - Change ulong to uint32_t
|
65 |
|
|
* 14/02/2001 - changed LVM_SNAPSHOT_MIN_CHUNK to 1 page
|
66 |
|
|
* 20/02/2001 - incremented IOP version to 11 because of incompatible
|
67 |
|
|
* change in VG activation (in order to support devfs better)
|
68 |
|
|
* 01/03/2001 - Revert to IOP10 and add VG_CREATE_OLD call for compatibility
|
69 |
|
|
* 08/03/2001 - new lv_t (in core) version number 5: changed page member
|
70 |
|
|
* to (struct kiobuf *) to use for COW exception table io
|
71 |
|
|
* 26/03/2001 - changed lv_v4 to lv_v5 in structure definition (HM)
|
72 |
|
|
* 21/06/2001 - changed BLOCK_SIZE back to 1024 for non S/390
|
73 |
|
|
* 22/06/2001 - added Andreas Dilger's PE on 4k boundary alignment enhancements
|
74 |
|
|
* 19/07/2001 - added rwsem compatibility macros for 2.2 kernels
|
75 |
|
|
* 13/11/2001 - reduced userspace inclusion of kernel headers to a minimum
|
76 |
|
|
*
|
77 |
|
|
*/
|
78 |
|
|
|
79 |
|
|
|
80 |
|
|
#ifndef _LVM_H_INCLUDE
|
81 |
|
|
#define _LVM_H_INCLUDE
|
82 |
|
|
|
83 |
|
|
#define LVM_RELEASE_NAME "1.0.8"
|
84 |
|
|
#define LVM_RELEASE_DATE "17/11/2003"
|
85 |
|
|
|
86 |
|
|
#define _LVM_KERNEL_H_VERSION "LVM "LVM_RELEASE_NAME" ("LVM_RELEASE_DATE")"
|
87 |
|
|
|
88 |
|
|
#include <linux/version.h>
|
89 |
|
|
|
90 |
|
|
/*
|
91 |
|
|
* preprocessor definitions
|
92 |
|
|
*/
|
93 |
|
|
/* if you like emergency reset code in the driver */
|
94 |
|
|
#define LVM_TOTAL_RESET
|
95 |
|
|
|
96 |
|
|
#ifdef __KERNEL__
|
97 |
|
|
#undef LVM_HD_NAME /* display nice names in /proc/partitions */
|
98 |
|
|
|
99 |
|
|
/* lots of debugging output (see driver source)
|
100 |
|
|
#define DEBUG_LVM_GET_INFO
|
101 |
|
|
#define DEBUG
|
102 |
|
|
#define DEBUG_MAP
|
103 |
|
|
#define DEBUG_MAP_SIZE
|
104 |
|
|
#define DEBUG_IOCTL
|
105 |
|
|
#define DEBUG_READ
|
106 |
|
|
#define DEBUG_GENDISK
|
107 |
|
|
#define DEBUG_VG_CREATE
|
108 |
|
|
#define DEBUG_DEVICE
|
109 |
|
|
#define DEBUG_KFREE
|
110 |
|
|
*/
|
111 |
|
|
|
112 |
|
|
#include <linux/kdev_t.h>
|
113 |
|
|
#include <linux/list.h>
|
114 |
|
|
#include <asm/types.h>
|
115 |
|
|
#include <linux/major.h>
|
116 |
|
|
#else
|
117 |
|
|
/* This prevents the need to include <linux/list.h> which
|
118 |
|
|
causes problems on some platforms. It's not nice but then
|
119 |
|
|
neither is the alternative. */
|
120 |
|
|
struct list_head {
|
121 |
|
|
struct list_head *next, *prev;
|
122 |
|
|
};
|
123 |
|
|
#define __KERNEL__
|
124 |
|
|
#include <linux/kdev_t.h>
|
125 |
|
|
#undef __KERNEL__
|
126 |
|
|
#endif /* #ifndef __KERNEL__ */
|
127 |
|
|
|
128 |
|
|
|
129 |
|
|
#ifdef __KERNEL__
|
130 |
|
|
#include <linux/spinlock.h>
|
131 |
|
|
|
132 |
|
|
#include <asm/semaphore.h>
|
133 |
|
|
#endif /* #ifdef __KERNEL__ */
|
134 |
|
|
|
135 |
|
|
|
136 |
|
|
#include <asm/page.h>
|
137 |
|
|
|
138 |
|
|
#if !defined ( LVM_BLK_MAJOR) || !defined ( LVM_CHAR_MAJOR)
|
139 |
|
|
#error Bad include/linux/major.h - LVM MAJOR undefined
|
140 |
|
|
#endif
|
141 |
|
|
|
142 |
|
|
#ifdef BLOCK_SIZE
|
143 |
|
|
#undef BLOCK_SIZE
|
144 |
|
|
#endif
|
145 |
|
|
|
146 |
|
|
#ifdef CONFIG_ARCH_S390
|
147 |
|
|
#define BLOCK_SIZE 4096
|
148 |
|
|
#else
|
149 |
|
|
#define BLOCK_SIZE 1024
|
150 |
|
|
#endif
|
151 |
|
|
|
152 |
|
|
#ifndef SECTOR_SIZE
|
153 |
|
|
#define SECTOR_SIZE 512
|
154 |
|
|
#endif
|
155 |
|
|
|
156 |
|
|
/* structure version */
|
157 |
|
|
#define LVM_STRUCT_VERSION 1
|
158 |
|
|
|
159 |
|
|
#define LVM_DIR_PREFIX "/dev/"
|
160 |
|
|
|
161 |
|
|
/*
|
162 |
|
|
* i/o protocol version
|
163 |
|
|
*
|
164 |
|
|
* defined here for the driver and defined seperate in the
|
165 |
|
|
* user land tools/lib/liblvm.h
|
166 |
|
|
*
|
167 |
|
|
*/
|
168 |
|
|
#define LVM_DRIVER_IOP_VERSION 10
|
169 |
|
|
|
170 |
|
|
#define LVM_NAME "lvm"
|
171 |
|
|
#define LVM_GLOBAL "global"
|
172 |
|
|
#define LVM_DIR "lvm"
|
173 |
|
|
#define LVM_VG_SUBDIR "VGs"
|
174 |
|
|
#define LVM_LV_SUBDIR "LVs"
|
175 |
|
|
#define LVM_PV_SUBDIR "PVs"
|
176 |
|
|
|
177 |
|
|
/*
|
178 |
|
|
* VG/LV indexing macros
|
179 |
|
|
*/
|
180 |
|
|
/* character minor maps directly to volume group */
|
181 |
|
|
#define VG_CHR(a) ( a)
|
182 |
|
|
|
183 |
|
|
/* block minor indexes into a volume group/logical volume indirection table */
|
184 |
|
|
#define VG_BLK(a) ( vg_lv_map[a].vg_number)
|
185 |
|
|
#define LV_BLK(a) ( vg_lv_map[a].lv_number)
|
186 |
|
|
|
187 |
|
|
/*
|
188 |
|
|
* absolute limits for VGs, PVs per VG and LVs per VG
|
189 |
|
|
*/
|
190 |
|
|
#define ABS_MAX_VG 99
|
191 |
|
|
#define ABS_MAX_PV 256
|
192 |
|
|
#define ABS_MAX_LV 256 /* caused by 8 bit minor */
|
193 |
|
|
|
194 |
|
|
#define MAX_VG ABS_MAX_VG
|
195 |
|
|
#define MAX_LV ABS_MAX_LV
|
196 |
|
|
#define MAX_PV ABS_MAX_PV
|
197 |
|
|
|
198 |
|
|
#if ( MAX_VG > ABS_MAX_VG)
|
199 |
|
|
#undef MAX_VG
|
200 |
|
|
#define MAX_VG ABS_MAX_VG
|
201 |
|
|
#endif
|
202 |
|
|
|
203 |
|
|
#if ( MAX_LV > ABS_MAX_LV)
|
204 |
|
|
#undef MAX_LV
|
205 |
|
|
#define MAX_LV ABS_MAX_LV
|
206 |
|
|
#endif
|
207 |
|
|
|
208 |
|
|
|
209 |
|
|
/*
|
210 |
|
|
* VGDA: default disk spaces and offsets
|
211 |
|
|
*
|
212 |
|
|
* there's space after the structures for later extensions.
|
213 |
|
|
*
|
214 |
|
|
* offset what size
|
215 |
|
|
* --------------- ---------------------------------- ------------
|
216 |
|
|
* 0 physical volume structure ~500 byte
|
217 |
|
|
*
|
218 |
|
|
* 1K volume group structure ~200 byte
|
219 |
|
|
*
|
220 |
|
|
* 6K namelist of physical volumes 128 byte each
|
221 |
|
|
*
|
222 |
|
|
* 6k + n * ~300byte n logical volume structures ~300 byte each
|
223 |
|
|
*
|
224 |
|
|
* + m * 4byte m physical extent alloc. structs 4 byte each
|
225 |
|
|
*
|
226 |
|
|
* End of disk - first physical extent typically 4 megabyte
|
227 |
|
|
* PE total *
|
228 |
|
|
* PE size
|
229 |
|
|
*
|
230 |
|
|
*
|
231 |
|
|
*/
|
232 |
|
|
|
233 |
|
|
/* DONT TOUCH THESE !!! */
|
234 |
|
|
|
235 |
|
|
|
236 |
|
|
|
237 |
|
|
|
238 |
|
|
|
239 |
|
|
|
240 |
|
|
|
241 |
|
|
/*
|
242 |
|
|
* LVM_PE_T_MAX corresponds to:
|
243 |
|
|
*
|
244 |
|
|
* 8KB PE size can map a ~512 MB logical volume at the cost of 1MB memory,
|
245 |
|
|
*
|
246 |
|
|
* 128MB PE size can map a 8TB logical volume at the same cost of memory.
|
247 |
|
|
*
|
248 |
|
|
* Default PE size of 4 MB gives a maximum logical volume size of 256 GB.
|
249 |
|
|
*
|
250 |
|
|
* Maximum PE size of 16GB gives a maximum logical volume size of 1024 TB.
|
251 |
|
|
*
|
252 |
|
|
* AFAIK, the actual kernels limit this to 1 TB.
|
253 |
|
|
*
|
254 |
|
|
* Should be a sufficient spectrum ;*)
|
255 |
|
|
*/
|
256 |
|
|
|
257 |
|
|
/* This is the usable size of pe_disk_t.le_num !!! v v */
|
258 |
|
|
#define LVM_PE_T_MAX ( ( 1 << ( sizeof ( uint16_t) * 8)) - 2)
|
259 |
|
|
|
260 |
|
|
#define LVM_LV_SIZE_MAX(a) ( ( long long) LVM_PE_T_MAX * (a)->pe_size > ( long long) 1024*1024/SECTOR_SIZE*1024*1024 ? ( long long) 1024*1024/SECTOR_SIZE*1024*1024 : ( long long) LVM_PE_T_MAX * (a)->pe_size)
|
261 |
|
|
#define LVM_MIN_PE_SIZE ( 8192L / SECTOR_SIZE) /* 8 KB in sectors */
|
262 |
|
|
#define LVM_MAX_PE_SIZE ( 16L * 1024L * 1024L / SECTOR_SIZE * 1024) /* 16GB in sectors */
|
263 |
|
|
#define LVM_DEFAULT_PE_SIZE ( 32768L * 1024 / SECTOR_SIZE) /* 32 MB in sectors */
|
264 |
|
|
#define LVM_DEFAULT_STRIPE_SIZE 16L /* 16 KB */
|
265 |
|
|
#define LVM_MIN_STRIPE_SIZE ( PAGE_SIZE/SECTOR_SIZE) /* PAGESIZE in sectors */
|
266 |
|
|
#define LVM_MAX_STRIPE_SIZE ( 512L * 1024 / SECTOR_SIZE) /* 512 KB in sectors */
|
267 |
|
|
#define LVM_MAX_STRIPES 128 /* max # of stripes */
|
268 |
|
|
#define LVM_MAX_SIZE ( 1024LU * 1024 / SECTOR_SIZE * 1024 * 1024) /* 1TB[sectors] */
|
269 |
|
|
#define LVM_MAX_MIRRORS 2 /* future use */
|
270 |
|
|
#define LVM_MIN_READ_AHEAD 0 /* minimum read ahead sectors */
|
271 |
|
|
#define LVM_DEFAULT_READ_AHEAD 1024 /* sectors for 512k scsi segments */
|
272 |
|
|
#define LVM_MAX_READ_AHEAD 1024 /* maximum read ahead sectors */
|
273 |
|
|
#define LVM_MAX_LV_IO_TIMEOUT 60 /* seconds I/O timeout (future use) */
|
274 |
|
|
#define LVM_PARTITION 0xfe /* LVM partition id */
|
275 |
|
|
#define LVM_NEW_PARTITION 0x8e /* new LVM partition id (10/09/1999) */
|
276 |
|
|
#define LVM_PE_SIZE_PV_SIZE_REL 5 /* max relation PV size and PE size */
|
277 |
|
|
|
278 |
|
|
#define LVM_SNAPSHOT_MAX_CHUNK 1024 /* 1024 KB */
|
279 |
|
|
#define LVM_SNAPSHOT_DEF_CHUNK 64 /* 64 KB */
|
280 |
|
|
#define LVM_SNAPSHOT_MIN_CHUNK (PAGE_SIZE/1024) /* 4 or 8 KB */
|
281 |
|
|
|
282 |
|
|
#define UNDEF -1
|
283 |
|
|
|
284 |
|
|
/*
|
285 |
|
|
* ioctls
|
286 |
|
|
* FIXME: the last parameter to _IO{W,R,WR} is a data type. The macro will
|
287 |
|
|
* expand this using sizeof(), so putting "1" there is misleading
|
288 |
|
|
* because sizeof(1) = sizeof(int) = sizeof(2) = 4 on a 32-bit machine!
|
289 |
|
|
*/
|
290 |
|
|
/* volume group */
|
291 |
|
|
#define VG_CREATE_OLD _IOW ( 0xfe, 0x00, 1)
|
292 |
|
|
#define VG_REMOVE _IOW ( 0xfe, 0x01, 1)
|
293 |
|
|
|
294 |
|
|
#define VG_EXTEND _IOW ( 0xfe, 0x03, 1)
|
295 |
|
|
#define VG_REDUCE _IOW ( 0xfe, 0x04, 1)
|
296 |
|
|
|
297 |
|
|
#define VG_STATUS _IOWR ( 0xfe, 0x05, 1)
|
298 |
|
|
#define VG_STATUS_GET_COUNT _IOWR ( 0xfe, 0x06, 1)
|
299 |
|
|
#define VG_STATUS_GET_NAMELIST _IOWR ( 0xfe, 0x07, 1)
|
300 |
|
|
|
301 |
|
|
#define VG_SET_EXTENDABLE _IOW ( 0xfe, 0x08, 1)
|
302 |
|
|
#define VG_RENAME _IOW ( 0xfe, 0x09, 1)
|
303 |
|
|
|
304 |
|
|
/* Since 0.9beta6 */
|
305 |
|
|
#define VG_CREATE _IOW ( 0xfe, 0x0a, 1)
|
306 |
|
|
|
307 |
|
|
/* logical volume */
|
308 |
|
|
#define LV_CREATE _IOW ( 0xfe, 0x20, 1)
|
309 |
|
|
#define LV_REMOVE _IOW ( 0xfe, 0x21, 1)
|
310 |
|
|
|
311 |
|
|
#define LV_ACTIVATE _IO ( 0xfe, 0x22)
|
312 |
|
|
#define LV_DEACTIVATE _IO ( 0xfe, 0x23)
|
313 |
|
|
|
314 |
|
|
#define LV_EXTEND _IOW ( 0xfe, 0x24, 1)
|
315 |
|
|
#define LV_REDUCE _IOW ( 0xfe, 0x25, 1)
|
316 |
|
|
|
317 |
|
|
#define LV_STATUS_BYNAME _IOWR ( 0xfe, 0x26, 1)
|
318 |
|
|
#define LV_STATUS_BYINDEX _IOWR ( 0xfe, 0x27, 1)
|
319 |
|
|
|
320 |
|
|
#define LV_SET_ACCESS _IOW ( 0xfe, 0x28, 1)
|
321 |
|
|
#define LV_SET_ALLOCATION _IOW ( 0xfe, 0x29, 1)
|
322 |
|
|
#define LV_SET_STATUS _IOW ( 0xfe, 0x2a, 1)
|
323 |
|
|
|
324 |
|
|
#define LE_REMAP _IOW ( 0xfe, 0x2b, 1)
|
325 |
|
|
|
326 |
|
|
#define LV_SNAPSHOT_USE_RATE _IOWR ( 0xfe, 0x2c, 1)
|
327 |
|
|
|
328 |
|
|
#define LV_STATUS_BYDEV _IOWR ( 0xfe, 0x2e, 1)
|
329 |
|
|
|
330 |
|
|
#define LV_RENAME _IOW ( 0xfe, 0x2f, 1)
|
331 |
|
|
|
332 |
|
|
#define LV_BMAP _IOWR ( 0xfe, 0x30, 1)
|
333 |
|
|
|
334 |
|
|
|
335 |
|
|
/* physical volume */
|
336 |
|
|
#define PV_STATUS _IOWR ( 0xfe, 0x40, 1)
|
337 |
|
|
#define PV_CHANGE _IOWR ( 0xfe, 0x41, 1)
|
338 |
|
|
#define PV_FLUSH _IOW ( 0xfe, 0x42, 1)
|
339 |
|
|
|
340 |
|
|
/* physical extent */
|
341 |
|
|
#define PE_LOCK_UNLOCK _IOW ( 0xfe, 0x50, 1)
|
342 |
|
|
|
343 |
|
|
/* i/o protocol version */
|
344 |
|
|
#define LVM_GET_IOP_VERSION _IOR ( 0xfe, 0x98, 1)
|
345 |
|
|
|
346 |
|
|
#ifdef LVM_TOTAL_RESET
|
347 |
|
|
/* special reset function for testing purposes */
|
348 |
|
|
#define LVM_RESET _IO ( 0xfe, 0x99)
|
349 |
|
|
#endif
|
350 |
|
|
|
351 |
|
|
/* lock the logical volume manager */
|
352 |
|
|
#if LVM_DRIVER_IOP_VERSION > 11
|
353 |
|
|
#define LVM_LOCK_LVM _IO ( 0xfe, 0x9A)
|
354 |
|
|
#else
|
355 |
|
|
/* This is actually the same as _IO ( 0xff, 0x00), oops. Remove for IOP 12+ */
|
356 |
|
|
#define LVM_LOCK_LVM _IO ( 0xfe, 0x100)
|
357 |
|
|
#endif
|
358 |
|
|
/* END ioctls */
|
359 |
|
|
|
360 |
|
|
|
361 |
|
|
/*
|
362 |
|
|
* Status flags
|
363 |
|
|
*/
|
364 |
|
|
/* volume group */
|
365 |
|
|
#define VG_ACTIVE 0x01 /* vg_status */
|
366 |
|
|
#define VG_EXPORTED 0x02 /* " */
|
367 |
|
|
#define VG_EXTENDABLE 0x04 /* " */
|
368 |
|
|
|
369 |
|
|
#define VG_READ 0x01 /* vg_access */
|
370 |
|
|
#define VG_WRITE 0x02 /* " */
|
371 |
|
|
#define VG_CLUSTERED 0x04 /* " */
|
372 |
|
|
#define VG_SHARED 0x08 /* " */
|
373 |
|
|
|
374 |
|
|
/* logical volume */
|
375 |
|
|
#define LV_ACTIVE 0x01 /* lv_status */
|
376 |
|
|
#define LV_SPINDOWN 0x02 /* " */
|
377 |
|
|
|
378 |
|
|
#define LV_READ 0x01 /* lv_access */
|
379 |
|
|
#define LV_WRITE 0x02 /* " */
|
380 |
|
|
#define LV_SNAPSHOT 0x04 /* " */
|
381 |
|
|
#define LV_SNAPSHOT_ORG 0x08 /* " */
|
382 |
|
|
|
383 |
|
|
#define LV_BADBLOCK_ON 0x01 /* lv_badblock */
|
384 |
|
|
|
385 |
|
|
#define LV_STRICT 0x01 /* lv_allocation */
|
386 |
|
|
#define LV_CONTIGUOUS 0x02 /* " */
|
387 |
|
|
|
388 |
|
|
/* physical volume */
|
389 |
|
|
#define PV_ACTIVE 0x01 /* pv_status */
|
390 |
|
|
#define PV_ALLOCATABLE 0x02 /* pv_allocatable */
|
391 |
|
|
|
392 |
|
|
|
393 |
|
|
/* misc */
|
394 |
|
|
#define LVM_SNAPSHOT_DROPPED_SECTOR 1
|
395 |
|
|
|
396 |
|
|
/*
|
397 |
|
|
* Structure definitions core/disk follow
|
398 |
|
|
*
|
399 |
|
|
* conditional conversion takes place on big endian architectures
|
400 |
|
|
* in functions * pv_copy_*(), vg_copy_*() and lv_copy_*()
|
401 |
|
|
*
|
402 |
|
|
*/
|
403 |
|
|
|
404 |
|
|
#define NAME_LEN 128 /* don't change!!! */
|
405 |
|
|
#define UUID_LEN 32 /* don't change!!! */
|
406 |
|
|
|
407 |
|
|
/* copy on write tables in disk format */
|
408 |
|
|
typedef struct lv_COW_table_disk_v1 {
|
409 |
|
|
uint64_t pv_org_number;
|
410 |
|
|
uint64_t pv_org_rsector;
|
411 |
|
|
uint64_t pv_snap_number;
|
412 |
|
|
uint64_t pv_snap_rsector;
|
413 |
|
|
} lv_COW_table_disk_t;
|
414 |
|
|
|
415 |
|
|
/* remap physical sector/rdev pairs including hash */
|
416 |
|
|
typedef struct lv_block_exception_v1 {
|
417 |
|
|
struct list_head hash;
|
418 |
|
|
uint32_t rsector_org;
|
419 |
|
|
kdev_t rdev_org;
|
420 |
|
|
uint32_t rsector_new;
|
421 |
|
|
kdev_t rdev_new;
|
422 |
|
|
} lv_block_exception_t;
|
423 |
|
|
|
424 |
|
|
/* disk stored pe information */
|
425 |
|
|
typedef struct {
|
426 |
|
|
uint16_t lv_num;
|
427 |
|
|
uint16_t le_num;
|
428 |
|
|
} pe_disk_t;
|
429 |
|
|
|
430 |
|
|
/* disk stored PV, VG, LV and PE size and offset information */
|
431 |
|
|
typedef struct {
|
432 |
|
|
uint32_t base;
|
433 |
|
|
uint32_t size;
|
434 |
|
|
} lvm_disk_data_t;
|
435 |
|
|
|
436 |
|
|
|
437 |
|
|
/*
|
438 |
|
|
* physical volume structures
|
439 |
|
|
*/
|
440 |
|
|
|
441 |
|
|
/* core */
|
442 |
|
|
typedef struct pv_v2 {
|
443 |
|
|
char id[2]; /* Identifier */
|
444 |
|
|
unsigned short version; /* HM lvm version */
|
445 |
|
|
lvm_disk_data_t pv_on_disk;
|
446 |
|
|
lvm_disk_data_t vg_on_disk;
|
447 |
|
|
lvm_disk_data_t pv_uuidlist_on_disk;
|
448 |
|
|
lvm_disk_data_t lv_on_disk;
|
449 |
|
|
lvm_disk_data_t pe_on_disk;
|
450 |
|
|
char pv_name[NAME_LEN];
|
451 |
|
|
char vg_name[NAME_LEN];
|
452 |
|
|
char system_id[NAME_LEN]; /* for vgexport/vgimport */
|
453 |
|
|
kdev_t pv_dev;
|
454 |
|
|
uint pv_number;
|
455 |
|
|
uint pv_status;
|
456 |
|
|
uint pv_allocatable;
|
457 |
|
|
uint pv_size; /* HM */
|
458 |
|
|
uint lv_cur;
|
459 |
|
|
uint pe_size;
|
460 |
|
|
uint pe_total;
|
461 |
|
|
uint pe_allocated;
|
462 |
|
|
uint pe_stale; /* for future use */
|
463 |
|
|
pe_disk_t *pe; /* HM */
|
464 |
|
|
struct block_device *bd;
|
465 |
|
|
char pv_uuid[UUID_LEN + 1];
|
466 |
|
|
|
467 |
|
|
#ifndef __KERNEL__
|
468 |
|
|
uint32_t pe_start; /* in sectors */
|
469 |
|
|
#endif
|
470 |
|
|
} pv_t;
|
471 |
|
|
|
472 |
|
|
|
473 |
|
|
/* disk */
|
474 |
|
|
typedef struct pv_disk_v2 {
|
475 |
|
|
uint8_t id[2]; /* Identifier */
|
476 |
|
|
uint16_t version; /* HM lvm version */
|
477 |
|
|
lvm_disk_data_t pv_on_disk;
|
478 |
|
|
lvm_disk_data_t vg_on_disk;
|
479 |
|
|
lvm_disk_data_t pv_uuidlist_on_disk;
|
480 |
|
|
lvm_disk_data_t lv_on_disk;
|
481 |
|
|
lvm_disk_data_t pe_on_disk;
|
482 |
|
|
uint8_t pv_uuid[NAME_LEN];
|
483 |
|
|
uint8_t vg_name[NAME_LEN];
|
484 |
|
|
uint8_t system_id[NAME_LEN]; /* for vgexport/vgimport */
|
485 |
|
|
uint32_t pv_major;
|
486 |
|
|
uint32_t pv_number;
|
487 |
|
|
uint32_t pv_status;
|
488 |
|
|
uint32_t pv_allocatable;
|
489 |
|
|
uint32_t pv_size; /* HM */
|
490 |
|
|
uint32_t lv_cur;
|
491 |
|
|
uint32_t pe_size;
|
492 |
|
|
uint32_t pe_total;
|
493 |
|
|
uint32_t pe_allocated;
|
494 |
|
|
|
495 |
|
|
/* new in struct version 2 */
|
496 |
|
|
uint32_t pe_start; /* in sectors */
|
497 |
|
|
|
498 |
|
|
} pv_disk_t;
|
499 |
|
|
|
500 |
|
|
|
501 |
|
|
/*
|
502 |
|
|
* Structures for Logical Volume (LV)
|
503 |
|
|
*/
|
504 |
|
|
|
505 |
|
|
/* core PE information */
|
506 |
|
|
typedef struct {
|
507 |
|
|
kdev_t dev;
|
508 |
|
|
uint32_t pe; /* to be changed if > 2TB */
|
509 |
|
|
uint32_t reads;
|
510 |
|
|
uint32_t writes;
|
511 |
|
|
} pe_t;
|
512 |
|
|
|
513 |
|
|
typedef struct {
|
514 |
|
|
char lv_name[NAME_LEN];
|
515 |
|
|
kdev_t old_dev;
|
516 |
|
|
kdev_t new_dev;
|
517 |
|
|
uint32_t old_pe;
|
518 |
|
|
uint32_t new_pe;
|
519 |
|
|
} le_remap_req_t;
|
520 |
|
|
|
521 |
|
|
typedef struct lv_bmap {
|
522 |
|
|
uint32_t lv_block;
|
523 |
|
|
dev_t lv_dev;
|
524 |
|
|
} lv_bmap_t;
|
525 |
|
|
|
526 |
|
|
/*
|
527 |
|
|
* Structure Logical Volume (LV) Version 3
|
528 |
|
|
*/
|
529 |
|
|
|
530 |
|
|
/* core */
|
531 |
|
|
typedef struct lv_v5 {
|
532 |
|
|
char lv_name[NAME_LEN];
|
533 |
|
|
char vg_name[NAME_LEN];
|
534 |
|
|
uint lv_access;
|
535 |
|
|
uint lv_status;
|
536 |
|
|
uint lv_open; /* HM */
|
537 |
|
|
kdev_t lv_dev; /* HM */
|
538 |
|
|
uint lv_number; /* HM */
|
539 |
|
|
uint lv_mirror_copies; /* for future use */
|
540 |
|
|
uint lv_recovery; /* " */
|
541 |
|
|
uint lv_schedule; /* " */
|
542 |
|
|
uint lv_size;
|
543 |
|
|
pe_t *lv_current_pe; /* HM */
|
544 |
|
|
uint lv_current_le; /* for future use */
|
545 |
|
|
uint lv_allocated_le;
|
546 |
|
|
uint lv_stripes;
|
547 |
|
|
uint lv_stripesize;
|
548 |
|
|
uint lv_badblock; /* for future use */
|
549 |
|
|
uint lv_allocation;
|
550 |
|
|
uint lv_io_timeout; /* for future use */
|
551 |
|
|
uint lv_read_ahead;
|
552 |
|
|
|
553 |
|
|
/* delta to version 1 starts here */
|
554 |
|
|
struct lv_v5 *lv_snapshot_org;
|
555 |
|
|
struct lv_v5 *lv_snapshot_prev;
|
556 |
|
|
struct lv_v5 *lv_snapshot_next;
|
557 |
|
|
lv_block_exception_t *lv_block_exception;
|
558 |
|
|
uint lv_remap_ptr;
|
559 |
|
|
uint lv_remap_end;
|
560 |
|
|
uint lv_chunk_size;
|
561 |
|
|
uint lv_snapshot_minor;
|
562 |
|
|
#ifdef __KERNEL__
|
563 |
|
|
struct kiobuf *lv_iobuf;
|
564 |
|
|
struct kiobuf *lv_COW_table_iobuf;
|
565 |
|
|
struct rw_semaphore lv_lock;
|
566 |
|
|
struct list_head *lv_snapshot_hash_table;
|
567 |
|
|
uint32_t lv_snapshot_hash_table_size;
|
568 |
|
|
uint32_t lv_snapshot_hash_mask;
|
569 |
|
|
wait_queue_head_t lv_snapshot_wait;
|
570 |
|
|
int lv_snapshot_use_rate;
|
571 |
|
|
struct vg_v3 *vg;
|
572 |
|
|
|
573 |
|
|
uint lv_allocated_snapshot_le;
|
574 |
|
|
#else
|
575 |
|
|
char dummy[200];
|
576 |
|
|
#endif
|
577 |
|
|
} lv_t;
|
578 |
|
|
|
579 |
|
|
/* disk */
|
580 |
|
|
typedef struct lv_disk_v3 {
|
581 |
|
|
uint8_t lv_name[NAME_LEN];
|
582 |
|
|
uint8_t vg_name[NAME_LEN];
|
583 |
|
|
uint32_t lv_access;
|
584 |
|
|
uint32_t lv_status;
|
585 |
|
|
uint32_t lv_open; /* HM */
|
586 |
|
|
uint32_t lv_dev; /* HM */
|
587 |
|
|
uint32_t lv_number; /* HM */
|
588 |
|
|
uint32_t lv_mirror_copies; /* for future use */
|
589 |
|
|
uint32_t lv_recovery; /* " */
|
590 |
|
|
uint32_t lv_schedule; /* " */
|
591 |
|
|
uint32_t lv_size;
|
592 |
|
|
uint32_t lv_snapshot_minor; /* minor number of original */
|
593 |
|
|
uint16_t lv_chunk_size; /* chunk size of snapshot */
|
594 |
|
|
uint16_t dummy;
|
595 |
|
|
uint32_t lv_allocated_le;
|
596 |
|
|
uint32_t lv_stripes;
|
597 |
|
|
uint32_t lv_stripesize;
|
598 |
|
|
uint32_t lv_badblock; /* for future use */
|
599 |
|
|
uint32_t lv_allocation;
|
600 |
|
|
uint32_t lv_io_timeout; /* for future use */
|
601 |
|
|
uint32_t lv_read_ahead; /* HM */
|
602 |
|
|
} lv_disk_t;
|
603 |
|
|
|
604 |
|
|
/*
|
605 |
|
|
* Structure Volume Group (VG) Version 1
|
606 |
|
|
*/
|
607 |
|
|
|
608 |
|
|
/* core */
|
609 |
|
|
typedef struct vg_v3 {
|
610 |
|
|
char vg_name[NAME_LEN]; /* volume group name */
|
611 |
|
|
uint vg_number; /* volume group number */
|
612 |
|
|
uint vg_access; /* read/write */
|
613 |
|
|
uint vg_status; /* active or not */
|
614 |
|
|
uint lv_max; /* maximum logical volumes */
|
615 |
|
|
uint lv_cur; /* current logical volumes */
|
616 |
|
|
uint lv_open; /* open logical volumes */
|
617 |
|
|
uint pv_max; /* maximum physical volumes */
|
618 |
|
|
uint pv_cur; /* current physical volumes FU */
|
619 |
|
|
uint pv_act; /* active physical volumes */
|
620 |
|
|
uint dummy; /* was obsolete max_pe_per_pv */
|
621 |
|
|
uint vgda; /* volume group descriptor arrays FU */
|
622 |
|
|
uint pe_size; /* physical extent size in sectors */
|
623 |
|
|
uint pe_total; /* total of physical extents */
|
624 |
|
|
uint pe_allocated; /* allocated physical extents */
|
625 |
|
|
uint pvg_total; /* physical volume groups FU */
|
626 |
|
|
struct proc_dir_entry *proc;
|
627 |
|
|
pv_t *pv[ABS_MAX_PV + 1]; /* physical volume struct pointers */
|
628 |
|
|
lv_t *lv[ABS_MAX_LV + 1]; /* logical volume struct pointers */
|
629 |
|
|
char vg_uuid[UUID_LEN + 1]; /* volume group UUID */
|
630 |
|
|
#ifdef __KERNEL__
|
631 |
|
|
struct proc_dir_entry *vg_dir_pde;
|
632 |
|
|
struct proc_dir_entry *lv_subdir_pde;
|
633 |
|
|
struct proc_dir_entry *pv_subdir_pde;
|
634 |
|
|
#else
|
635 |
|
|
char dummy1[200];
|
636 |
|
|
#endif
|
637 |
|
|
} vg_t;
|
638 |
|
|
|
639 |
|
|
|
640 |
|
|
/* disk */
|
641 |
|
|
typedef struct vg_disk_v2 {
|
642 |
|
|
uint8_t vg_uuid[UUID_LEN]; /* volume group UUID */
|
643 |
|
|
uint8_t vg_name_dummy[NAME_LEN - UUID_LEN]; /* rest of v1 VG name */
|
644 |
|
|
uint32_t vg_number; /* volume group number */
|
645 |
|
|
uint32_t vg_access; /* read/write */
|
646 |
|
|
uint32_t vg_status; /* active or not */
|
647 |
|
|
uint32_t lv_max; /* maximum logical volumes */
|
648 |
|
|
uint32_t lv_cur; /* current logical volumes */
|
649 |
|
|
uint32_t lv_open; /* open logical volumes */
|
650 |
|
|
uint32_t pv_max; /* maximum physical volumes */
|
651 |
|
|
uint32_t pv_cur; /* current physical volumes FU */
|
652 |
|
|
uint32_t pv_act; /* active physical volumes */
|
653 |
|
|
uint32_t dummy;
|
654 |
|
|
uint32_t vgda; /* volume group descriptor arrays FU */
|
655 |
|
|
uint32_t pe_size; /* physical extent size in sectors */
|
656 |
|
|
uint32_t pe_total; /* total of physical extents */
|
657 |
|
|
uint32_t pe_allocated; /* allocated physical extents */
|
658 |
|
|
uint32_t pvg_total; /* physical volume groups FU */
|
659 |
|
|
} vg_disk_t;
|
660 |
|
|
|
661 |
|
|
|
662 |
|
|
/*
|
663 |
|
|
* Request structures for ioctls
|
664 |
|
|
*/
|
665 |
|
|
|
666 |
|
|
/* Request structure PV_STATUS_BY_NAME... */
|
667 |
|
|
typedef struct {
|
668 |
|
|
char pv_name[NAME_LEN];
|
669 |
|
|
pv_t *pv;
|
670 |
|
|
} pv_status_req_t, pv_change_req_t;
|
671 |
|
|
|
672 |
|
|
/* Request structure PV_FLUSH */
|
673 |
|
|
typedef struct {
|
674 |
|
|
char pv_name[NAME_LEN];
|
675 |
|
|
kdev_t pv_dev;
|
676 |
|
|
} pv_flush_req_t;
|
677 |
|
|
|
678 |
|
|
|
679 |
|
|
/* Request structure PE_MOVE */
|
680 |
|
|
typedef struct {
|
681 |
|
|
enum {
|
682 |
|
|
LOCK_PE, UNLOCK_PE
|
683 |
|
|
} lock;
|
684 |
|
|
struct {
|
685 |
|
|
kdev_t lv_dev;
|
686 |
|
|
kdev_t pv_dev;
|
687 |
|
|
uint32_t pv_offset;
|
688 |
|
|
} data;
|
689 |
|
|
} pe_lock_req_t;
|
690 |
|
|
|
691 |
|
|
|
692 |
|
|
/* Request structure LV_STATUS_BYNAME */
|
693 |
|
|
typedef struct {
|
694 |
|
|
char lv_name[NAME_LEN];
|
695 |
|
|
lv_t *lv;
|
696 |
|
|
} lv_status_byname_req_t, lv_req_t;
|
697 |
|
|
|
698 |
|
|
/* Request structure LV_STATUS_BYINDEX */
|
699 |
|
|
typedef struct {
|
700 |
|
|
uint32_t lv_index;
|
701 |
|
|
lv_t *lv;
|
702 |
|
|
/* Transfer size because user space and kernel space differ */
|
703 |
|
|
ushort size;
|
704 |
|
|
} lv_status_byindex_req_t;
|
705 |
|
|
|
706 |
|
|
/* Request structure LV_STATUS_BYDEV... */
|
707 |
|
|
typedef struct {
|
708 |
|
|
dev_t dev;
|
709 |
|
|
lv_t *lv;
|
710 |
|
|
} lv_status_bydev_req_t;
|
711 |
|
|
|
712 |
|
|
|
713 |
|
|
/* Request structure LV_SNAPSHOT_USE_RATE */
|
714 |
|
|
typedef struct {
|
715 |
|
|
int block;
|
716 |
|
|
int rate;
|
717 |
|
|
} lv_snapshot_use_rate_req_t;
|
718 |
|
|
|
719 |
|
|
|
720 |
|
|
|
721 |
|
|
/* useful inlines */
|
722 |
|
|
static inline ulong round_up(ulong n, ulong size)
|
723 |
|
|
{
|
724 |
|
|
size--;
|
725 |
|
|
return (n + size) & ~size;
|
726 |
|
|
}
|
727 |
|
|
|
728 |
|
|
static inline ulong div_up(ulong n, ulong size)
|
729 |
|
|
{
|
730 |
|
|
return round_up(n, size) / size;
|
731 |
|
|
}
|
732 |
|
|
|
733 |
|
|
/* FIXME: nasty capital letters */
|
734 |
|
|
static int inline LVM_GET_COW_TABLE_CHUNKS_PER_PE(vg_t * vg, lv_t * lv)
|
735 |
|
|
{
|
736 |
|
|
return vg->pe_size / lv->lv_chunk_size;
|
737 |
|
|
}
|
738 |
|
|
|
739 |
|
|
static int inline LVM_GET_COW_TABLE_ENTRIES_PER_PE(vg_t * vg, lv_t * lv)
|
740 |
|
|
{
|
741 |
|
|
ulong chunks = vg->pe_size / lv->lv_chunk_size;
|
742 |
|
|
ulong entry_size = sizeof(lv_COW_table_disk_t);
|
743 |
|
|
ulong chunk_size = lv->lv_chunk_size * SECTOR_SIZE;
|
744 |
|
|
ulong entries = (vg->pe_size * SECTOR_SIZE) /
|
745 |
|
|
(entry_size + chunk_size);
|
746 |
|
|
|
747 |
|
|
if (chunks < 2)
|
748 |
|
|
return 0;
|
749 |
|
|
|
750 |
|
|
for (; entries; entries--)
|
751 |
|
|
if ((div_up(entries * entry_size, chunk_size) + entries) <=
|
752 |
|
|
chunks)
|
753 |
|
|
break;
|
754 |
|
|
|
755 |
|
|
return entries;
|
756 |
|
|
}
|
757 |
|
|
|
758 |
|
|
|
759 |
|
|
#endif /* #ifndef _LVM_H_INCLUDE */
|