[openwrt/openwrt] base-files: fix ubinized nand sysupgrade

LEDE Commits lede-commits at lists.infradead.org
Sun Oct 30 07:48:08 PDT 2022


dangole pushed a commit to openwrt/openwrt.git, branch master:
https://git.openwrt.org/af347335939531eeb5701f52549cc4d366eb60d5

commit af347335939531eeb5701f52549cc4d366eb60d5
Author: Rodrigo Balerdi <lanchon at gmail.com>
AuthorDate: Tue May 3 03:47:43 2022 -0300

    base-files: fix ubinized nand sysupgrade
    
    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 at gmail.com>
---
 package/base-files/files/lib/upgrade/nand.sh | 45 ++++++++++++++++++++--------
 package/base-files/files/lib/upgrade/stage2  |  2 +-
 2 files changed, 33 insertions(+), 14 deletions(-)

diff --git a/package/base-files/files/lib/upgrade/nand.sh b/package/base-files/files/lib/upgrade/nand.sh
index 76a984483e..19e51c55c0 100644
--- a/package/base-files/files/lib/upgrade/nand.sh
+++ b/package/base-files/files/lib/upgrade/nand.sh
@@ -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
diff --git a/package/base-files/files/lib/upgrade/stage2 b/package/base-files/files/lib/upgrade/stage2
index 5e0d73631b..97e0b881e9 100755
--- a/package/base-files/files/lib/upgrade/stage2
+++ b/package/base-files/files/lib/upgrade/stage2
@@ -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			\




More information about the lede-commits mailing list