blob: bd1966c9b09fd348de714a5655a008c63d0dec43 [file] [log] [blame]
developer8262b0d2021-11-12 09:02:17 +08001
2# Keep these values be up-to-date with definition in libfstools/rootdisk.c of fstools package
3ROOTDEV_OVERLAY_ALIGN=$((64*1024))
4F2FS_MINSIZE=$((100*1024*1024))
5
6mtk_get_root() {
7 local rootfsdev
8
9 if read cmdline < /proc/cmdline; then
10 case "$cmdline" in
11 *root=*)
12 rootfsdev="${cmdline##*root=}"
13 rootfsdev="${rootfsdev%% *}"
14 ;;
15 esac
16
17 echo "${rootfsdev}"
18 fi
19}
20
21mmc_upgrade_tar() {
22 local tar_file="$1"
23 local kernel_dev="$2"
24 local rootfs_dev="$3"
25
26 local board_dir=$(tar tf ${tar_file} | grep -m 1 '^sysupgrade-.*/$')
27 board_dir=${board_dir%/}
28
29 local kernel_length=$( (tar xf $tar_file ${board_dir}/kernel -O | wc -c) 2> /dev/null)
30 local rootfs_length=$( (tar xf $tar_file ${board_dir}/root -O | wc -c) 2> /dev/null)
31
32 [ "${kernel_length}" != 0 ] && {
33 tar xf ${tar_file} ${board_dir}/kernel -O >${kernel_dev}
34 }
35
36 [ "${rootfs_length}" != 0 ] && {
37 tar xf ${tar_file} ${board_dir}/root -O >${rootfs_dev}
38 }
39
40 local rootfs_dev_size=$(blockdev --getsize64 ${rootfs_dev})
41 [ $? -ne 0 ] && return 1
42
43 local rootfs_data_offset=$(((rootfs_length+ROOTDEV_OVERLAY_ALIGN-1)&~(ROOTDEV_OVERLAY_ALIGN-1)))
44 local rootfs_data_size=$((rootfs_dev_size-rootfs_data_offset))
45
46 local loopdev="$(losetup -f)"
47 losetup -o $rootfs_data_offset $loopdev $rootfs_dev || {
48 v "Failed to mount looped rootfs_data."
49 return 1
50 }
51
52 local fstype=ext4
53 local mkfs_arg="-q -L rootfs_data"
54 [ "${rootfs_data_size}" -gt "${F2FS_MINSIZE}" ] && {
55 fstype=f2fs
56 mkfs_arg="-q -l rootfs_data"
57 }
58
59 v "Format new rootfs_data at position ${rootfs_data_offset}."
60 mkfs.${fstype} ${mkfs_arg} ${loopdev}
61 [ $? -ne 0 ] && return 1
62
63 [ -n "$UPGRADE_BACKUP" ] && {
64 mkdir -p /tmp/new_root
65 mount -t ${fstype} ${loopdev} /tmp/new_root && {
66 v "Saving config to rootfs_data at position ${rootfs_data_offset}."
67 mv "$UPGRADE_BACKUP" "/tmp/new_root/$BACKUP_FILE"
68 umount /tmp/new_root
69 }
70 }
71
72 # Cleanup
73 losetup -d ${loopdev} >/dev/null 2>&1
74 sync
75
76 return 0
77}
78
79mtk_mmc_do_upgrade() {
80 local tar_file="$1"
81 local board=$(board_name)
82 local kernel_dev=
83 local rootfs_dev=
84 local cmdline_root="$(mtk_get_root)"
85
86 case "$cmdline_root" in
87 /dev/mmcblk*)
88 rootfs_dev=${cmdline_root}
89 ;;
90 PARTLABEL=* | PARTUUID=*)
91 rootfs_dev=$(blkid -t "${cmdline_root}" -o device)
92 [ -z "${rootfs_dev}" -o $? -ne 0 ] && return 1
93 ;;
94 *)
95 return 1;
96 ;;
97 esac
98
99 case "$board" in
100 *)
101 kernel_dev=$(blkid -t "PARTLABEL=kernel" -o device)
102 [ -z "${kernel_dev}" -o $? -ne 0 ] && return 1
103 ;;
104 esac
105
106 # keep sure its unbound
107 losetup --detach-all || {
108 v "Failed to detach all loop devices."
109 sleep 10
110 reboot -f
111 }
112
113 mmc_upgrade_tar "${tar_file}" "${kernel_dev}" "${rootfs_dev}"
114
115 [ $? -ne 0 ] && {
116 v "Upgrade failed."
117 return 1
118 }
119
120 return 0
121}