base-files: improve sysupgrade ubiblock handling
[openwrt/openwrt.git] / package / base-files / files / lib / upgrade / nand.sh
index 9b29266479e3d3e3922551600b3e0c1dae34b9ba..ec1335cb2c94859d1444b0c6fa50dbff2efc2c2a 100644 (file)
@@ -114,6 +114,18 @@ nand_restore_config() {
        rmdir /tmp/new_root
 }
 
+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
+                       echo "cannot remove $ubiblk"
+                       return 1
+               fi
+       fi
+}
+
 nand_upgrade_prepare_ubi() {
        local rootfs_length="$1"
        local rootfs_type="$2"
@@ -136,38 +148,39 @@ nand_upgrade_prepare_ubi() {
                ubiattach -m "$mtdnum"
                sync
                ubidev="$( nand_find_ubi "$CI_UBIPART" )"
-       fi
 
-       if [ ! "$ubidev" ]; then
-               ubiformat /dev/mtd$mtdnum -y
-               ubiattach -m "$mtdnum"
-               sync
-               ubidev="$( nand_find_ubi "$CI_UBIPART" )"
-               [ "$has_env" -gt 0 ] && {
-                       ubimkvol /dev/$ubidev -n 0 -N ubootenv -s 1MiB
-                       ubimkvol /dev/$ubidev -n 1 -N ubootenv2 -s 1MiB
-               }
+               if [ ! "$ubidev" ]; then
+                       ubiformat /dev/mtd$mtdnum -y
+                       ubiattach -m "$mtdnum"
+                       sync
+                       ubidev="$( nand_find_ubi "$CI_UBIPART" )"
+
+                       if [ ! "$ubidev" ]; then
+                               echo "cannot attach ubi mtd partition $CI_UBIPART"
+                               return 1
+                       fi
+
+                       if [ "$has_env" -gt 0 ]; then
+                               ubimkvol /dev/$ubidev -n 0 -N ubootenv -s 1MiB
+                               ubimkvol /dev/$ubidev -n 1 -N ubootenv2 -s 1MiB
+                       fi
+               fi
        fi
 
        local kern_ubivol="$( nand_find_volume $ubidev $CI_KERNPART )"
        local root_ubivol="$( nand_find_volume $ubidev $CI_ROOTPART )"
        local data_ubivol="$( nand_find_volume $ubidev rootfs_data )"
+       [ "$root_ubivol" = "$kern_ubivol" ] && root_ubivol=
 
-       local ubiblk ubiblkvol
-       for ubiblk in /dev/ubiblock*_? ; do
-               [ -e "$ubiblk" ] || continue
-               echo "removing ubiblock${ubiblk:13}"
-               ubiblkvol=ubi${ubiblk:13}
-               if ! ubiblock -r /dev/$ubiblkvol; then
-                       echo "cannot remove $ubiblk"
-                       return 1
-               fi
-       done
+       # remove ubiblocks
+       [ "$kern_ubivol" ] && { nand_remove_ubiblock $kern_ubivol || return 1; }
+       [ "$root_ubivol" ] && { nand_remove_ubiblock $root_ubivol || return 1; }
+       [ "$data_ubivol" ] && { nand_remove_ubiblock $data_ubivol || return 1; }
 
        # kill volumes
-       [ "$kern_ubivol" ] && ubirmvol /dev/$ubidev -N $CI_KERNPART || true
-       [ "$root_ubivol" -a "$root_ubivol" != "$kern_ubivol" ] && ubirmvol /dev/$ubidev -N $CI_ROOTPART || true
-       [ "$data_ubivol" ] && ubirmvol /dev/$ubidev -N rootfs_data || true
+       [ "$kern_ubivol" ] && ubirmvol /dev/$ubidev -N $CI_KERNPART || :
+       [ "$root_ubivol" ] && ubirmvol /dev/$ubidev -N $CI_ROOTPART || :
+       [ "$data_ubivol" ] && ubirmvol /dev/$ubidev -N rootfs_data || :
 
        # update kernel
        if [ -n "$kernel_length" ]; then
@@ -193,18 +206,15 @@ nand_upgrade_prepare_ubi() {
 
        # create rootfs_data for non-ubifs rootfs
        if [ "$rootfs_type" != "ubifs" ]; then
-               local availeb=$(cat /sys/devices/virtual/ubi/$ubidev/avail_eraseblocks)
-               local ebsize=$(cat /sys/devices/virtual/ubi/$ubidev/eraseblock_size)
-               local avail_size=$((availeb * ebsize))
                local rootfs_data_size_param="-m"
-               if [ -n "$rootfs_data_max" ] &&
-                  [ "$rootfs_data_max" != "0" ] &&
-                  [ "$rootfs_data_max" -le "$avail_size" ]; then
+               if [ -n "$rootfs_data_max" ]; then
                        rootfs_data_size_param="-s $rootfs_data_max"
                fi
                if ! ubimkvol /dev/$ubidev -N rootfs_data $rootfs_data_size_param; then
-                       echo "cannot initialize rootfs_data volume"
-                       return 1
+                       if ! ubimkvol /dev/$ubidev -N rootfs_data -m; then
+                               echo "cannot initialize rootfs_data volume"
+                               return 1
+                       fi
                fi
        fi
        sync