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>
2006-03-23 12:50:55 +03:00
# include "libvolume_id.h"
2005-02-23 04:58:31 +03:00
# include "util.h"
2005-01-31 07:28:44 +03:00
2005-03-12 02:14:38 +03:00
struct hpt37x_meta {
2005-08-01 03:33:36 +04:00
uint8_t filler1 [ 32 ] ;
uint32_t magic ;
2006-02-21 20:44:18 +03:00
} PACKED ;
2005-03-12 02:14:38 +03:00
struct hpt45x_meta {
2005-08-01 03:33:36 +04:00
uint32_t magic ;
2006-02-21 20:44:18 +03:00
} PACKED ;
2005-02-09 03:02:18 +03:00
2005-01-31 07:28:44 +03:00
# define HPT37X_CONFIG_OFF 0x1200
# define HPT37X_MAGIC_OK 0x5a7816f0
# define HPT37X_MAGIC_BAD 0x5a7816fd
2005-03-12 02:14:38 +03:00
# define HPT45X_MAGIC_OK 0x5a7816f3
# define HPT45X_MAGIC_BAD 0x5a7816fd
2005-08-01 03:33:36 +04:00
int volume_id_probe_highpoint_37x_raid ( struct volume_id * id , uint64_t off )
2005-01-31 07:28:44 +03:00
{
2005-08-01 03:33:36 +04:00
const uint8_t * buf ;
2005-03-12 02:14:38 +03:00
struct hpt37x_meta * hpt ;
2005-08-01 03:33:36 +04:00
uint32_t magic ;
2005-01-31 07:28:44 +03:00
2006-04-08 07:04:35 +04:00
info ( " probing at offset 0x%llx " , ( unsigned long long ) off ) ;
2005-02-09 03:02:18 +03:00
2005-01-31 07:28:44 +03:00
buf = volume_id_get_buffer ( id , off + HPT37X_CONFIG_OFF , 0x200 ) ;
if ( buf = = NULL )
return - 1 ;
2005-03-12 02:14:38 +03:00
hpt = ( struct hpt37x_meta * ) buf ;
magic = le32_to_cpu ( hpt - > magic ) ;
if ( magic ! = HPT37X_MAGIC_OK & & magic ! = HPT37X_MAGIC_BAD )
return - 1 ;
volume_id_set_usage ( id , VOLUME_ID_RAID ) ;
id - > type = " highpoint_raid_member " ;
return 0 ;
}
2005-08-01 03:33:36 +04:00
int volume_id_probe_highpoint_45x_raid ( struct volume_id * id , uint64_t off , uint64_t size )
2005-03-12 02:14:38 +03:00
{
2005-08-01 03:33:36 +04:00
const uint8_t * buf ;
2005-03-12 02:14:38 +03:00
struct hpt45x_meta * hpt ;
2005-08-01 03:33:36 +04:00
uint64_t meta_off ;
uint32_t magic ;
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 ) ;
if ( size < 0x10000 )
return - 1 ;
meta_off = ( ( size / 0x200 ) - 11 ) * 0x200 ;
buf = volume_id_get_buffer ( id , off + meta_off , 0x200 ) ;
if ( buf = = NULL )
return - 1 ;
2005-01-31 07:28:44 +03:00
2005-03-12 02:14:38 +03:00
hpt = ( struct hpt45x_meta * ) buf ;
magic = le32_to_cpu ( hpt - > magic ) ;
if ( magic ! = HPT45X_MAGIC_OK & & magic ! = HPT45X_MAGIC_BAD )
2005-01-31 07:28:44 +03:00
return - 1 ;
volume_id_set_usage ( id , VOLUME_ID_RAID ) ;
2005-03-12 02:14:38 +03:00
id - > type = " highpoint_raid_member " ;
2005-01-31 07:28:44 +03:00
return 0 ;
}