2001-12-11 14:42:30 +03:00
/*
2004-03-30 23:35:44 +04:00
* Copyright ( C ) 2002 - 2004 Sistina Software , Inc . All rights reserved .
2007-08-21 00:55:30 +04:00
* Copyright ( C ) 2004 - 2007 Red Hat , Inc . All rights reserved .
2001-12-11 14:42:30 +03:00
*
2004-03-30 23:35:44 +04: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-21 00:55:30 +04:00
* of the GNU Lesser General Public License v .2 .1 .
2004-03-30 23:35:44 +04:00
*
2007-08-21 00:55:30 +04:00
* You should have received a copy of the GNU Lesser General Public License
2004-03-30 23:35:44 +04:00
* along with this program ; if not , write to the Free Software Foundation ,
2016-01-21 13:49:46 +03:00
* Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 USA
2001-12-11 14:42:30 +03:00
*/
2002-01-10 18:01:58 +03:00
# ifndef _LVM_LABEL_H
# define _LVM_LABEL_H
2001-12-11 14:42:30 +03:00
2018-05-14 12:30:20 +03:00
# include "lib/uuid/uuid.h"
# include "lib/device/device.h"
# include "lib/device/bcache.h"
2001-12-11 19:49:40 +03:00
2002-11-18 17:04:08 +03: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-05 01:25:57 +04:00
struct labeller ;
2018-10-15 17:50:25 +03:00
struct dev_filter ;
struct cmd_context ;
struct logical_volume ;
2004-05-05 01:25:57 +04:00
2002-11-18 17:04:08 +03:00
/* On disk - 32 bytes */
struct label_header {
2006-05-10 01:23:51 +04:00
int8_t id [ 8 ] ; /* LABELONE */
2002-11-18 17:04:08 +03: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-10 01:23:51 +04:00
int8_t type [ 8 ] ; /* LVM2 001 */
2002-11-18 17:04:08 +03:00
} __attribute__ ( ( packed ) ) ;
/* In core */
2002-01-10 18:01:58 +03:00
struct label {
2002-11-18 17:04:08 +03:00
char type [ 8 ] ;
uint64_t sector ;
2002-01-15 13:24:48 +03:00
struct labeller * labeller ;
2013-07-29 21:03:20 +04:00
struct device * dev ;
2002-11-18 17:04:08 +03:00
void * info ;
2002-01-10 18:01:58 +03:00
} ;
struct labeller ;
struct label_ops {
/*
* Is the device labelled with this format ?
*/
2006-12-01 02:11:42 +03:00
int ( * can_handle ) ( struct labeller * l , void * buf , uint64_t sector ) ;
2002-01-10 18:01:58 +03:00
/*
* Write a label to a volume .
*/
2006-12-01 02:11:42 +03:00
int ( * write ) ( struct label * label , void * buf ) ;
2002-01-10 18:01:58 +03:00
/*
2002-11-18 17:04:08 +03:00
* Read a label from a volume .
2002-01-10 18:01:58 +03:00
*/
2018-04-20 18:43:50 +03:00
int ( * read ) ( struct labeller * l , struct device * dev ,
2018-02-07 00:18:11 +03:00
void * label_buf , struct label * * label ) ;
2002-01-10 18:01:58 +03:00
/*
2002-11-18 17:04:08 +03:00
* Populate label_type etc .
2002-01-10 18:01:58 +03:00
*/
2002-11-18 17:04:08 +03:00
int ( * initialise_label ) ( struct labeller * l , struct label * label ) ;
2002-01-10 18:01:58 +03:00
2002-01-15 13:24:48 +03:00
/*
* Destroy a previously read label .
*/
2002-11-18 17:04:08 +03:00
void ( * destroy_label ) ( struct labeller * l , struct label * label ) ;
2002-01-15 13:24:48 +03:00
2002-01-10 18:01:58 +03:00
/*
* Destructor .
*/
2002-11-18 17:04:08 +03:00
void ( * destroy ) ( struct labeller * l ) ;
2002-01-10 18:01:58 +03:00
} ;
struct labeller {
struct label_ops * ops ;
2013-11-22 23:43:30 +04:00
const struct format_type * fmt ;
2001-12-11 19:49:40 +03:00
} ;
2001-12-11 14:42:30 +03:00
2002-01-10 18:01:58 +03:00
int label_init ( void ) ;
void label_exit ( void ) ;
2013-07-29 17:58:18 +04:00
int label_register_handler ( struct labeller * handler ) ;
2002-01-10 18:01:58 +03:00
struct labeller * label_get_handler ( const char * name ) ;
2002-01-11 13:43:32 +03:00
int label_remove ( struct device * dev ) ;
2002-11-18 17:04:08 +03: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 14:42:30 +03:00
2018-02-07 00:18:11 +03:00
extern struct bcache * scan_bcache ;
int label_scan ( struct cmd_context * cmd ) ;
2018-05-04 01:12:07 +03:00
int label_scan_devs ( struct cmd_context * cmd , struct dev_filter * f , struct dm_list * devs ) ;
2018-02-13 17:58:35 +03:00
int label_scan_devs_excl ( struct dm_list * devs ) ;
2018-02-07 00:18:11 +03:00
void label_scan_invalidate ( struct device * dev ) ;
2018-02-16 23:18:55 +03:00
void label_scan_invalidate_lv ( struct cmd_context * cmd , struct logical_volume * lv ) ;
2018-02-28 01:35:47 +03:00
void label_scan_drop ( struct cmd_context * cmd ) ;
2018-02-07 00:18:11 +03:00
void label_scan_destroy ( struct cmd_context * cmd ) ;
2018-05-11 22:16:49 +03:00
int label_read ( struct device * dev ) ;
2018-05-11 00:27:34 +03:00
int label_read_sector ( struct device * dev , uint64_t scan_sector ) ;
2018-02-13 21:50:44 +03:00
void label_scan_confirm ( struct device * dev ) ;
2018-02-15 01:21:27 +03:00
int label_scan_setup_bcache ( void ) ;
2018-02-20 00:40:44 +03:00
int label_scan_open ( struct device * dev ) ;
2018-05-16 21:24:00 +03:00
int label_scan_open_excl ( struct device * dev ) ;
2018-02-07 00:18:11 +03:00
2018-02-27 20:26:04 +03:00
/*
* Wrappers around bcache equivalents .
* ( these make it easier to disable bcache and revert to direct rw if needed )
*/
2018-05-09 18:34:28 +03: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-10-30 00:53:17 +03:00
void dev_set_last_byte ( struct device * dev , uint64_t offset ) ;
void dev_unset_last_byte ( struct device * dev ) ;
2018-02-27 20:26:04 +03:00
2002-01-10 18:01:58 +03:00
# endif