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 ,
* Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 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
2002-01-10 18:01:58 +03:00
# include "uuid.h"
# include "device.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 ;
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 ;
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
*/
2002-11-18 17:04:08 +03:00
int ( * read ) ( struct labeller * l , struct device * dev ,
2006-12-01 02:11:42 +03:00
void * buf , struct label * * label ) ;
2002-01-10 18:01:58 +03:00
/*
2002-11-18 17:04:08 +03:00
* Additional consistency checks for the paranoid .
2002-01-10 18:01:58 +03:00
*/
2006-12-01 02:11:42 +03:00
int ( * verify ) ( struct labeller * l , void * buf , uint64_t sector ) ;
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 ;
2002-12-20 02:25:55 +03:00
const void * private ;
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 ) ;
int label_register_handler ( const char * name , struct labeller * handler ) ;
struct labeller * label_get_handler ( const char * name ) ;
2002-01-11 13:43:32 +03:00
int label_remove ( struct device * dev ) ;
2007-04-23 22:21:01 +04:00
int label_read ( struct device * dev , struct label * * result ,
uint64_t scan_sector ) ;
2002-11-18 17:04:08 +03:00
int label_write ( struct device * dev , struct label * label ) ;
2002-01-11 13:43:32 +03:00
int label_verify ( struct device * dev ) ;
2002-11-18 17:04:08 +03:00
struct label * label_create ( struct labeller * labeller ) ;
void label_destroy ( struct label * label ) ;
2001-12-11 14:42:30 +03:00
2002-01-10 18:01:58 +03:00
# endif