2009-03-17 17:40:00 +03:00
/*
* Copyright ( C ) 2009 Red Hat , Inc . All rights reserved .
*
* 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
* of the GNU Lesser General Public License v .2 .1 .
*
* You should have received a copy of the GNU Lesser General Public License
* 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
2009-03-17 17:40:00 +03:00
*/
2018-05-14 12:30:20 +03:00
# include "lib/misc/lib.h"
# include "lib/device/dev-type.h"
2009-03-17 17:40:00 +03:00
2013-11-13 17:56:29 +04:00
# ifdef __linux__
2009-03-17 17:40:00 +03:00
# define MAX_PAGESIZE (64 * 1024)
# define SIGNATURE_SIZE 10
2017-10-18 17:57:46 +03:00
static int _swap_detect_signature ( const char * buf )
2009-03-17 17:40:00 +03:00
{
if ( memcmp ( buf , " SWAP-SPACE " , 10 ) = = 0 | |
memcmp ( buf , " SWAPSPACE2 " , 10 ) = = 0 )
return 1 ;
if ( memcmp ( buf , " S1SUSPEND " , 9 ) = = 0 | |
memcmp ( buf , " S2SUSPEND " , 9 ) = = 0 | |
memcmp ( buf , " ULSUSPEND " , 9 ) = = 0 | |
memcmp ( buf , " \xed \xc3 \x02 \xe9 \x98 \x56 \xe5 \x0c " , 8 ) = = 0 )
return 1 ;
return 0 ;
}
2018-05-04 01:12:07 +03:00
int dev_is_swap ( struct device * dev , uint64_t * offset_found , int full )
2009-03-17 17:40:00 +03:00
{
char buf [ 10 ] ;
uint64_t size ;
2011-04-08 18:40:18 +04:00
unsigned page ;
int ret = 0 ;
2009-03-17 17:40:00 +03:00
2018-05-04 01:12:07 +03:00
if ( ! scan_bcache )
return - EAGAIN ;
2009-03-17 17:40:00 +03:00
2018-05-04 01:12:07 +03:00
if ( ! dev_get_size ( dev , & size ) ) {
2009-03-17 17:40:00 +03:00
stack ;
return - 1 ;
}
for ( page = 0x1000 ; page < = MAX_PAGESIZE ; page < < = 1 ) {
/*
* skip 32 k pagesize since this does not seem to be supported
*/
if ( page = = 0x8000 )
continue ;
2014-03-22 23:43:05 +04:00
if ( size < ( page > > SECTOR_SHIFT ) )
2009-03-17 17:40:00 +03:00
break ;
2018-05-04 01:12:07 +03:00
if ( ! dev_read_bytes ( dev , page - SIGNATURE_SIZE , SIGNATURE_SIZE , buf ) ) {
2010-08-20 03:05:45 +04:00
ret = - 1 ;
break ;
2009-03-17 17:40:00 +03:00
}
if ( _swap_detect_signature ( buf ) ) {
2013-11-06 18:09:29 +04:00
if ( offset_found )
* offset_found = page - SIGNATURE_SIZE ;
2010-08-20 03:05:45 +04:00
ret = 1 ;
2009-03-17 17:40:00 +03:00
break ;
}
}
2010-08-20 03:05:45 +04:00
return ret ;
2009-03-17 17:40:00 +03:00
}
# endif