1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-21 13:34:40 +03:00

filters: no need to refresh filters/rescan if no signature is wiped during pvcreate at all

Before, we refreshed filters and we did full rescan of devices if
we passed through wiping (wipe_known_signatures fn call). However,
this fn returns success even if no signatures were found and so
nothing was wiped. In this case, it's not necessary to do the
filter refresh/rescan of devices as nothing changed clearly.

This patch exports number of wiped signatures from all the
wiping functions below. The caller (_pvcreate_check) then checks
whether any wiping was done at all and if not, no refresh/rescan
is done, saving some time and resources.
This commit is contained in:
Peter Rajnoha 2015-02-17 09:46:34 +01:00
parent 1ee82b545b
commit 6b4066585f
5 changed files with 45 additions and 30 deletions

View File

@ -1,5 +1,6 @@
Version 2.02.117 -
====================================
Do not refresh filters/rescan if no signature is wiped during pvcreate.
Enforce none external dev info for wiping during pvcreate to avoid races.
Add support for VG system_id to control host access to VGs.
Update vgextend to use process_each_vg.

View File

@ -596,12 +596,16 @@ static int _blkid_wipe(blkid_probe probe, struct device *dev, const char *name,
static int _wipe_known_signatures_with_blkid(struct device *dev, const char *name,
uint32_t types_to_exclude,
uint32_t types_no_prompt,
int yes, force_t force)
int yes, force_t force, int *wiped)
{
blkid_probe probe = NULL;
int found = 0, wiped = 0, left = 0;
int found = 0, left = 0, wiped_tmp;
int r = 0;
if (!wiped)
wiped = &wiped_tmp;
*wiped = 0;
/* TODO: Should we check for valid dev - _dev_is_valid(dev)? */
if (!(probe = blkid_new_probe_from_filename(dev_name(dev)))) {
@ -624,13 +628,13 @@ static int _wipe_known_signatures_with_blkid(struct device *dev, const char *nam
while (!blkid_do_probe(probe)) {
found++;
if (_blkid_wipe(probe, dev, name, types_to_exclude, types_no_prompt, yes, force))
wiped++;
(*wiped)++;
}
if (!found)
r = 1;
left = found - wiped;
left = found - *wiped;
if (!left)
r = 1;
else
@ -645,7 +649,7 @@ out:
#endif /* BLKID_WIPING_SUPPORT */
static int _wipe_signature(struct device *dev, const char *type, const char *name,
int wipe_len, int yes, force_t force,
int wipe_len, int yes, force_t force, int *wiped,
int (*signature_detection_fn)(struct device *dev, uint64_t *offset_found))
{
int wipe;
@ -675,17 +679,24 @@ static int _wipe_signature(struct device *dev, const char *type, const char *nam
return 0;
}
(*wiped)++;
return 1;
}
static int _wipe_known_signatures_with_lvm(struct device *dev, const char *name,
uint32_t types_to_exclude __attribute__((unused)),
uint32_t types_no_prompt __attribute__((unused)),
int yes, force_t force)
int yes, force_t force, int *wiped)
{
if (!_wipe_signature(dev, "software RAID md superblock", name, 4, yes, force, dev_is_md) ||
!_wipe_signature(dev, "swap signature", name, 10, yes, force, dev_is_swap) ||
!_wipe_signature(dev, "LUKS signature", name, 8, yes, force, dev_is_luks))
int wiped_tmp;
if (!wiped)
wiped = &wiped_tmp;
*wiped = 0;
if (!_wipe_signature(dev, "software RAID md superblock", name, 4, yes, force, wiped, dev_is_md) ||
!_wipe_signature(dev, "swap signature", name, 10, yes, force, wiped, dev_is_swap) ||
!_wipe_signature(dev, "LUKS signature", name, 8, yes, force, wiped, dev_is_luks))
return 0;
return 1;
@ -693,19 +704,20 @@ static int _wipe_known_signatures_with_lvm(struct device *dev, const char *name,
int wipe_known_signatures(struct cmd_context *cmd, struct device *dev,
const char *name, uint32_t types_to_exclude,
uint32_t types_no_prompt, int yes, force_t force)
uint32_t types_no_prompt, int yes, force_t force,
int *wiped)
{
#ifdef BLKID_WIPING_SUPPORT
if (find_config_tree_bool(cmd, allocation_use_blkid_wiping_CFG, NULL))
return _wipe_known_signatures_with_blkid(dev, name,
types_to_exclude,
types_no_prompt,
yes, force);
yes, force, wiped);
#endif
return _wipe_known_signatures_with_lvm(dev, name,
types_to_exclude,
types_no_prompt,
yes, force);
yes, force, wiped);
}
#ifdef __linux__

View File

@ -66,7 +66,7 @@ int dev_is_luks(struct device *dev, uint64_t *signature);
#define TYPE_DM_SNAPSHOT_COW 0x004
int wipe_known_signatures(struct cmd_context *cmd, struct device *dev, const char *name,
uint32_t types_to_exclude, uint32_t types_no_prompt,
int yes, force_t force);
int yes, force_t force, int *wiped);
/* Type-specific device properties */
unsigned long dev_md_stripe_width(struct dev_types *dt, struct device *dev);

View File

@ -6466,7 +6466,7 @@ int wipe_lv(struct logical_volume *lv, struct wipe_params wp)
lv->vg->name, lv->name);
if (!wipe_known_signatures(lv->vg->cmd, dev, name, 0,
TYPE_DM_SNAPSHOT_COW,
wp.yes, wp.force))
wp.yes, wp.force, NULL))
stack;
}

View File

@ -1421,23 +1421,11 @@ static int _pvcreate_check(struct cmd_context *cmd, const char *name,
struct physical_volume *pv;
struct device *dev;
int r = 0;
int wiped;
int scan_needed = 0;
int filter_refresh_needed = 0;
dev_ext_t dev_ext_src = external_device_info_source();
if (dev_ext_src == DEV_EXT_UDEV)
/*
* wipe_known_signatures called later fires WATCH event
* to update udev database. But at the moment, we have
* no way to synchronize with such event - we may end
* up still seeing the old info in udev db and pvcreate
* can fail to proceed because of the device still
* being filtered (because of the stale info in udev db).
* Disable udev dev-ext source temporarily here for
* this reason.
*/
init_external_device_info_source(DEV_EXT_NONE);
/* FIXME Check partition type is LVM unless --force is given */
/* Is there a pv here already? */
@ -1493,12 +1481,26 @@ static int _pvcreate_check(struct cmd_context *cmd, const char *name,
if (!wipe_known_signatures(cmd, dev, name,
TYPE_LVM1_MEMBER | TYPE_LVM2_MEMBER,
0, pp->yes, pp->force)) {
0, pp->yes, pp->force, &wiped)) {
log_error("Aborting pvcreate on %s.", name);
goto out;
} else
}
if (wiped) {
if (dev_ext_src == DEV_EXT_UDEV)
/*
* wipe_known_signatures called later fires WATCH event
* to update udev database. But at the moment, we have
* no way to synchronize with such event - we may end
* up still seeing the old info in udev db and pvcreate
* can fail to proceed because of the device still
* being filtered (because of the stale info in udev db).
* Disable udev dev-ext source temporarily here for
* this reason.
*/
init_external_device_info_source(DEV_EXT_NONE);
filter_refresh_needed = scan_needed = 1;
}
if (sigint_caught())
goto_out;