1 /*
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 */
round_up(ulong n,ulong size)722 static inline ulong round_up(ulong n, ulong size)
723 {
724 	size--;
725 	return (n + size) & ~size;
726 }
727 
div_up(ulong n,ulong size)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 */
LVM_GET_COW_TABLE_CHUNKS_PER_PE(vg_t * vg,lv_t * lv)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 
LVM_GET_COW_TABLE_ENTRIES_PER_PE(vg_t * vg,lv_t * lv)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 */
760