lvm.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:19k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

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