2001-12-11 11:42:30 +00:00
/*
2004-03-30 19:35:44 +00:00
* Copyright ( C ) 2002 - 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-12-11 11:42:30 +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-12-11 11:42:30 +00:00
*/
2002-01-10 15:01:58 +00:00
# ifndef _LVM_LABEL_H
# define _LVM_LABEL_H
2001-12-11 11:42:30 +00:00
2018-05-14 10:30:20 +01:00
# include "lib/uuid/uuid.h"
# include "lib/device/device.h"
# include "lib/device/bcache.h"
# include "lib/commands/toolcontext.h"
2001-12-11 16:49:40 +00:00
2002-11-18 14:04:08 +00:00
# define LABEL_ID "LABELONE"
# define LABEL_SIZE SECTOR_SIZE /* Think very carefully before changing this */
# define LABEL_SCAN_SECTORS 4L
# define LABEL_SCAN_SIZE (LABEL_SCAN_SECTORS << SECTOR_SHIFT)
2004-05-04 21:25:57 +00:00
struct labeller ;
2012-02-23 13:11:07 +00:00
void allow_reads_with_lvmetad ( void ) ;
2002-11-18 14:04:08 +00:00
/* On disk - 32 bytes */
struct label_header {
2006-05-09 21:23:51 +00:00
int8_t id [ 8 ] ; /* LABELONE */
2002-11-18 14:04:08 +00:00
uint64_t sector_xl ; /* Sector number of this label */
uint32_t crc_xl ; /* From next field to end of sector */
uint32_t offset_xl ; /* Offset from start of struct to contents */
2006-05-09 21:23:51 +00:00
int8_t type [ 8 ] ; /* LVM2 001 */
2002-11-18 14:04:08 +00:00
} __attribute__ ( ( packed ) ) ;
/* In core */
2002-01-10 15:01:58 +00:00
struct label {
2002-11-18 14:04:08 +00:00
char type [ 8 ] ;
uint64_t sector ;
2002-01-15 10:24:48 +00:00
struct labeller * labeller ;
2013-07-29 19:03:20 +02:00
struct device * dev ;
2002-11-18 14:04:08 +00:00
void * info ;
2002-01-10 15:01:58 +00:00
} ;
struct labeller ;
struct label_ops {
/*
* Is the device labelled with this format ?
*/
2006-11-30 23:11:42 +00:00
int ( * can_handle ) ( struct labeller * l , void * buf , uint64_t sector ) ;
2002-01-10 15:01:58 +00:00
/*
* Write a label to a volume .
*/
2006-11-30 23:11:42 +00:00
int ( * write ) ( struct label * label , void * buf ) ;
2002-01-10 15:01:58 +00:00
/*
2002-11-18 14:04:08 +00:00
* Read a label from a volume .
2002-01-10 15:01:58 +00:00
*/
2018-04-20 10:43:50 -05:00
int ( * read ) ( struct labeller * l , struct device * dev ,
2018-02-06 15:18:11 -06:00
void * label_buf , struct label * * label ) ;
2002-01-10 15:01:58 +00:00
/*
2002-11-18 14:04:08 +00:00
* Populate label_type etc .
2002-01-10 15:01:58 +00:00
*/
2002-11-18 14:04:08 +00:00
int ( * initialise_label ) ( struct labeller * l , struct label * label ) ;
2002-01-10 15:01:58 +00:00
2002-01-15 10:24:48 +00:00
/*
* Destroy a previously read label .
*/
2002-11-18 14:04:08 +00:00
void ( * destroy_label ) ( struct labeller * l , struct label * label ) ;
2002-01-15 10:24:48 +00:00
2002-01-10 15:01:58 +00:00
/*
* Destructor .
*/
2002-11-18 14:04:08 +00:00
void ( * destroy ) ( struct labeller * l ) ;
2002-01-10 15:01:58 +00:00
} ;
struct labeller {
struct label_ops * ops ;
2013-11-22 20:43:30 +01:00
const struct format_type * fmt ;
2001-12-11 16:49:40 +00:00
} ;
2001-12-11 11:42:30 +00:00
2002-01-10 15:01:58 +00:00
int label_init ( void ) ;
void label_exit ( void ) ;
2013-07-29 15:58:18 +02:00
int label_register_handler ( struct labeller * handler ) ;
2002-01-10 15:01:58 +00:00
struct labeller * label_get_handler ( const char * name ) ;
2002-01-11 10:43:32 +00:00
int label_remove ( struct device * dev ) ;
2002-11-18 14:04:08 +00:00
int label_write ( struct device * dev , struct label * label ) ;
struct label * label_create ( struct labeller * labeller ) ;
void label_destroy ( struct label * label ) ;
2001-12-11 11:42:30 +00:00
2018-02-06 15:18:11 -06:00
extern struct bcache * scan_bcache ;
int label_scan ( struct cmd_context * cmd ) ;
2018-05-03 17:12:07 -05:00
int label_scan_devs ( struct cmd_context * cmd , struct dev_filter * f , struct dm_list * devs ) ;
2018-02-13 08:58:35 -06:00
int label_scan_devs_excl ( struct dm_list * devs ) ;
2018-02-06 15:18:11 -06:00
void label_scan_invalidate ( struct device * dev ) ;
2018-02-16 14:18:55 -06:00
void label_scan_invalidate_lv ( struct cmd_context * cmd , struct logical_volume * lv ) ;
2018-02-27 16:35:47 -06:00
void label_scan_drop ( struct cmd_context * cmd ) ;
2018-02-06 15:18:11 -06:00
void label_scan_destroy ( struct cmd_context * cmd ) ;
2018-05-11 14:16:49 -05:00
int label_read ( struct device * dev ) ;
2018-05-10 16:27:34 -05:00
int label_read_sector ( struct device * dev , uint64_t scan_sector ) ;
2018-02-13 12:50:44 -06:00
void label_scan_confirm ( struct device * dev ) ;
2018-02-14 16:21:27 -06:00
int label_scan_setup_bcache ( void ) ;
2018-02-19 15:40:44 -06:00
int label_scan_open ( struct device * dev ) ;
2018-05-16 13:24:00 -05:00
int label_scan_open_excl ( struct device * dev ) ;
2018-02-06 15:18:11 -06:00
2018-02-27 11:26:04 -06:00
/*
* Wrappers around bcache equivalents .
* ( these make it easier to disable bcache and revert to direct rw if needed )
*/
2018-05-09 10:34:28 -05:00
bool dev_read_bytes ( struct device * dev , uint64_t start , size_t len , void * data ) ;
bool dev_write_bytes ( struct device * dev , uint64_t start , size_t len , void * data ) ;
bool dev_write_zeros ( struct device * dev , uint64_t start , size_t len ) ;
bool dev_set_bytes ( struct device * dev , uint64_t start , size_t len , uint8_t val ) ;
2018-02-27 11:26:04 -06:00
2002-01-10 15:01:58 +00:00
# endif