diff --git a/SOURCES/0001-Revert-new-udev-autoactivation.patch b/SOURCES/0001-Revert-new-udev-autoactivation.patch
new file mode 100644
index 0000000..122a417
--- /dev/null
+++ b/SOURCES/0001-Revert-new-udev-autoactivation.patch
@@ -0,0 +1,545 @@
+From 8b83a498fda9a8bcaaca3ee179832ab8f598a1a2 Mon Sep 17 00:00:00 2001
+From: Marian Csontos <mcsontos@redhat.com>
+Date: Fri, 3 Dec 2021 17:07:50 +0100
+Subject: [PATCH 1/2] Revert "new udev autoactivation"
+
+This reverts commit 67722b312390cdab29c076c912e14bd739c5c0f6.
+---
+ scripts/Makefile.in                |   1 +
+ test/shell/udev-pvscan-vgchange.sh | 403 -----------------------------
+ udev/69-dm-lvm.rules.in            |  87 -------
+ udev/Makefile.in                   |   2 +-
+ 5 files changed, 4 insertions(+), 492 deletions(-)
+ delete mode 100644 test/shell/udev-pvscan-vgchange.sh
+ delete mode 100644 udev/69-dm-lvm.rules.in
+
+diff --git a/scripts/Makefile.in b/scripts/Makefile.in
+index 0d7f45680..ee0acb6f6 100644
+--- a/scripts/Makefile.in
++++ b/scripts/Makefile.in
+@@ -92,6 +92,7 @@ install_systemd_generators:
+ install_systemd_units:	install_dbus_service
+ 	@echo "    [INSTALL] systemd_units"
+ 	$(Q) $(INSTALL_DIR) $(systemd_unit_dir)
++	$(Q) $(INSTALL_DATA) lvm2-pvscan.service $(systemd_unit_dir)/lvm2-pvscan@.service
+ ifeq ("@BUILD_DMEVENTD@", "yes")
+ 	$(Q) $(INSTALL_DATA) dm_event_systemd_red_hat.socket $(systemd_unit_dir)/dm-event.socket
+ 	$(Q) $(INSTALL_DATA) dm_event_systemd_red_hat.service $(systemd_unit_dir)/dm-event.service
+diff --git a/test/shell/udev-pvscan-vgchange.sh b/test/shell/udev-pvscan-vgchange.sh
+deleted file mode 100644
+index c81acf0ce..000000000
+--- a/test/shell/udev-pvscan-vgchange.sh
++++ /dev/null
+@@ -1,403 +0,0 @@
+-#!/usr/bin/env bash
+-
+-# Copyright (C) 2021 Red Hat, Inc. All rights reserved.
+-#
+-# 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 General Public License v.2.
+-#
+-# You should have received a copy of the GNU General Public License
+-# along with this program; if not, write to the Free Software Foundation,
+-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+-
+-test_description='udev rule and systemd unit run vgchange'
+-
+-SKIP_WITH_LVMPOLLD=1
+-SKIP_WITH_LVMLOCKD=1
+-
+-. lib/inittest
+-
+-#
+-# $ cat /tmp/devs
+-# /dev/sdb
+-# /dev/sdc
+-# /dev/sdd
+-#
+-# Specify this file as LVM_TEST_DEVICE_LIST=/tmp/devs
+-# when running the test.
+-#
+-# This test will wipe these devices.
+-#
+-
+-if [ -z ${LVM_TEST_DEVICE_LIST+x} ]; then echo "LVM_TEST_DEVICE_LIST is unset" && skip; else echo "LVM_TEST_DEVICE_LIST is set to '$LVM_TEST_DEVICE_LIST'"; fi
+-
+-test -e "$LVM_TEST_DEVICE_LIST" || skip
+-
+-num_devs=$(cat $LVM_TEST_DEVICE_LIST | wc -l)
+-
+-RUNDIR="/run"
+-test -d "$RUNDIR" || RUNDIR="/var/run"
+-PVS_ONLINE_DIR="$RUNDIR/lvm/pvs_online"
+-VGS_ONLINE_DIR="$RUNDIR/lvm/vgs_online"
+-PVS_LOOKUP_DIR="$RUNDIR/lvm/pvs_lookup"
+-
+-_clear_online_files() {
+-	# wait till udev is finished
+-	aux udev_wait
+-	rm -f "$PVS_ONLINE_DIR"/*
+-	rm -f "$VGS_ONLINE_DIR"/*
+-	rm -f "$PVS_LOOKUP_DIR"/*
+-}
+-
+-test -d "$PVS_ONLINE_DIR" || mkdir -p "$PVS_ONLINE_DIR"
+-test -d "$VGS_ONLINE_DIR" || mkdir -p "$VGS_ONLINE_DIR"
+-test -d "$PVS_LOOKUP_DIR" || mkdir -p "$PVS_LOOKUP_DIR"
+-_clear_online_files
+-
+-aux prepare_real_devs
+-
+-aux lvmconf 'devices/dir = "/dev"'
+-aux lvmconf 'devices/use_devicesfile = 1'
+-DFDIR="$LVM_SYSTEM_DIR/devices"
+-DF="$DFDIR/system.devices"
+-mkdir $DFDIR || true
+-not ls $DF
+-
+-get_real_devs
+-
+-wipe_all() {
+-	for dev in "${REAL_DEVICES[@]}"; do
+-		wipefs -a $dev
+-	done
+-}
+-
+-# udevadm trigger runs udev rule which runs systemd-run --no-wait vgchange -aay
+-# Because of --no-wait, we need to wait for the transient systemd
+-# service to be gone before checking the effects of the vgchange.
+-
+-wait_lvm_activate() {
+-	local vgw=$1
+-	local wait=0
+-
+-	while systemctl status lvm-activate-$vgw > /dev/null && test "$wait" -le 30; do
+-		sleep .2
+-		wait=$(( wait + 1 ))
+-	done
+-}
+-
+-# Test requires 3 devs
+-test $num_devs -gt 2 || skip
+-BDEV1=$(basename "$dev1")
+-BDEV2=$(basename "$dev2")
+-BDEV3=$(basename "$dev3")
+-
+-wipe_all
+-touch $DF
+-for dev in "${REAL_DEVICES[@]}"; do
+-	pvcreate $dev
+-done
+-
+-# 1 dev, 1 vg, 1 lv
+-
+-vgcreate $vg1 "$dev1"
+-lvcreate -l1 -an -n $lv1 $vg1 "$dev1"
+-
+-PVID1=$(pvs "$dev1" --noheading -o uuid | tr -d - | awk '{print $1}')
+-
+-_clear_online_files
+-udevadm trigger --settle -c add /sys/block/$BDEV1
+-
+-wait_lvm_activate $vg1
+-
+-ls "$RUNDIR/lvm/pvs_online/$PVID1"
+-ls "$RUNDIR/lvm/vgs_online/$vg1"
+-journalctl -u lvm-activate-$vg1 | tee out || true
+-grep "now active" out
+-check lv_field $vg1/$lv1 lv_active "active"
+-
+-vgchange -an $vg1
+-vgremove -y $vg1
+-
+-
+-# 2 devs, 1 vg, 2 lvs
+-
+-vgcreate $vg2 "$dev1" "$dev2"
+-lvcreate -l1 -an -n $lv1 $vg2 "$dev1"
+-lvcreate -l1 -an -n $lv2 $vg2 "$dev2"
+-
+-PVID1=$(pvs "$dev1" --noheading -o uuid | tr -d - | awk '{print $1}')
+-PVID2=$(pvs "$dev2" --noheading -o uuid | tr -d - | awk '{print $1}')
+-
+-_clear_online_files
+-
+-udevadm trigger --settle -c add /sys/block/$BDEV1
+-ls "$RUNDIR/lvm/pvs_online/$PVID1"
+-not ls "$RUNDIR/lvm/vgs_online/$vg2"
+-journalctl -u lvm-activate-$vg2 | tee out || true
+-not grep "now active" out
+-check lv_field $vg2/$lv1 lv_active ""
+-check lv_field $vg2/$lv2 lv_active ""
+-
+-udevadm trigger --settle -c add /sys/block/$BDEV2
+-ls "$RUNDIR/lvm/pvs_online/$PVID2"
+-ls "$RUNDIR/lvm/vgs_online/$vg2"
+-
+-wait_lvm_activate $vg2
+-
+-journalctl -u lvm-activate-$vg2 | tee out || true
+-grep "now active" out
+-check lv_field $vg2/$lv1 lv_active "active"
+-check lv_field $vg2/$lv2 lv_active "active"
+-
+-vgchange -an $vg2
+-vgremove -y $vg2
+-
+-
+-# 3 devs, 1 vg, 4 lvs, concurrent pvscans
+-# (attempting to have the pvscans run concurrently and race
+-# to activate the VG)
+-
+-vgcreate $vg3 "$dev1" "$dev2" "$dev3"
+-lvcreate -l1 -an -n $lv1 $vg3 "$dev1"
+-lvcreate -l1 -an -n $lv2 $vg3 "$dev2"
+-lvcreate -l1 -an -n $lv3 $vg3 "$dev3"
+-lvcreate -l8 -an -n $lv4 -i 2 $vg3 "$dev1" "$dev2"
+-
+-PVID1=$(pvs "$dev1" --noheading -o uuid | tr -d - | awk '{print $1}')
+-PVID2=$(pvs "$dev2" --noheading -o uuid | tr -d - | awk '{print $1}')
+-PVID3=$(pvs "$dev3" --noheading -o uuid | tr -d - | awk '{print $1}')
+-
+-_clear_online_files
+-
+-udevadm trigger -c add /sys/block/$BDEV1 &
+-udevadm trigger -c add /sys/block/$BDEV2 &
+-udevadm trigger -c add /sys/block/$BDEV3
+-
+-aux udev_wait
+-wait_lvm_activate $vg3
+-
+-ls "$RUNDIR/lvm/pvs_online/$PVID1"
+-ls "$RUNDIR/lvm/pvs_online/$PVID2"
+-ls "$RUNDIR/lvm/pvs_online/$PVID3"
+-ls "$RUNDIR/lvm/vgs_online/$vg3"
+-journalctl -u lvm-activate-$vg3 | tee out || true
+-grep "now active" out
+-check lv_field $vg3/$lv1 lv_active "active"
+-check lv_field $vg3/$lv2 lv_active "active"
+-check lv_field $vg3/$lv3 lv_active "active"
+-check lv_field $vg3/$lv4 lv_active "active"
+-
+-vgchange -an $vg3
+-vgremove -y $vg3
+-
+-
+-# 3 devs, 1 vg, 4 lvs, concurrent pvscans, metadata on only 1 PV
+-
+-wipe_all
+-rm $DF
+-touch $DF
+-pvcreate --metadatacopies 0 "$dev1"
+-pvcreate --metadatacopies 0 "$dev2"
+-pvcreate "$dev3"
+-
+-vgcreate $vg4 "$dev1" "$dev2" "$dev3"
+-lvcreate -l1 -an -n $lv1 $vg4 "$dev1"
+-lvcreate -l1 -an -n $lv2 $vg4 "$dev2"
+-lvcreate -l1 -an -n $lv3 $vg4 "$dev3"
+-lvcreate -l8 -an -n $lv4 -i 2 $vg4 "$dev1" "$dev2"
+-
+-PVID1=$(pvs "$dev1" --noheading -o uuid | tr -d - | awk '{print $1}')
+-PVID2=$(pvs "$dev2" --noheading -o uuid | tr -d - | awk '{print $1}')
+-PVID3=$(pvs "$dev3" --noheading -o uuid | tr -d - | awk '{print $1}')
+-
+-_clear_online_files
+-
+-udevadm trigger -c add /sys/block/$BDEV1 &
+-udevadm trigger -c add /sys/block/$BDEV2 &
+-udevadm trigger -c add /sys/block/$BDEV3
+-
+-aux udev_wait
+-wait_lvm_activate $vg4
+-
+-ls "$RUNDIR/lvm/pvs_online/$PVID1"
+-ls "$RUNDIR/lvm/pvs_online/$PVID2"
+-ls "$RUNDIR/lvm/pvs_online/$PVID3"
+-ls "$RUNDIR/lvm/vgs_online/$vg4"
+-journalctl -u lvm-activate-$vg4 | tee out || true
+-grep "now active" out
+-check lv_field $vg4/$lv1 lv_active "active"
+-check lv_field $vg4/$lv2 lv_active "active"
+-check lv_field $vg4/$lv3 lv_active "active"
+-check lv_field $vg4/$lv4 lv_active "active"
+-
+-vgchange -an $vg4
+-vgremove -y $vg4
+-
+-
+-# 3 devs, 3 vgs, 2 lvs in each vg, concurrent pvscans
+-
+-wipe_all
+-rm $DF
+-touch $DF
+-
+-vgcreate $vg5 "$dev1"
+-vgcreate $vg6 "$dev2"
+-vgcreate $vg7 "$dev3"
+-lvcreate -l1 -an -n $lv1 $vg5
+-lvcreate -l1 -an -n $lv2 $vg5
+-lvcreate -l1 -an -n $lv1 $vg6
+-lvcreate -l1 -an -n $lv2 $vg6
+-lvcreate -l1 -an -n $lv1 $vg7
+-lvcreate -l1 -an -n $lv2 $vg7
+-
+-_clear_online_files
+-
+-udevadm trigger -c add /sys/block/$BDEV1 &
+-udevadm trigger -c add /sys/block/$BDEV2 &
+-udevadm trigger -c add /sys/block/$BDEV3
+-
+-aux udev_wait
+-wait_lvm_activate $vg5
+-wait_lvm_activate $vg6
+-wait_lvm_activate $vg7
+-
+-ls "$RUNDIR/lvm/vgs_online/$vg5"
+-ls "$RUNDIR/lvm/vgs_online/$vg6"
+-ls "$RUNDIR/lvm/vgs_online/$vg7"
+-journalctl -u lvm-activate-$vg5 | tee out || true
+-grep "now active" out
+-journalctl -u lvm-activate-$vg6 | tee out || true
+-grep "now active" out
+-journalctl -u lvm-activate-$vg7 | tee out || true
+-grep "now active" out
+-check lv_field $vg5/$lv1 lv_active "active"
+-check lv_field $vg5/$lv2 lv_active "active"
+-check lv_field $vg6/$lv1 lv_active "active"
+-check lv_field $vg6/$lv2 lv_active "active"
+-check lv_field $vg7/$lv1 lv_active "active"
+-check lv_field $vg7/$lv2 lv_active "active"
+-
+-vgchange -an $vg5
+-vgremove -y $vg5
+-vgchange -an $vg6
+-vgremove -y $vg6
+-vgchange -an $vg7
+-vgremove -y $vg7
+-
+-# 3 devs, 1 vg, 1000 LVs
+-
+-wipe_all
+-rm $DF
+-touch $DF
+-pvcreate --metadatacopies 0 "$dev1"
+-pvcreate "$dev2"
+-pvcreate "$dev3"
+-vgcreate -s 128K $vg8 "$dev1" "$dev2" "$dev3"
+-
+-# Number of LVs to create
+-TEST_DEVS=1000
+-# On low-memory boxes let's not stress too much
+-test "$(aux total_mem)" -gt 524288 || TEST_DEVS=256
+-
+-vgcfgbackup -f data $vg8
+-
+-# Generate a lot of devices (size of 1 extent)
+-awk -v TEST_DEVS=$TEST_DEVS '/^\t\}/ {
+-    printf("\t}\n\tlogical_volumes {\n");
+-    cnt=0;
+-    for (i = 0; i < TEST_DEVS; i++) {
+-        printf("\t\tlvol%06d  {\n", i);
+-        printf("\t\t\tid = \"%06d-1111-2222-3333-2222-1111-%06d\"\n", i, i);
+-        print "\t\t\tstatus = [\"READ\", \"WRITE\", \"VISIBLE\"]";
+-        print "\t\t\tsegment_count = 1";
+-        print "\t\t\tsegment1 {";
+-        print "\t\t\t\tstart_extent = 0";
+-        print "\t\t\t\textent_count = 1";
+-        print "\t\t\t\ttype = \"striped\"";
+-        print "\t\t\t\tstripe_count = 1";
+-        print "\t\t\t\tstripes = [";
+-        print "\t\t\t\t\t\"pv0\", " cnt++;
+-        printf("\t\t\t\t]\n\t\t\t}\n\t\t}\n");
+-      }
+-  }
+-  {print}
+-' data >data_new
+-
+-vgcfgrestore -f data_new $vg8
+-
+-_clear_online_files
+-
+-udevadm trigger -c add /sys/block/$BDEV1 &
+-udevadm trigger -c add /sys/block/$BDEV2 &
+-udevadm trigger -c add /sys/block/$BDEV3
+-
+-aux udev_wait
+-wait_lvm_activate $vg8
+-
+-ls "$RUNDIR/lvm/vgs_online/$vg8"
+-journalctl -u lvm-activate-$vg8 | tee out || true
+-grep "now active" out
+-
+-num_active=$(lvs $vg8 --noheading -o active | grep active | wc -l)
+-
+-test $num_active -eq $TEST_DEVS
+-
+-vgchange -an $vg8
+-vgremove -y $vg8
+-
+-# 1 pv on an md dev, 1 vg
+-
+-wait_md_create() {
+-	local md=$1
+-
+-	while :; do
+-		if ! grep "$(basename $md)" /proc/mdstat; then
+-			echo "$md not ready"
+-			cat /proc/mdstat
+-			sleep 2
+-		else
+-			break
+-		fi
+-	done
+-	echo "$md" > WAIT_MD_DEV
+-}
+-
+-test -f /proc/mdstat && grep -q raid1 /proc/mdstat || \
+-       modprobe raid1 || skip
+-
+-mddev="/dev/md33"
+-not grep $mddev /proc/mdstat || skip
+-
+-wipe_all
+-rm $DF
+-touch $DF
+-
+-mdadm --create --metadata=1.0 "$mddev" --level 1 --chunk=64 --raid-devices=2 "$dev1" "$dev2"
+-wait_md_create "$mddev"
+-vgcreate $vg9 "$mddev"
+-
+-PVIDMD=`pvs $mddev --noheading -o uuid | tr -d - | awk '{print $1}'`
+-BDEVMD=$(basename "$mddev")
+-
+-lvcreate -l1 -an -n $lv1 $vg9
+-lvcreate -l1 -an -n $lv2 $vg9
+-
+-_clear_online_files
+-
+-udevadm trigger --settle -c add /sys/block/$BDEVMD
+-
+-wait_lvm_activate $vg9
+-
+-ls "$RUNDIR/lvm/vgs_online/$vg9"
+-journalctl -u lvm-activate-$vg9 | tee out || true
+-grep "now active" out
+-check lv_field $vg9/$lv1 lv_active "active"
+-check lv_field $vg9/$lv2 lv_active "active"
+-
+-vgchange -an $vg9
+-vgremove -y $vg9
+-
+-mdadm --stop "$mddev"
+-aux udev_wait
+-wipe_all
+-
+diff --git a/udev/69-dm-lvm.rules.in b/udev/69-dm-lvm.rules.in
+deleted file mode 100644
+index 39e5b9807..000000000
+--- a/udev/69-dm-lvm.rules.in
++++ /dev/null
+@@ -1,87 +0,0 @@
+-# Copyright (C) 2012,2021 Red Hat, Inc. All rights reserved.
+-#
+-# This file is part of LVM.
+-#
+-# This rule requires blkid to be called on block devices before so only devices
+-# used as LVM PVs are processed (ID_FS_TYPE="LVM2_member").
+-
+-SUBSYSTEM!="block", GOTO="lvm_end"
+-(LVM_EXEC_RULE)
+-
+-ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG}=="1", GOTO="lvm_end"
+-
+-# Only process devices already marked as a PV - this requires blkid to be called before.
+-ENV{ID_FS_TYPE}!="LVM2_member", GOTO="lvm_end"
+-ENV{DM_MULTIPATH_DEVICE_PATH}=="1", GOTO="lvm_end"
+-ACTION=="remove", GOTO="lvm_end"
+-
+-# Create /dev/disk/by-id/lvm-pv-uuid-<PV_UUID> symlink for each PV
+-ENV{ID_FS_UUID_ENC}=="?*", SYMLINK+="disk/by-id/lvm-pv-uuid-$env{ID_FS_UUID_ENC}"
+-
+-# If the PV is a special device listed below, scan only if the device is
+-# properly activated. These devices are not usable after an ADD event,
+-# but they require an extra setup and they are ready after a CHANGE event.
+-# Also support coldplugging with ADD event but only if the device is already
+-# properly activated.
+-# This logic should be eventually moved to rules where those particular
+-# devices are processed primarily (MD and loop).
+-
+-# DM device:
+-KERNEL!="dm-[0-9]*", GOTO="next"
+-ENV{DM_UDEV_PRIMARY_SOURCE_FLAG}=="1", ENV{DM_ACTIVATION}=="1", GOTO="lvm_scan"
+-GOTO="lvm_end"
+-
+-# MD device:
+-LABEL="next"
+-KERNEL!="md[0-9]*", GOTO="next"
+-IMPORT{db}="LVM_MD_PV_ACTIVATED"
+-ACTION=="add", ENV{LVM_MD_PV_ACTIVATED}=="1", GOTO="lvm_scan"
+-ACTION=="change", ENV{LVM_MD_PV_ACTIVATED}!="1", TEST=="md/array_state", ENV{LVM_MD_PV_ACTIVATED}="1", GOTO="lvm_scan"
+-ACTION=="add", KERNEL=="md[0-9]*p[0-9]*", GOTO="lvm_scan"
+-ENV{LVM_MD_PV_ACTIVATED}!="1", ENV{SYSTEMD_READY}="0"
+-GOTO="lvm_end"
+-
+-# Loop device:
+-LABEL="next"
+-KERNEL!="loop[0-9]*", GOTO="next"
+-ACTION=="add", ENV{LVM_LOOP_PV_ACTIVATED}=="1", GOTO="lvm_scan"
+-ACTION=="change", ENV{LVM_LOOP_PV_ACTIVATED}!="1", TEST=="loop/backing_file", ENV{LVM_LOOP_PV_ACTIVATED}="1", GOTO="lvm_scan"
+-ENV{LVM_LOOP_PV_ACTIVATED}!="1", ENV{SYSTEMD_READY}="0"
+-GOTO="lvm_end"
+-
+-LABEL="next"
+-ACTION!="add", GOTO="lvm_end"
+-
+-LABEL="lvm_scan"
+-
+-ENV{SYSTEMD_READY}="1"
+-
+-# pvscan will check if this device completes a VG,
+-# i.e. all PVs in the VG are now present with the
+-# arrival of this PV.  If so, it prints to stdout:
+-# LVM_VG_NAME_COMPLETE='foo'
+-#
+-# When the VG is complete it can be activated, so
+-# vgchange -aay <vgname> is run.  It is run via
+-# systemd since it can take longer to run than
+-# udev wants to block when processing rules.
+-# (if there are hundreds of LVs to activate,
+-# the vgchange can take many seconds.)
+-#
+-# pvscan only reads the single device specified,
+-# and uses temp files under /run/lvm to check if
+-# other PVs in the VG are present.
+-#
+-# If event_activation=0 in lvm.conf, this pvscan
+-# (using checkcomplete) will do nothing, so that
+-# no event-based autoactivation will be happen.
+-#
+-# TODO: adjust the output of vgchange -aay so that
+-# it's better suited to appearing in the journal.
+-
+-IMPORT{program}="(LVM_EXEC)/lvm pvscan --cache --listvg --checkcomplete --vgonline --udevoutput --journal=output $env{DEVNAME}"
+-ENV{LVM_VG_NAME_COMPLETE}=="?*", RUN+="/usr/bin/systemd-run -r --no-block --property DefaultDependencies=no --unit lvm-activate-$env{LVM_VG_NAME_COMPLETE} lvm vgchange -aay --nohints $env{LVM_VG_NAME_COMPLETE}"
+-GOTO="lvm_end"
+-
+-LABEL="lvm_end"
+-
+diff --git a/udev/Makefile.in b/udev/Makefile.in
+index e777dda16..e32cba921 100644
+--- a/udev/Makefile.in
++++ b/udev/Makefile.in
+@@ -18,7 +18,7 @@ top_builddir = @top_builddir@
+ include $(top_builddir)/make.tmpl
+ 
+ DM_RULES=10-dm.rules 13-dm-disk.rules 95-dm-notify.rules
+-LVM_RULES=11-dm-lvm.rules 69-dm-lvm.rules
++LVM_RULES=11-dm-lvm.rules 69-dm-lvm-metad.rules
+ 
+ DM_DIR=$(shell $(GREP) "\#define DM_DIR" $(top_srcdir)/libdm/misc/dm-ioctl.h | $(AWK) '{print $$3}')
+ 
+-- 
+2.31.1
+
diff --git a/SOURCES/0002-Revert-pvscan-only-add-device-args-to-dev-cache.patch b/SOURCES/0002-Revert-pvscan-only-add-device-args-to-dev-cache.patch
new file mode 100644
index 0000000..700fa84
--- /dev/null
+++ b/SOURCES/0002-Revert-pvscan-only-add-device-args-to-dev-cache.patch
@@ -0,0 +1,450 @@
+From 55bea5a26812ed573bc6f5c534113e140fcbbd4e Mon Sep 17 00:00:00 2001
+From: Marian Csontos <mcsontos@redhat.com>
+Date: Fri, 3 Dec 2021 17:11:27 +0100
+Subject: [PATCH 2/2] Revert "pvscan: only add device args to dev cache"
+
+This reverts commit 33e47182f773c1a902b533580b63a803906de55d.
+---
+ lib/device/dev-cache.c          | 204 +++-----------------------------
+ lib/device/dev-cache.h          |   6 +-
+ lib/device/device_id.c          |  27 ++---
+ lib/device/device_id.h          |   1 -
+ test/shell/devicesfile-basic.sh |   2 +-
+ tools/pvscan.c                  |  58 ++++-----
+ 6 files changed, 52 insertions(+), 246 deletions(-)
+
+diff --git a/lib/device/dev-cache.c b/lib/device/dev-cache.c
+index 33b75a9a9..c6e5f68cf 100644
+--- a/lib/device/dev-cache.c
++++ b/lib/device/dev-cache.c
+@@ -1852,7 +1852,7 @@ int setup_devices_file(struct cmd_context *cmd)
+  * Add all system devices to dev-cache, and attempt to
+  * match all devices_file entries to dev-cache entries.
+  */
+-int setup_devices(struct cmd_context *cmd)
++static int _setup_devices(struct cmd_context *cmd, int no_file_match)
+ {
+ 	int file_exists;
+ 	int lock_mode = 0;
+@@ -1979,6 +1979,13 @@ int setup_devices(struct cmd_context *cmd)
+ 	 */
+ 	dev_cache_scan(cmd);
+ 
++	/*
++	 * The caller uses "no_file_match" if it wants to match specific devs
++	 * itself, instead of matching everything in device_ids_match.
++	 */
++	if (no_file_match && cmd->enable_devices_file)
++		return 1;
++
+ 	/*
+ 	 * Match entries from cmd->use_devices with device structs in dev-cache.
+ 	 */
+@@ -1987,6 +1994,16 @@ int setup_devices(struct cmd_context *cmd)
+ 	return 1;
+ }
+ 
++int setup_devices(struct cmd_context *cmd)
++{
++	return _setup_devices(cmd, 0);
++}
++
++int setup_devices_no_file_match(struct cmd_context *cmd)
++{
++	return _setup_devices(cmd, 1);
++}
++
+ /*
+  * The alternative to setup_devices() when the command is interested
+  * in using only one PV.
+@@ -2055,188 +2072,3 @@ int setup_device(struct cmd_context *cmd, const char *devname)
+ 	return 1;
+ }
+ 
+-/*
+- * pvscan --cache is specialized/optimized to look only at command args,
+- * so this just sets up the devices file, then individual devices are
+- * added to dev-cache and matched with device_ids later in pvscan.
+- */
+-
+-int setup_devices_for_pvscan_cache(struct cmd_context *cmd)
+-{
+-	if (cmd->enable_devices_list) {
+-		if (!_setup_devices_list(cmd))
+-			return_0;
+-		return 1;
+-	}
+-
+-	if (!setup_devices_file(cmd))
+-		return_0;
+-
+-	if (!cmd->enable_devices_file)
+-		return 1;
+-
+-	if (!devices_file_exists(cmd)) {
+-		log_debug("Devices file not found, ignoring.");
+-		cmd->enable_devices_file = 0;
+-		return 1;
+-	}
+-
+-	if (!lock_devices_file(cmd, LOCK_SH)) {
+-		log_error("Failed to lock the devices file to read.");
+-		return 0;
+-	}
+-
+-	if (!device_ids_read(cmd)) {
+-		log_error("Failed to read the devices file.");
+-		unlock_devices_file(cmd);
+-		return 0;
+-	}
+-
+-	unlock_devices_file(cmd);
+-	return 1;
+-}
+-
+-
+-/* Get a device name from a devno. */
+-
+-static char *_get_devname_from_devno(struct cmd_context *cmd, dev_t devno)
+-{
+-	char path[PATH_MAX];
+-	char devname[PATH_MAX];
+-	char namebuf[NAME_LEN];
+-	char line[1024];
+-	int major = MAJOR(devno);
+-	int minor = MINOR(devno);
+-	int line_major;
+-	int line_minor;
+-	uint64_t line_blocks;
+-	DIR *dir;
+-	struct dirent *dirent;
+-	FILE *fp;
+-
+-	/*
+-	 * $ ls /sys/dev/block/8:0/device/block/
+-	 * sda
+-	 */
+-	if (major_is_scsi_device(cmd->dev_types, major)) {
+-		if (dm_snprintf(path, sizeof(path), "%sdev/block/%d:%d/device/block",
+-				dm_sysfs_dir(), major, minor) < 0) {
+-			return NULL;
+-		}
+-
+-		if (!(dir = opendir(path)))
+-			return NULL;
+-
+-		while ((dirent = readdir(dir))) {
+-			if (dirent->d_name[0] == '.')
+-				continue;
+-			if (dm_snprintf(devname, sizeof(devname), "/dev/%s", dirent->d_name) < 0) {
+-				devname[0] = '\0';
+-				stack;
+-			}
+-			break;
+-		}
+-		closedir(dir);
+-
+-		if (devname[0]) {
+-			log_debug("Found %s for %d:%d from sys", devname, major, minor);
+-			return _strdup(devname);
+-		}
+-		return NULL;
+-	}
+-
+-	/*
+-	 * $ cat /sys/dev/block/253:3/dm/name
+-	 * mpatha
+-	 */
+-	if (major == cmd->dev_types->device_mapper_major) {
+-		if (dm_snprintf(path, sizeof(path), "%sdev/block/%d:%d/dm/name",
+-				dm_sysfs_dir(), major, minor) < 0) {
+-			return NULL;
+-		}
+-
+-		if (!get_sysfs_value(path, namebuf, sizeof(namebuf), 0))
+-			return NULL;
+-
+-		if (dm_snprintf(devname, sizeof(devname), "/dev/mapper/%s", namebuf) < 0) {
+-			devname[0] = '\0';
+-			stack;
+-		}
+-
+-		if (devname[0]) {
+-			log_debug("Found %s for %d:%d from sys", devname, major, minor);
+-			return _strdup(devname);
+-		}
+-		return NULL;
+-	}
+-
+-	/*
+-	 * /proc/partitions lists
+-	 * major minor #blocks name
+-	 */
+-
+-	if (!(fp = fopen("/proc/partitions", "r")))
+-		return NULL;
+-
+-	while (fgets(line, sizeof(line), fp)) {
+-		if (sscanf(line, "%u %u %llu %s", &line_major, &line_minor, (unsigned long long *)&line_blocks, namebuf) != 4)
+-			continue;
+-		if (line_major != major)
+-			continue;
+-		if (line_minor != minor)
+-			continue;
+-
+-		if (dm_snprintf(devname, sizeof(devname), "/dev/%s", namebuf) < 0) {
+-			devname[0] = '\0';
+-			stack;
+-		}
+-		break;
+-	}
+-	fclose(fp);
+-
+-	if (devname[0]) {
+-		log_debug("Found %s for %d:%d from proc", devname, major, minor);
+-		return _strdup(devname);
+-	}
+-
+-	/*
+-	 * If necessary, this could continue searching by stat'ing /dev entries.
+-	 */
+-
+-	return NULL;
+-}
+-
+-int setup_devname_in_dev_cache(struct cmd_context *cmd, const char *devname)
+-{
+-	struct stat buf;
+-	struct device *dev;
+-
+-	if (stat(devname, &buf) < 0) {
+-		log_error("Cannot access device %s.", devname);
+-		return 0;
+-	}
+-
+-	if (!S_ISBLK(buf.st_mode)) {
+-		log_error("Invaild device type %s.", devname);
+-		return 0;
+-	}
+-
+-	if (!_insert_dev(devname, buf.st_rdev))
+-		return_0;
+-
+-	if (!(dev = (struct device *) dm_hash_lookup(_cache.names, devname)))
+-		return_0;
+-
+-	return 1;
+-}
+-
+-int setup_devno_in_dev_cache(struct cmd_context *cmd, dev_t devno)
+-{
+-	const char *devname;
+-
+-	if (!(devname = _get_devname_from_devno(cmd, devno)))
+-		return_0;
+-
+-	return setup_devname_in_dev_cache(cmd, devname);
+-}
+-
+diff --git a/lib/device/dev-cache.h b/lib/device/dev-cache.h
+index 143848d6d..635dc4fc9 100644
+--- a/lib/device/dev-cache.h
++++ b/lib/device/dev-cache.h
+@@ -77,11 +77,7 @@ int get_dm_uuid_from_sysfs(char *buf, size_t buf_size, int major, int minor);
+ 
+ int setup_devices_file(struct cmd_context *cmd);
+ int setup_devices(struct cmd_context *cmd);
++int setup_devices_no_file_match(struct cmd_context *cmd);
+ int setup_device(struct cmd_context *cmd, const char *devname);
+ 
+-/* Normal device setup functions are split up for pvscan optimization. */
+-int setup_devices_for_pvscan_cache(struct cmd_context *cmd);
+-int setup_devname_in_dev_cache(struct cmd_context *cmd, const char *devname);
+-int setup_devno_in_dev_cache(struct cmd_context *cmd, dev_t devno);
+-
+ #endif
+diff --git a/lib/device/device_id.c b/lib/device/device_id.c
+index 167bf661b..eb06109ff 100644
+--- a/lib/device/device_id.c
++++ b/lib/device/device_id.c
+@@ -1534,22 +1534,6 @@ int device_ids_match_dev(struct cmd_context *cmd, struct device *dev)
+  * passes the filter.
+  */
+ 
+-void device_ids_match_device_list(struct cmd_context *cmd)
+-{
+-	struct dev_use *du;
+-
+-	dm_list_iterate_items(du, &cmd->use_devices) {
+-		if (du->dev)
+-			continue;
+-		if (!(du->dev = dev_cache_get(cmd, du->devname, NULL))) {
+-			log_warn("Device not found for %s.", du->devname);
+-		} else {
+-			/* Should we set dev->id?  Which idtype?  Use --deviceidtype? */
+-			du->dev->flags |= DEV_MATCHED_USE_ID;
+-		}
+-	}
+-}
+-
+ void device_ids_match(struct cmd_context *cmd)
+ {
+ 	struct dev_iter *iter;
+@@ -1557,7 +1541,16 @@ void device_ids_match(struct cmd_context *cmd)
+ 	struct device *dev;
+ 
+ 	if (cmd->enable_devices_list) {
+-		device_ids_match_device_list(cmd);
++		dm_list_iterate_items(du, &cmd->use_devices) {
++			if (du->dev)
++				continue;
++			if (!(du->dev = dev_cache_get(cmd, du->devname, NULL))) {
++				log_warn("Device not found for %s.", du->devname);
++			} else {
++				/* Should we set dev->id?  Which idtype?  Use --deviceidtype? */
++				du->dev->flags |= DEV_MATCHED_USE_ID;
++			}
++		}
+ 		return;
+ 	}
+ 
+diff --git a/lib/device/device_id.h b/lib/device/device_id.h
+index 0ada35c94..939b3a0f4 100644
+--- a/lib/device/device_id.h
++++ b/lib/device/device_id.h
+@@ -32,7 +32,6 @@ int device_id_add(struct cmd_context *cmd, struct device *dev, const char *pvid,
+ void device_id_pvremove(struct cmd_context *cmd, struct device *dev);
+ void device_ids_match(struct cmd_context *cmd);
+ int device_ids_match_dev(struct cmd_context *cmd, struct device *dev);
+-void device_ids_match_device_list(struct cmd_context *cmd);
+ void device_ids_validate(struct cmd_context *cmd, struct dm_list *scanned_devs, int *device_ids_invalid, int noupdate);
+ int device_ids_version_unchanged(struct cmd_context *cmd);
+ void device_ids_find_renamed_devs(struct cmd_context *cmd, struct dm_list *dev_list, int *search_count, int noupdate);
+diff --git a/test/shell/devicesfile-basic.sh b/test/shell/devicesfile-basic.sh
+index 9c3455c76..7ba9e2c7f 100644
+--- a/test/shell/devicesfile-basic.sh
++++ b/test/shell/devicesfile-basic.sh
+@@ -283,7 +283,7 @@ not ls "$RUNDIR/lvm/pvs_online/$PVID3"
+ # arg in devices list
+ _clear_online_files
+ pvscan --devices "$dev3" --cache -aay "$dev3"
+-pvscan --devices "$dev4","$dev3" --cache -aay "$dev4"
++pvscan --devices "$dev4" --cache -aay "$dev4"
+ check lv_field $vg2/$lv2 lv_active "active"
+ vgchange -an $vg2
+ 
+diff --git a/tools/pvscan.c b/tools/pvscan.c
+index 95d593d57..8e2611361 100644
+--- a/tools/pvscan.c
++++ b/tools/pvscan.c
+@@ -857,21 +857,11 @@ static int _get_devs_from_saved_vg(struct cmd_context *cmd, const char *vgname,
+ 
+ 		devno = MKDEV(file_major, file_minor);
+ 
+-		if (!setup_devno_in_dev_cache(cmd, devno)) {
+-			log_error_pvscan(cmd, "No device set up for %d:%d PVID %s", file_major, file_minor, pvid);
+-			goto bad;
+-		}
+-
+ 		if (!(dev = dev_cache_get_by_devt(cmd, devno, NULL, NULL))) {
+ 			log_error_pvscan(cmd, "No device found for %d:%d PVID %s", file_major, file_minor, pvid);
+ 			goto bad;
+ 		}
+ 
+-		/*
+-		 * Do not need to match device_id here, see comment after
+-		 * get_devs_from_saved_vg about relying on pvid online file.
+-		 */
+-
+ 		name1 = dev_name(dev);
+ 		name2 = pvl->pv->device_hint;
+ 
+@@ -1109,11 +1099,17 @@ static int _pvscan_aa(struct cmd_context *cmd, struct pvscan_aa_params *pp,
+ 		 * PROCESS_SKIP_SCAN: we have already done lvmcache_label_scan
+ 		 * so tell process_each to skip it.
+ 		 */
++		if (do_all)
++			read_flags |= PROCESS_SKIP_SCAN;
+ 
++		/*
++		 * When the command is processing specific devs (not all), it
++		 * has done setup_devices_no_file_match() to avoid matching ids
++		 * fo all devs unnecessarily, but now that we're falling back
++		 * to process_each_vg() we need to complete the id matching.
++		 */
+ 		if (!do_all)
+-			lvmcache_label_scan(cmd);
+-
+-		read_flags |= PROCESS_SKIP_SCAN;
++			device_ids_match(cmd);
+ 
+ 		ret = process_each_vg(cmd, 0, NULL, NULL, vgnames, read_flags, 0, handle, _pvscan_aa_single);
+ 	}
+@@ -1196,15 +1192,11 @@ static int _get_args_devs(struct cmd_context *cmd, struct dm_list *pvscan_args,
+ 	/* in common usage, no dev will be found for a devno */
+ 
+ 	dm_list_iterate_items(arg, pvscan_args) {
+-		if (arg->devname) {
+-			if (!setup_devname_in_dev_cache(cmd, arg->devname))
+-				log_error_pvscan(cmd, "No device set up for name arg %s", arg->devname);
++		if (arg->devname)
+ 			arg->dev = dev_cache_get(cmd, arg->devname, NULL);
+-		} else if (arg->devno) {
+-			if (!setup_devno_in_dev_cache(cmd, arg->devno))
+-				log_error_pvscan(cmd, "No device set up for devno arg %d", (int)arg->devno);
++		else if (arg->devno)
+ 			arg->dev = dev_cache_get_by_devt(cmd, arg->devno, NULL, NULL);
+-		} else
++		else
+ 			return_0;
+ 	}
+ 
+@@ -1680,13 +1672,11 @@ static int _pvscan_cache_args(struct cmd_context *cmd, int argc, char **argv,
+ 	cmd->pvscan_cache_single = 1;
+ 
+ 	/*
+-	 * Special pvscan-specific setup steps to avoid looking
+-	 * at any devices except for device args.
+-	 * Read devices file and determine if devices file will be used.
+-	 * Does not do dev_cache_scan (adds nothing to dev-cache), and
+-	 * does not do any device id matching.
++	 * "no_file_match" means that when the devices file is used,
++	 * setup_devices will skip matching devs to devices file entries.
++	 * Specific devs must be matched later with device_ids_match_dev().
+ 	 */
+-	if (!setup_devices_for_pvscan_cache(cmd)) {
++	if (!setup_devices_no_file_match(cmd)) {
+ 		log_error_pvscan(cmd, "Failed to set up devices.");
+ 		return 0;
+ 	}
+@@ -1745,21 +1735,17 @@ static int _pvscan_cache_args(struct cmd_context *cmd, int argc, char **argv,
+ 	log_debug("pvscan_cache_args: filter devs nodata");
+ 
+ 	/*
+-	 * Match dev args with the devices file because special/optimized
+-	 * device setup was used above which does not check the devices file.
+-	 * If a match fails here do not exclude it, that will be done below by
+-	 * passes_filter() which runs filter-deviceid. The
+-	 * relax_deviceid_filter case needs to be able to work around
++	 * Match dev args with the devices file because
++	 * setup_devices_no_file_match() was used above which skipped checking
++	 * the devices file.  If a match fails here do not exclude it, that
++	 * will be done below by passes_filter() which runs filter-deviceid.
++	 * The relax_deviceid_filter case needs to be able to work around
+ 	 * unmatching devs.
+ 	 */
+-
+ 	if (cmd->enable_devices_file) {
+-		dm_list_iterate_items(devl, &pvscan_devs)
++		dm_list_iterate_items_safe(devl, devl2, &pvscan_devs)
+ 			device_ids_match_dev(cmd, devl->dev);
+-
+ 	}
+-	if (cmd->enable_devices_list)
+-		device_ids_match_device_list(cmd);
+ 
+ 	if (cmd->enable_devices_file && device_ids_use_devname(cmd)) {
+ 		relax_deviceid_filter = 1;
+-- 
+2.31.1
+
diff --git a/SPECS/lvm2.spec b/SPECS/lvm2.spec
index a0ff032..0df5b4c 100644
--- a/SPECS/lvm2.spec
+++ b/SPECS/lvm2.spec
@@ -68,7 +68,7 @@ Version: 2.03.14
 %if 0%{?from_snapshot}
 Release: 0.1.20210426git%{shortcommit}%{?dist}%{?rel_suffix}
 %else
-Release: 1%{?dist}%{?rel_suffix}
+Release: 2%{?dist}%{?rel_suffix}
 %endif
 License: GPLv2
 URL: http://sourceware.org/lvm2
@@ -80,6 +80,8 @@ Patch0: lvm2-rhel8.patch
 %endif
 Patch1: lvm2-set-default-preferred_names.patch
 Patch2: lvm2-test-skip-problematic-tests.patch
+Patch3: 0001-Revert-new-udev-autoactivation.patch
+Patch4: 0002-Revert-pvscan-only-add-device-args-to-dev-cache.patch
 
 BuildRequires: gcc
 %if %{enable_testsuite}
@@ -142,6 +144,8 @@ or more physical volumes and creating one or more logical volumes
 %endif
 %patch1 -p1 -b .backup1
 %patch2 -p1 -b .backup2
+%patch3 -p1 -b .backup3
+%patch4 -p1 -b .backup4
 
 %build
 %global _default_pid_dir /run
@@ -377,7 +381,7 @@ systemctl start lvm2-lvmpolld.socket >/dev/null 2>&1 || :
 %{_mandir}/man8/vgscan.8.gz
 %{_mandir}/man8/vgsplit.8.gz
 %{_udevdir}/11-dm-lvm.rules
-%{_udevdir}/69-dm-lvm.rules
+%{_udevdir}/69-dm-lvm-metad.rules
 %if %{enable_lvmpolld}
 %{_mandir}/man8/lvmpolld.8.gz
 %{_mandir}/man8/lvm-lvpoll.8.gz
@@ -403,7 +407,7 @@ systemctl start lvm2-lvmpolld.socket >/dev/null 2>&1 || :
 %{_tmpfilesdir}/%{name}.conf
 %{_unitdir}/blk-availability.service
 %{_unitdir}/lvm2-monitor.service
-#%%{_unitdir}/lvm2-pvscan@.service
+%{_unitdir}/lvm2-pvscan@.service
 %attr(555, -, -) %{_prefix}/lib/systemd/system-generators/lvm2-activation-generator
 %if %{enable_lvmpolld}
 %{_unitdir}/lvm2-lvmpolld.socket
@@ -759,6 +763,9 @@ An extensive functional testsuite for LVM2.
 %endif
 
 %changelog
+* Fri Dec 17 2021 Marian Csontos <mcsontos@redhat.com> - 2.03.14-2
+- Revert autoactivation changes.
+
 * Wed Oct 20 2021 Marian Csontos <mcsontos@redhat.com> - 2.03.14-1
 - Update to upstream version 2.03.14.
 - See WHATS_NEW for list of changes.