lvm.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:21k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

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