base-files: fix ubinized nand sysupgrade
authorRodrigo Balerdi <lanchon@gmail.com>
Tue, 3 May 2022 06:47:43 +0000 (03:47 -0300)
committerDaniel Golle <daniel@makrotopia.org>
Sun, 30 Oct 2022 14:29:56 +0000 (14:29 +0000)
It has been reported that ubinized nand sysupgrade fails under certain
circumstances, being unable to detach the existing ubi partition due to
volumes within the partition being mounted.

This is an attempt to solve such issues by unmounting and removing
ubiblock devices and unmounting ubi volumes within the target partition
prior to detaching and formatting it.

Signed-off-by: Rodrigo Balerdi <lanchon@gmail.com>
package/base-files/files/lib/upgrade/nand.sh
package/base-files/files/lib/upgrade/stage2

index 76a984483e0ae47b705a0c59f4e20b23e27ca42e..19e51c55c0de38b429a92241e0bc0e4dfa222ba4 100644 (file)
@@ -127,17 +127,41 @@ nand_restore_config() {
 }
 
 nand_remove_ubiblock() {
-       local ubivol=$1
-       local ubiblk=ubiblock${ubivol:3}
-       if [ -e /dev/$ubiblk ]; then
-               echo "removing $ubiblk"
-               if ! ubiblock -r /dev/$ubivol; then
+       local ubivol="$1"
+
+       local ubiblk="ubiblock${ubivol:3}"
+       if [ -e "/dev/$ubiblk" ]; then
+               umount "/dev/$ubiblk" && echo "unmounted /dev/$ubiblk" || :
+               if ! ubiblock -r "/dev/$ubivol"; then
                        echo "cannot remove $ubiblk"
                        return 1
                fi
        fi
 }
 
+nand_detach_ubi() {
+       local ubipart="$1"
+
+       local mtdnum="$( find_mtd_index "$ubipart" )"
+       if [ ! "$mtdnum" ]; then
+               echo "cannot find ubi mtd partition $ubipart"
+               return 1
+       fi
+
+       local ubidev="$( nand_find_ubi "$ubipart" )"
+       if [ "$ubidev" ]; then
+               for ubivol in $(find /dev -name "${ubidev}_*" -maxdepth 1 | sort); do
+                       ubivol="${ubivol:5}"
+                       nand_remove_ubiblock "$ubivol" || :
+                       umount "/dev/$ubivol" && echo "unmounted /dev/$ubivol" || :
+               done
+               if ! ubidetach -m "$mtdnum"; then
+                       echo "cannot detach ubi mtd partition $ubipart"
+                       return 1
+               fi
+       fi
+}
+
 nand_upgrade_prepare_ubi() {
        local rootfs_length="$1"
        local rootfs_type="$2"
@@ -235,15 +259,10 @@ nand_upgrade_prepare_ubi() {
 nand_upgrade_ubinized() {
        local ubi_file="$1"
 
-       local mtdnum="$( find_mtd_index "$CI_UBIPART" )"
-       if [ ! "$mtdnum" ]; then
-               echo "cannot find ubi mtd partition $CI_UBIPART"
-               return 1
-       fi
+       nand_detach_ubi "$CI_UBIPART" || return 1
 
-       local mtddev="/dev/mtd${mtdnum}"
-       ubidetach -p "${mtddev}" || :
-       ubiformat "${mtddev}" -y -f "${ubi_file}" && ubiattach -p "${mtddev}"
+       local mtdnum="$( find_mtd_index "$CI_UBIPART" )"
+       ubiformat "/dev/mtd$mtdnum" -y -f "$ubi_file" && ubiattach -m "$mtdnum"
 }
 
 # Write the UBIFS image to UBI rootfs volume
index 5e0d73631b0c7383f271c072988a95238a234832..97e0b881e9a0b5cc43db2f1184be373be63bfc7d 100755 (executable)
@@ -41,7 +41,7 @@ switch_to_ramfs() {
                pivot_root mount_root reboot sync kill sleep            \
                md5sum hexdump cat zcat dd tar                          \
                ls basename find cp mv rm mkdir rmdir mknod touch chmod \
-               '[' printf wc grep awk sed cut                          \
+               '[' printf wc grep awk sed cut sort                     \
                mtd partx losetup mkfs.ext4 nandwrite flash_erase       \
                ubiupdatevol ubiattach ubiblock ubiformat               \
                ubidetach ubirsvol ubirmvol ubimkvol                    \