base-files: fix ubinized nand sysupgrade
[openwrt/staging/dedeckeh.git] / package / base-files / files / lib / upgrade / nand.sh
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