base-files: upgrade: take down loop and LVM before upgrade
authorDaniel Golle <daniel@makrotopia.org>
Sat, 1 May 2021 19:21:54 +0000 (20:21 +0100)
committerDaniel Golle <daniel@makrotopia.org>
Wed, 5 May 2021 12:18:43 +0000 (13:18 +0100)
Users of devices with large block storage may choose to have an LVM
partition on the same device which is used for booting OpenWrt.
The presents a problem during sysupgrade as the root device is then
still busy and changing partitions will not work as desired,
leading to data corruption in case the newly flashed image is larger
than the currently installed one.
Having loop devices setup causes similar havoc.
Make sure all volume groups are offline and all loop devices have been
released before sysupgrade.

Signed-off-by: Daniel Golle <daniel@makrotopia.org>
package/base-files/files/lib/upgrade/stage2

index 23d356a447fa3b94c386e26792ecd3913a9bb6c0..e2259e347238b23dc1d6000390bab63f17f2e134 100755 (executable)
@@ -33,6 +33,9 @@ supivot() { # <new_root> <old_root>
 }
 
 switch_to_ramfs() {
+       RAMFS_COPY_LOSETUP="$(command -v losetup)"
+       RAMFS_COPY_LVM="$(command -v lvm)"
+
        for binary in \
                /bin/busybox /bin/ash /bin/sh /bin/mount /bin/umount    \
                pivot_root mount_root reboot sync kill sleep            \
@@ -43,6 +46,7 @@ switch_to_ramfs() {
                ubiupdatevol ubiattach ubiblock ubiformat               \
                ubidetach ubirsvol ubirmvol ubimkvol                    \
                snapshot snapshot_tool date                             \
+               $RAMFS_COPY_LOSETUP $RAMFS_COPY_LVM                     \
                $RAMFS_COPY_BIN
        do
                local file="$(command -v "$binary" 2>/dev/null)"
@@ -60,6 +64,12 @@ switch_to_ramfs() {
        /bin/mount -o remount,ro /mnt
        /bin/umount -l /mnt
 
+       [ "$RAMFS_COPY_LOSETUP" ] && losetup -D
+       [ "$RAMFS_COPY_LVM" ] && {
+               mkdir -p /tmp/lvm/cache
+               $RAMFS_COPY_LVM vgchange -aln --ignorelockingfailure
+       }
+
        grep /overlay /proc/mounts > /dev/null && {
                /bin/mount -o noatime,remount,ro /overlay
                /bin/umount -l /overlay