2001-09-25 12:49:28 +00:00
/*
2004-03-30 19:35:44 +00:00
* Copyright ( C ) 2001 - 2004 Sistina Software , Inc . All rights reserved .
2007-08-20 20:55:30 +00:00
* Copyright ( C ) 2004 - 2007 Red Hat , Inc . All rights reserved .
2001-09-25 12:49:28 +00:00
*
2004-03-30 19:35:44 +00:00
* This file is part of LVM2 .
*
* This copyrighted material is made available to anyone wishing to use ,
* modify , copy , or redistribute it subject to the terms and conditions
2007-08-20 20:55:30 +00:00
* of the GNU Lesser General Public License v .2 .1 .
2004-03-30 19:35:44 +00:00
*
2007-08-20 20:55:30 +00:00
* You should have received a copy of the GNU Lesser General Public License
2004-03-30 19:35:44 +00:00
* along with this program ; if not , write to the Free Software Foundation ,
2016-01-21 11:49:46 +01:00
* Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 USA
2001-09-25 12:49:28 +00:00
*/
# ifndef _LVM_DEVICE_H
# define _LVM_DEVICE_H
2018-05-14 10:30:20 +01:00
# include "lib/uuid/uuid.h"
2005-10-16 23:03:59 +00:00
2003-07-04 22:34:56 +00:00
# include <fcntl.h>
2001-10-03 12:41:29 +00:00
2003-07-04 22:34:56 +00:00
# define DEV_REGULAR 0x00000002 /* Regular file? */
2018-06-08 13:40:53 +01:00
# define DEV_ALLOCED 0x00000004 /* malloc used */
2004-12-10 16:01:35 +00:00
# define DEV_OPENED_RW 0x00000008 /* Opened RW */
2005-10-03 21:10:41 +00:00
# define DEV_OPENED_EXCL 0x00000010 /* Opened EXCL */
# define DEV_O_DIRECT 0x00000020 /* Use O_DIRECT */
# define DEV_O_DIRECT_TESTED 0x00000040 /* DEV_O_DIRECT is reliable */
2016-03-17 13:45:14 +01:00
# define DEV_OPEN_FAILURE 0x00000080 /* Has last open failed? */
2016-03-16 14:01:26 +01:00
# define DEV_USED_FOR_LV 0x00000100 /* Is device used for an LV */
# define DEV_ASSUMED_FOR_LV 0x00000200 /* Is device assumed for an LV */
2016-05-12 01:05:52 +01:00
# define DEV_NOT_O_NOATIME 0x00000400 /* Don't use O_NOATIME */
2018-02-06 15:18:11 -06:00
# define DEV_IN_BCACHE 0x00000800 /* dev fd is open and used in bcache */
2018-02-13 08:58:35 -06:00
# define DEV_BCACHE_EXCL 0x00001000 /* bcache_fd should be open EXCL */
2018-05-03 17:12:07 -05:00
# define DEV_FILTER_AFTER_SCAN 0x00002000 /* apply filter after bcache has data */
# define DEV_FILTER_OUT_SCAN 0x00004000 /* filtered out during label scan */
2018-06-20 11:32:45 -05:00
# define DEV_BCACHE_WRITE 0x00008000 /* bcache_fd is open with RDWR */
2018-12-07 14:35:22 -06:00
# define DEV_SCAN_FOUND_LABEL 0x00010000 /* label scan read dev and found label */
2019-05-21 11:58:01 -05:00
# define DEV_IS_MD_COMPONENT 0x00020000 /* device is an md component */
2019-05-21 12:06:34 -05:00
# define DEV_UDEV_INFO_MISSING 0x00040000 /* we have no udev info for this device */
2002-04-24 18:20:51 +00:00
2014-12-12 12:55:41 +01:00
/*
* Support for external device info .
* Any new external device info source needs to be
* registered using EXT_REGISTER macro in dev - ext . c .
*/
2015-11-07 17:17:37 +01:00
typedef enum dev_ext_e {
2014-12-12 12:55:41 +01:00
DEV_EXT_NONE ,
DEV_EXT_UDEV ,
DEV_EXT_NUM
} dev_ext_t ;
struct dev_ext {
int enabled ;
dev_ext_t src ;
void * handle ;
} ;
2001-10-03 12:41:29 +00:00
/*
* All devices in LVM will be represented by one of these .
* pointer comparisons are valid .
*/
struct device {
2014-05-29 09:41:03 +02:00
struct dm_list aliases ; /* struct dm_str_list */
2001-10-03 12:41:29 +00:00
dev_t dev ;
2001-11-14 10:01:52 +00:00
/* private */
int fd ;
2003-07-04 22:34:56 +00:00
int open_count ;
2019-07-26 14:21:08 -05:00
int physical_block_size ; /* From BLKPBSZGET: lowest possible sector size that the hardware can operate on without reverting to read-modify-write operations */
int logical_block_size ; /* From BLKSSZGET: lowest possible block size that the storage device can address */
2009-05-20 11:09:49 +00:00
int read_ahead ;
2018-02-13 08:58:35 -06:00
int bcache_fd ;
2002-04-24 18:20:51 +00:00
uint32_t flags ;
2016-01-15 16:41:27 +01:00
unsigned size_seqno ;
uint64_t size ;
2003-07-04 22:34:56 +00:00
uint64_t end ;
2014-12-12 12:55:41 +01:00
struct dev_ext ext ;
2018-05-21 14:20:19 -05:00
const char * duplicate_prefer_reason ;
2002-11-18 14:01:16 +00:00
2016-03-16 14:01:26 +01:00
const char * vgid ; /* if device is an LV */
const char * lvid ; /* if device is an LV */
char pvid [ ID_LEN + 1 ] ; /* if device is a PV */
2005-04-06 13:47:41 +00:00
char _padding [ 7 ] ;
2001-10-03 12:41:29 +00:00
} ;
2018-04-20 10:43:50 -05:00
/*
* All I / O is annotated with the reason it is performed .
*/
typedef enum dev_io_reason {
DEV_IO_SIGNATURES = 0 , /* Scanning device signatures */
DEV_IO_LABEL , /* LVM PV disk label */
DEV_IO_MDA_HEADER , /* Text format metadata area header */
DEV_IO_MDA_CONTENT , /* Text format metadata area content */
DEV_IO_MDA_EXTRA_HEADER , /* Header of any extra metadata areas on device */
DEV_IO_MDA_EXTRA_CONTENT , /* Content of any extra metadata areas on device */
DEV_IO_FMT1 , /* Original LVM1 metadata format */
DEV_IO_POOL , /* Pool metadata format */
DEV_IO_LV , /* Content written to an LV */
DEV_IO_LOG /* Logging messages */
} dev_io_reason_t ;
2002-01-15 10:24:48 +00:00
struct device_list {
2008-11-03 22:14:30 +00:00
struct dm_list list ;
2002-01-15 10:24:48 +00:00
struct device * dev ;
} ;
2018-04-20 10:43:50 -05:00
struct device_area {
struct device * dev ;
uint64_t start ; /* Bytes */
uint64_t size ; /* Bytes */
} ;
2014-12-12 12:55:41 +01:00
/*
* Support for external device info .
*/
const char * dev_ext_name ( struct device * dev ) ;
int dev_ext_enable ( struct device * dev , dev_ext_t src ) ;
int dev_ext_disable ( struct device * dev ) ;
struct dev_ext * dev_ext_get ( struct device * dev ) ;
int dev_ext_release ( struct device * dev ) ;
2016-01-15 16:41:27 +01:00
/*
* Increment current dev_size_seqno .
* This is used to control lifetime
* of cached device size .
*/
void dev_size_seqno_inc ( void ) ;
2001-10-03 12:41:29 +00:00
/*
2001-11-14 10:01:52 +00:00
* All io should use these routines .
2001-10-03 12:41:29 +00:00
*/
2019-07-26 14:21:08 -05:00
int dev_get_direct_block_sizes ( struct device * dev , unsigned int * physical_block_size ,
unsigned int * logical_block_size ) ;
2015-03-03 15:37:17 +01:00
int dev_get_size ( struct device * dev , uint64_t * size ) ;
2009-05-20 11:09:49 +00:00
int dev_get_read_ahead ( struct device * dev , uint32_t * read_ahead ) ;
2011-04-12 21:59:01 +00:00
int dev_discard_blocks ( struct device * dev , uint64_t offset_bytes , uint64_t size_bytes ) ;
2001-11-14 10:01:52 +00:00
2003-07-04 22:34:56 +00:00
/* Use quiet version if device number could change e.g. when opening LV */
int dev_open ( struct device * dev ) ;
int dev_open_quiet ( struct device * dev ) ;
2005-04-07 12:17:46 +00:00
int dev_open_flags ( struct device * dev , int flags , int direct , int quiet ) ;
2011-05-24 13:36:57 +00:00
int dev_open_readonly ( struct device * dev ) ;
int dev_open_readonly_buffered ( struct device * dev ) ;
int dev_open_readonly_quiet ( struct device * dev ) ;
2001-11-14 10:01:52 +00:00
int dev_close ( struct device * dev ) ;
2003-11-14 17:55:39 +00:00
int dev_close_immediate ( struct device * dev ) ;
2001-11-14 10:01:52 +00:00
2006-04-19 15:33:07 +00:00
int dev_fd ( struct device * dev ) ;
const char * dev_name ( const struct device * dev ) ;
2002-11-18 14:01:16 +00:00
2003-07-04 22:34:56 +00:00
void dev_flush ( struct device * dev ) ;
struct device * dev_create_file ( const char * filename , struct device * dev ,
2014-05-29 09:41:03 +02:00
struct dm_str_list * alias , int use_malloc ) ;
2015-08-17 12:57:01 +01:00
void dev_destroy_file ( struct device * dev ) ;
2001-10-03 12:41:29 +00:00
2002-01-24 23:16:19 +00:00
/* Return a valid device name from the alias list; NULL otherwise */
2003-07-04 22:34:56 +00:00
const char * dev_name_confirmed ( struct device * dev , int quiet ) ;
2001-09-25 12:49:28 +00:00
2002-11-18 14:01:16 +00:00
# endif