2005-01-31 07:28:44 +03:00
/*
* volume_id - reads filesystem label and uuid
*
* Copyright ( C ) 2004 Kay Sievers < kay . sievers @ vrfy . org >
*
2005-09-27 18:27:35 +04:00
* This program is free software ; you can redistribute it and / or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation version 2 of the License .
2005-01-31 07:28:44 +03:00
*/
# ifndef _GNU_SOURCE
# define _GNU_SOURCE 1
# endif
# ifdef HAVE_CONFIG_H
# include <config.h>
# endif
# include <stdio.h>
# include <stdlib.h>
# include <unistd.h>
# include <string.h>
# include <errno.h>
# include <ctype.h>
2005-02-23 04:58:31 +03:00
# include "volume_id.h"
# include "logging.h"
# include "util.h"
2005-01-31 07:28:44 +03:00
2005-02-09 03:02:18 +03:00
struct mdp_super_block {
2005-08-01 03:33:36 +04:00
uint32_t md_magic ;
uint32_t major_version ;
uint32_t minor_version ;
uint32_t patch_version ;
uint32_t gvalid_words ;
uint32_t set_uuid0 ;
uint32_t ctime ;
uint32_t level ;
uint32_t size ;
uint32_t nr_disks ;
uint32_t raid_disks ;
uint32_t md_minor ;
uint32_t not_persistent ;
uint32_t set_uuid1 ;
uint32_t set_uuid2 ;
uint32_t set_uuid3 ;
2005-02-09 03:02:18 +03:00
} __attribute__ ( ( packed ) ) * mdp ;
2005-01-31 07:28:44 +03:00
# define MD_RESERVED_BYTES 0x10000
# define MD_MAGIC 0xa92b4efc
2005-08-01 03:33:36 +04:00
int volume_id_probe_linux_raid ( struct volume_id * id , uint64_t off , uint64_t size )
2005-01-31 07:28:44 +03:00
{
2005-08-01 03:33:36 +04:00
const uint8_t * buf ;
uint64_t sboff ;
uint8_t uuid [ 16 ] ;
2005-01-31 07:28:44 +03:00
2005-03-12 02:14:38 +03:00
dbg ( " probing at offset 0x%llx, size 0x%llx " ,
( unsigned long long ) off , ( unsigned long long ) size ) ;
2005-02-09 03:02:18 +03:00
2005-01-31 07:28:44 +03:00
if ( size < 0x10000 )
return - 1 ;
sboff = ( size & ~ ( MD_RESERVED_BYTES - 1 ) ) - MD_RESERVED_BYTES ;
buf = volume_id_get_buffer ( id , off + sboff , 0x800 ) ;
if ( buf = = NULL )
return - 1 ;
mdp = ( struct mdp_super_block * ) buf ;
if ( le32_to_cpu ( mdp - > md_magic ) ! = MD_MAGIC )
return - 1 ;
memcpy ( uuid , & mdp - > set_uuid0 , 4 ) ;
memcpy ( & uuid [ 4 ] , & mdp - > set_uuid1 , 12 ) ;
volume_id_set_uuid ( id , uuid , UUID_DCE ) ;
2005-03-12 02:14:38 +03:00
snprintf ( id - > type_version , sizeof ( id - > type_version ) - 1 , " %u.%u.%u " ,
2005-01-31 07:28:44 +03:00
le32_to_cpu ( mdp - > major_version ) ,
le32_to_cpu ( mdp - > minor_version ) ,
le32_to_cpu ( mdp - > patch_version ) ) ;
dbg ( " found raid signature " ) ;
volume_id_set_usage ( id , VOLUME_ID_RAID ) ;
id - > type = " linux_raid_member " ;
return 0 ;
}