📄 lvm.h
字号:
/* * include/linux/lvm.h * kernel/lvm.h * tools/lib/lvm.h * * Copyright (C) 1997 - 2001 Heinz Mauelshagen, Sistina Software * * February-November 1997 * May-July 1998 * January-March,July,September,October,Dezember 1999 * January,February,July,November 2000 * January-March,June,July 2001 * * lvm is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * lvm is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GNU CC; see the file COPYING. If not, write to * the Free Software Foundation, 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * *//* * Changelog * * 10/10/1997 - beginning of new structure creation * 12/05/1998 - incorporated structures from lvm_v1.h and deleted lvm_v1.h * 07/06/1998 - avoided LVM_KMALLOC_MAX define by using vmalloc/vfree * instead of kmalloc/kfree * 01/07/1998 - fixed wrong LVM_MAX_SIZE * 07/07/1998 - extended pe_t structure by ios member (for statistic) * 02/08/1998 - changes for official char/block major numbers * 07/08/1998 - avoided init_module() and cleanup_module() to be static * 29/08/1998 - seprated core and disk structure type definitions * 01/09/1998 - merged kernel integration version (mike) * 20/01/1999 - added LVM_PE_DISK_OFFSET macro for use in * vg_read_with_pv_and_lv(), pv_move_pe(), pv_show_pe_text()... * 18/02/1999 - added definition of time_disk_t structure for; * keeps time stamps on disk for nonatomic writes (future) * 15/03/1999 - corrected LV() and VG() macro definition to use argument * instead of minor * 03/07/1999 - define for genhd.c name handling * 23/07/1999 - implemented snapshot part * 08/12/1999 - changed LVM_LV_SIZE_MAX macro to reflect current 1TB limit * 01/01/2000 - extended lv_v2 core structure by wait_queue member * 12/02/2000 - integrated Andrea Arcagnelli's snapshot work * 18/02/2000 - seperated user and kernel space parts by * #ifdef them with __KERNEL__ * 08/03/2000 - implemented cluster/shared bits for vg_access * 26/06/2000 - implemented snapshot persistency and resizing support * 02/11/2000 - added hash table size member to lv structure * 12/11/2000 - removed unneeded timestamp definitions * 24/12/2000 - removed LVM_TO_{CORE,DISK}*, use cpu_{from, to}_le* * instead - Christoph Hellwig * 22/01/2001 - Change ulong to uint32_t * 14/02/2001 - changed LVM_SNAPSHOT_MIN_CHUNK to 1 page * 20/02/2001 - incremented IOP version to 11 because of incompatible * change in VG activation (in order to support devfs better) * 01/03/2001 - Revert to IOP10 and add VG_CREATE_OLD call for compatibility * 08/03/2001 - new lv_t (in core) version number 5: changed page member * to (struct kiobuf *) to use for COW exception table io * 26/03/2001 - changed lv_v4 to lv_v5 in structure definition (HM) * 21/06/2001 - changed BLOCK_SIZE back to 1024 for non S/390 * 22/06/2001 - added Andreas Dilger's PE on 4k boundary alignment enhancements * 19/07/2001 - added rwsem compatibility macros for 2.2 kernels * 13/11/2001 - reduced userspace inclusion of kernel headers to a minimum * */#ifndef _LVM_H_INCLUDE#define _LVM_H_INCLUDE#define LVM_RELEASE_NAME "1.0.3"#define LVM_RELEASE_DATE "19/02/2002"#define _LVM_KERNEL_H_VERSION "LVM "LVM_RELEASE_NAME" ("LVM_RELEASE_DATE")"#include <linux/version.h>/* * preprocessor definitions *//* if you like emergency reset code in the driver */#define LVM_TOTAL_RESET#ifdef __KERNEL__#undef LVM_HD_NAME /* display nice names in /proc/partitions *//* lots of debugging output (see driver source) #define DEBUG_LVM_GET_INFO #define DEBUG #define DEBUG_MAP #define DEBUG_MAP_SIZE #define DEBUG_IOCTL #define DEBUG_READ #define DEBUG_GENDISK #define DEBUG_VG_CREATE #define DEBUG_DEVICE #define DEBUG_KFREE */#include <linux/kdev_t.h>#include <linux/list.h>#include <asm/types.h>#include <linux/major.h>#else/* This prevents the need to include <linux/list.h> which causes problems on some platforms. It's not nice but then neither is the alternative. */struct list_head { struct list_head *next, *prev;};#define __KERNEL__#include <linux/kdev_t.h>#undef __KERNEL__#endif /* #ifndef __KERNEL__ */#ifdef __KERNEL__#include <linux/spinlock.h>#include <asm/semaphore.h>#endif /* #ifdef __KERNEL__ */#include <asm/page.h>#if !defined ( LVM_BLK_MAJOR) || !defined ( LVM_CHAR_MAJOR)#error Bad include/linux/major.h - LVM MAJOR undefined#endif#ifdef BLOCK_SIZE#undef BLOCK_SIZE#endif#ifdef CONFIG_ARCH_S390#define BLOCK_SIZE 4096#else#define BLOCK_SIZE 1024#endif#ifndef SECTOR_SIZE#define SECTOR_SIZE 512#endif/* structure version */#define LVM_STRUCT_VERSION 1#define LVM_DIR_PREFIX "/dev/"/* * i/o protocol version * * defined here for the driver and defined seperate in the * user land tools/lib/liblvm.h * */#define LVM_DRIVER_IOP_VERSION 10#define LVM_NAME "lvm"#define LVM_GLOBAL "global"#define LVM_DIR "lvm"#define LVM_VG_SUBDIR "VGs"#define LVM_LV_SUBDIR "LVs"#define LVM_PV_SUBDIR "PVs"/* * VG/LV indexing macros *//* character minor maps directly to volume group */#define VG_CHR(a) ( a)/* block minor indexes into a volume group/logical volume indirection table */#define VG_BLK(a) ( vg_lv_map[a].vg_number)#define LV_BLK(a) ( vg_lv_map[a].lv_number)/* * absolute limits for VGs, PVs per VG and LVs per VG */#define ABS_MAX_VG 99#define ABS_MAX_PV 256#define ABS_MAX_LV 256 /* caused by 8 bit minor */#define MAX_VG ABS_MAX_VG#define MAX_LV ABS_MAX_LV#define MAX_PV ABS_MAX_PV#if ( MAX_VG > ABS_MAX_VG)#undef MAX_VG#define MAX_VG ABS_MAX_VG#endif#if ( MAX_LV > ABS_MAX_LV)#undef MAX_LV#define MAX_LV ABS_MAX_LV#endif/* * VGDA: default disk spaces and offsets * * There's space after the structures for later extensions. * The physical volume structure holds offset and size definitions * for itself (well, kind of redundant ;-) and all other structure{s| arrays}; * * In recent versions since LVM 0.9.1 we align to 4k offsets in order to ease * future kernel reads of the metadata. * * offset what size * --------------- -------------------------------- ------------ * 0 physical volume structure pv->pv_on_disk.size * (~500 byte) * pv->vg_on_disk.base volume group structure pv->vg_on_disk.size * * pv->uuidlist_on_disk.base 128 byte each * uuidlist of physical volumes * holding one uuid per physical volume * * pv->lv_on_disk.base logical volume structures; pv->lv_on_disk.size * one structure per logical volume (~300 byte each) * * pv->pe_on_disk.base physical extent alloc. structs pv->pe_on_disk.size * one strcuture per physical extent (4 byte each) * * End of disk - first physical extent default 4 megabyte * PE total * * PE size * (rounded to 64k offset today) * * pv->pe_on_disk.base + pv->pe_on_disk.size == start of first physical extent * *//* DONT TOUCH THESE !!! *//* * LVM_PE_T_MAX corresponds to: * * 8KB PE size can map a ~512 MB logical volume at the cost of 1MB memory, * * 128MB PE size can map a 8TB logical volume at the same cost of memory. * * Default PE size of 4 MB gives a maximum logical volume size of 256 GB. * * Maximum PE size of 16GB gives a maximum logical volume size of 1024 TB. * * AFAIK, the actual kernels limit this to 2 TB. * * Should be a sufficient spectrum ;*) *//* This is the usable size of pe_disk_t.le_num !!! v v */#define LVM_PE_T_MAX ( ( 1 << ( sizeof ( uint16_t) * 8)) - 2)#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)#define LVM_MIN_PE_SIZE ( 8192L / SECTOR_SIZE) /* 8 KB in sectors */#define LVM_MAX_PE_SIZE ( 16L * 1024L * 1024L / SECTOR_SIZE * 1024) /* 16GB in sectors */#define LVM_DEFAULT_PE_SIZE ( 4096L * 1024 / SECTOR_SIZE) /* 4 MB in sectors */#define LVM_DEFAULT_STRIPE_SIZE 16L /* 16 KB */#define LVM_MIN_STRIPE_SIZE ( PAGE_SIZE/SECTOR_SIZE) /* PAGESIZE in sectors */#define LVM_MAX_STRIPE_SIZE ( 512L * 1024 / SECTOR_SIZE) /* 512 KB in sectors */#define LVM_MAX_STRIPES 128 /* max # of stripes */#define LVM_MAX_SIZE ( 1024LU * 1024 / SECTOR_SIZE * 1024 * 1024) /* 1TB[sectors] */#define LVM_MAX_MIRRORS 2 /* future use */#define LVM_MIN_READ_AHEAD 0 /* minimum read ahead sectors */#define LVM_DEFAULT_READ_AHEAD 1024 /* sectors for 512k scsi segments */#define LVM_MAX_READ_AHEAD 10000 /* maximum read ahead sectors */#define LVM_MAX_LV_IO_TIMEOUT 60 /* seconds I/O timeout (future use) */#define LVM_PARTITION 0xfe /* LVM partition id */#define LVM_NEW_PARTITION 0x8e /* new LVM partition id (10/09/1999) */#define LVM_PE_SIZE_PV_SIZE_REL 5 /* max relation PV size and PE size */#define LVM_SNAPSHOT_MAX_CHUNK 1024 /* 1024 KB */#define LVM_SNAPSHOT_DEF_CHUNK 64 /* 64 KB */#define LVM_SNAPSHOT_MIN_CHUNK (PAGE_SIZE/1024) /* 4 or 8 KB */#define UNDEF -1/* * ioctls * FIXME: the last parameter to _IO{W,R,WR} is a data type. The macro will * expand this using sizeof(), so putting "1" there is misleading * because sizeof(1) = sizeof(int) = sizeof(2) = 4 on a 32-bit machine! *//* volume group */#define VG_CREATE_OLD _IOW ( 0xfe, 0x00, 1)#define VG_REMOVE _IOW ( 0xfe, 0x01, 1)#define VG_EXTEND _IOW ( 0xfe, 0x03, 1)#define VG_REDUCE _IOW ( 0xfe, 0x04, 1)#define VG_STATUS _IOWR ( 0xfe, 0x05, 1)#define VG_STATUS_GET_COUNT _IOWR ( 0xfe, 0x06, 1)#define VG_STATUS_GET_NAMELIST _IOWR ( 0xfe, 0x07, 1)#define VG_SET_EXTENDABLE _IOW ( 0xfe, 0x08, 1)#define VG_RENAME _IOW ( 0xfe, 0x09, 1)/* Since 0.9beta6 */#define VG_CREATE _IOW ( 0xfe, 0x0a, 1)/* logical volume */#define LV_CREATE _IOW ( 0xfe, 0x20, 1)#define LV_REMOVE _IOW ( 0xfe, 0x21, 1)#define LV_ACTIVATE _IO ( 0xfe, 0x22)#define LV_DEACTIVATE _IO ( 0xfe, 0x23)#define LV_EXTEND _IOW ( 0xfe, 0x24, 1)#define LV_REDUCE _IOW ( 0xfe, 0x25, 1)#define LV_STATUS_BYNAME _IOWR ( 0xfe, 0x26, 1)#define LV_STATUS_BYINDEX _IOWR ( 0xfe, 0x27, 1)#define LV_SET_ACCESS _IOW ( 0xfe, 0x28, 1)#define LV_SET_ALLOCATION _IOW ( 0xfe, 0x29, 1)#define LV_SET_STATUS _IOW ( 0xfe, 0x2a, 1)#define LE_REMAP _IOW ( 0xfe, 0x2b, 1)#define LV_SNAPSHOT_USE_RATE _IOWR ( 0xfe, 0x2c, 1)#define LV_STATUS_BYDEV _IOWR ( 0xfe, 0x2e, 1)#define LV_RENAME _IOW ( 0xfe, 0x2f, 1)#define LV_BMAP _IOWR ( 0xfe, 0x30, 1)/* physical volume */#define PV_STATUS _IOWR ( 0xfe, 0x40, 1)#define PV_CHANGE _IOWR ( 0xfe, 0x41, 1)#define PV_FLUSH _IOW ( 0xfe, 0x42, 1)/* physical extent */#define PE_LOCK_UNLOCK _IOW ( 0xfe, 0x50, 1)/* i/o protocol version */#define LVM_GET_IOP_VERSION _IOR ( 0xfe, 0x98, 1)#ifdef LVM_TOTAL_RESET/* special reset function for testing purposes */#define LVM_RESET _IO ( 0xfe, 0x99)#endif/* lock the logical volume manager */#if LVM_DRIVER_IOP_VERSION > 11#define LVM_LOCK_LVM _IO ( 0xfe, 0x9A)#else/* This is actually the same as _IO ( 0xff, 0x00), oops. Remove for IOP 12+ */#define LVM_LOCK_LVM _IO ( 0xfe, 0x100)#endif/* END ioctls *//* * Status flags *//* volume group */#define VG_ACTIVE 0x01 /* vg_status */#define VG_EXPORTED 0x02 /* " */#define VG_EXTENDABLE 0x04 /* " */#define VG_READ 0x01 /* vg_access */#define VG_WRITE 0x02 /* " */#define VG_CLUSTERED 0x04 /* " */#define VG_SHARED 0x08 /* " *//* logical volume */#define LV_ACTIVE 0x01 /* lv_status */#define LV_SPINDOWN 0x02 /* " */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -