2001-10-01 23:29:52 +04:00
/*
2004-03-30 23:35:44 +04:00
* Copyright ( C ) 2001 - 2004 Sistina Software , Inc . All rights reserved .
2012-03-12 18:40:41 +04:00
* Copyright ( C ) 2004 - 2012 Red Hat , Inc . All rights reserved .
2001-10-01 23:29:52 +04:00
*
2004-03-30 23:35:44 +04:00
* This file is part of LVM2 .
2001-10-01 23:29:52 +04:00
*
2004-03-30 23:35:44 +04:00
* 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 .
2001-10-01 23:29:52 +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-10-01 23:29:52 +04:00
*/
2002-11-18 17:01:16 +03:00
# include "lib.h"
2001-10-01 23:29:52 +04:00
# include "filter.h"
2013-06-12 14:08:56 +04:00
static int _passes_lvm_type_device_filter ( struct dev_filter * f , struct device * dev )
2001-10-01 23:29:52 +04:00
{
2013-06-12 14:08:56 +04:00
struct dev_types * dt = ( struct dev_types * ) f - > private ;
2001-10-25 18:04:18 +04:00
const char * name = dev_name ( dev ) ;
2004-12-21 20:54:52 +03:00
int ret = 0 ;
uint64_t size ;
2001-10-23 16:33:57 +04:00
2001-10-09 21:20:02 +04:00
/* Is this a recognised device type? */
2013-06-12 14:08:56 +04:00
if ( ! dt - > dev_type_array [ MAJOR ( dev - > dev ) ] . max_partitions ) {
2013-01-08 02:30:29 +04:00
log_debug_devs ( " %s: Skipping: Unrecognised LVM device type % "
PRIu64 , name , ( uint64_t ) MAJOR ( dev - > dev ) ) ;
2001-10-09 21:20:02 +04:00
return 0 ;
2003-01-08 19:41:22 +03:00
}
2001-10-23 16:33:57 +04:00
/* Check it's accessible */
2011-05-24 17:36:57 +04:00
if ( ! dev_open_readonly_quiet ( dev ) ) {
2013-01-08 02:30:29 +04:00
log_debug_devs ( " %s: Skipping: open failed " , name ) ;
2001-10-23 16:33:57 +04:00
return 0 ;
}
2011-11-11 20:59:30 +04:00
2004-12-21 20:54:52 +03:00
/* Check it's not too small */
if ( ! dev_get_size ( dev , & size ) ) {
2013-01-08 02:30:29 +04:00
log_debug_devs ( " %s: Skipping: dev_get_size failed " , name ) ;
2004-12-21 20:54:52 +03:00
goto out ;
}
2011-02-18 17:11:22 +03:00
if ( size < pv_min_size ( ) ) {
2013-01-08 02:30:29 +04:00
log_debug_devs ( " %s: Skipping: Too small to hold a PV " , name ) ;
2004-12-21 20:54:52 +03:00
goto out ;
}
2013-06-12 14:08:56 +04:00
if ( dev_is_partitioned ( dt , dev ) ) {
2013-01-08 02:30:29 +04:00
log_debug_devs ( " %s: Skipping: Partition table signature found " ,
name ) ;
2004-12-21 20:54:52 +03:00
goto out ;
2004-11-23 14:44:04 +03:00
}
2001-10-23 16:33:57 +04:00
2004-12-21 20:54:52 +03:00
ret = 1 ;
out :
2012-02-28 14:11:35 +04:00
if ( ! dev_close ( dev ) )
stack ;
2001-10-23 16:33:57 +04:00
2004-11-23 14:44:04 +03:00
return ret ;
2001-10-01 23:29:52 +04:00
}
2012-03-12 18:40:41 +04:00
static void _lvm_type_filter_destroy ( struct dev_filter * f )
{
if ( f - > use_count )
log_error ( INTERNAL_ERROR " Destroying lvm_type filter while in use %u times. " , f - > use_count ) ;
dm_free ( f ) ;
}
2013-06-12 14:08:56 +04:00
struct dev_filter * lvm_type_filter_create ( struct dev_types * dt )
2002-12-03 19:20:38 +03:00
{
struct dev_filter * f ;
2012-08-18 20:59:07 +04:00
if ( ! ( f = dm_zalloc ( sizeof ( struct dev_filter ) ) ) ) {
2002-12-03 19:20:38 +03:00
log_error ( " LVM type filter allocation failed " ) ;
return NULL ;
}
f - > passes_filter = _passes_lvm_type_device_filter ;
2012-03-12 18:40:41 +04:00
f - > destroy = _lvm_type_filter_destroy ;
2010-09-22 05:36:13 +04:00
f - > use_count = 0 ;
2013-06-12 14:08:56 +04:00
f - > private = dt ;
2002-12-03 19:20:38 +03:00
return f ;
}