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 ,
2016-01-21 13:49:46 +03:00
* Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 USA
2001-10-01 23:29:52 +04:00
*/
2018-06-08 15:40:53 +03:00
# include "base/memory/zalloc.h"
2018-05-14 12:30:20 +03:00
# include "lib/misc/lib.h"
# include "lib/filters/filter.h"
2020-10-20 00:46:20 +03:00
# include "lib/commands/toolcontext.h"
2001-10-01 23:29:52 +04:00
2015-09-03 15:19:48 +03:00
# define MSG_SKIPPING "%s: Skipping: Partition table signature found"
2018-12-07 23:35:22 +03:00
static int _passes_partitioned_filter ( struct cmd_context * cmd , struct dev_filter * f , struct device * dev , const char * use_filter_name )
2001-10-01 23:29:52 +04:00
{
2018-05-04 01:12:07 +03:00
int ret ;
2011-11-11 20:59:30 +04:00
2020-10-20 00:46:20 +03:00
if ( cmd - > filter_nodata_only )
return 1 ;
2020-07-20 20:48:36 +03:00
dev - > filtered_flags & = ~ DEV_FILTERED_PARTITIONED ;
devices: rework libudev usage
related to config settings:
obtain_device_info_from_udev (controls if lvm gets
a list of devices from readdir /dev or from libudev)
external_device_info_source (controls if lvm asks
libudev for device information)
. Make the obtain_device_list_from_udev setting
affect only the choice of readdir /dev vs libudev.
The setting no longer controls if udev is used for
device type checks.
. Change obtain_device_list_from_udev default to 0.
This helps avoid boot timeouts due to slow libudev
queries, avoids reported failures from
udev_enumerate_scan_devices, and avoids delays from
"device not initialized in udev database" errors.
Even without errors, for a system booting with 1024 PVs,
lvm2-pvscan times improve from about 100 sec to 15 sec,
and the pvscan command from about 64 sec to about 4 sec.
. For external_device_info_source="none", remove all
libudev device info queries, and use only lvm
native device info.
. For external_device_info_source="udev", first check
lvm native device info, then check libudev info.
. Remove sleep/retry loop when attempting libudev
queries for device info. udev info will simply
be skipped if it's not immediately available.
. Only set up a libdev connection if it will be used by
obtain_device_list_from_udev/external_device_info_source.
. For native multipath component detection, use
/etc/multipath/wwids. If a device has a wwid
matching an entry in the wwids file, then it's
considered a multipath component. This is
necessary to natively detect multipath
components when the mpath device is not set up.
2021-06-09 01:12:09 +03:00
ret = dev_is_partitioned ( cmd , dev ) ;
2018-05-04 01:12:07 +03:00
if ( ret = = - EAGAIN ) {
/* let pass, call again after scan */
log_debug_devs ( " filter partitioned deferred %s " , dev_name ( dev ) ) ;
dev - > flags | = DEV_FILTER_AFTER_SCAN ;
return 1 ;
}
if ( ret ) {
2015-09-03 15:19:48 +03:00
if ( dev - > ext . src = = DEV_EXT_NONE )
log_debug_devs ( MSG_SKIPPING , dev_name ( dev ) ) ;
else
log_debug_devs ( MSG_SKIPPING " [%s:%p] " , dev_name ( dev ) ,
dev_ext_name ( dev ) , dev - > ext . handle ) ;
2020-07-20 20:48:36 +03:00
dev - > filtered_flags | = DEV_FILTERED_PARTITIONED ;
2014-09-03 17:49:36 +04:00
return 0 ;
2004-11-23 14:44:04 +03:00
}
2001-10-23 16:33:57 +04:00
2014-09-03 17:49:36 +04:00
return 1 ;
2001-10-01 23:29:52 +04:00
}
2013-08-14 02:26:58 +04:00
static void _partitioned_filter_destroy ( struct dev_filter * f )
2012-03-12 18:40:41 +04:00
{
if ( f - > use_count )
2013-08-14 02:26:58 +04:00
log_error ( INTERNAL_ERROR " Destroying partitioned filter while in use %u times. " , f - > use_count ) ;
2012-03-12 18:40:41 +04:00
2018-06-08 15:40:53 +03:00
free ( f ) ;
2012-03-12 18:40:41 +04:00
}
2013-08-14 02:26:58 +04:00
struct dev_filter * partitioned_filter_create ( struct dev_types * dt )
2002-12-03 19:20:38 +03:00
{
struct dev_filter * f ;
2018-06-08 15:40:53 +03:00
if ( ! ( f = zalloc ( sizeof ( struct dev_filter ) ) ) ) {
2013-08-14 02:26:58 +04:00
log_error ( " Partitioned filter allocation failed " ) ;
2002-12-03 19:20:38 +03:00
return NULL ;
}
2013-08-14 02:26:58 +04:00
f - > passes_filter = _passes_partitioned_filter ;
f - > destroy = _partitioned_filter_destroy ;
2010-09-22 05:36:13 +04:00
f - > use_count = 0 ;
2018-12-07 23:35:22 +03:00
f - > name = " partitioned " ;
2002-12-03 19:20:38 +03:00
2013-08-14 02:26:58 +04:00
log_debug_devs ( " Partitioned filter initialised. " ) ;
2002-12-03 19:20:38 +03:00
return f ;
}