]> sourceware.org Git - lvm2.git/commitdiff
scan: wipe filters when dropping scanned data
authorDavid Teigland <teigland@redhat.com>
Wed, 10 Feb 2021 20:06:58 +0000 (14:06 -0600)
committerDavid Teigland <teigland@redhat.com>
Wed, 10 Feb 2021 21:34:45 +0000 (15:34 -0600)
Fix clearing persistent filter state when clearing all
the state from a label_scan.

label_scan reads devs and saves info in bcache, lvmcache,
and in the persistent filter.  In some uncommon cases, an
lvm command wants to clear all info from a prior label_scan,
and repeat label_scan from scratch.  In these cases, info
in lvmcache, bcache and the persistent filter all need to
be cleared before repeating label_scan.

By missing the persistent filter wiping, outdated persistent
filter info, from a prior label_scan, could cause lvm to
incorrectly filter devices that change between polling intervals.
(i.e. if the device changes in such a way that the filtering
results change.)

A case where lvm wants to do multiple label_scans is a
polling command (like lvconvert --merge), when lvmpolld
has been disabled, so that the command itself needs to
to do repeated polling checks.

lib/label/label.c

index 030d2c578d6c21722c10fc21265fe0365774984f..0fc832c0887f96a275a20099b73abfc730fef32d 100644 (file)
@@ -707,19 +707,6 @@ static int _scan_list(struct cmd_context *cmd, struct dev_filter *f,
                if (!rem_prefetches)
                        break;
 
-               /* FIXME: figure better solution to avoid opening DM we shouldn't open */
-               if (dm_is_dm_major(MAJOR(devl->dev->dev)) &&
-                   !device_is_usable(devl->dev, (struct dev_usable_check_params) {
-                                       .check_blocked = 1,
-                                       .check_suspended = ignore_suspended_devices(),
-                                       .check_reserved = 1,
-                                       .check_error_target = 1,
-                                     })) {
-                       log_debug_devs("Scan skips unusuable DM device %s.", dev_name(devl->dev));
-                       dm_list_del(&devl->list);
-                       continue;
-               }
-
                if (!_in_bcache(devl->dev)) {
                        if (!_scan_dev_open(devl->dev)) {
                                log_debug_devs("Scan failed to open %s.", dev_name(devl->dev));
@@ -1432,6 +1419,7 @@ void label_scan_drop(struct cmd_context *cmd)
                return;
 
        while ((dev = dev_iter_get(cmd, iter))) {
+               cmd->filter->wipe(cmd, cmd->filter, dev, NULL);
                if (_in_bcache(dev))
                        _scan_dev_close(dev);
        }
This page took 0.044955 seconds and 5 git commands to generate.