ASR_BASE
Change-Id: Icf3719cc0afe3eeb3edc7fa80a2eb5199ca9dda1
diff --git a/target/linux/mmp/files/jffs2reset_mmp_64m b/target/linux/mmp/files/jffs2reset_mmp_64m
new file mode 100755
index 0000000..c8f78ca
--- /dev/null
+++ b/target/linux/mmp/files/jffs2reset_mmp_64m
@@ -0,0 +1,136 @@
+#!/bin/sh
+SYSCFG_UBIFS_MNT=/tmp/syscfg
+. /lib/functions.sh
+
+# mtdpart: the ubifs syscfg partition
+# rom: the read-only rootfs mount point
+# overlay: the overlay upper directory
+pre_check() {
+ # return 1 on failed
+ grep -qs ubifs /proc/filesystems || return 1
+ grep -qs overlay /proc/filesystems || return 1
+ [ ! -e $SYSCFG_UBIFS_MNT ] && mkdir -p $SYSCFG_UBIFS_MNT
+
+ mtdpart="$(find_mtd_part rootfs_data)"
+ [ -z "$mtdpart" ] && return 1
+ mtdpart_idx="$(echo $mtdpart | tr -d "/dev/mtdblock")"
+
+ rom=$(awk '/jffs2 ro/ {print $2}' /proc/mounts)
+ overlays=$(awk '/ubifs/ {print $2}' /proc/mounts | grep overlay)
+ return 0
+}
+
+clean_mounted_overlayfs(){
+ if [ ! -z "$overlays" ]
+ then
+ echo "first stop respawn app..."
+ /etc/init.d/odhcpd stop
+ /etc/init.d/log stop
+ /etc/init.d/dnsmasq stop
+ /etc/init.d/network stop
+ /etc/init.d/services.init stop
+ /etc/init.d/cm.init stop
+ /etc/init.d/sdcard_mount stop
+
+ echo "then stop other left app..."
+ ps | sed '/ash\|PID\|firstboot\|sed/d;/\[.*\]$/d;s/^ \+//;s/ .*//;/^'$$'$/d;/^'$PPID'$/d' | xargs kill -9
+ sleep 2
+
+ echo "start to umount overlay-fs..."
+ if [ -d /NVM/*data ]; then
+ /bin/umount /NVM/*data
+ fi
+ if [ -d /usr/*web ]; then
+ /bin/umount /usr/*web
+ fi
+ rm -rf /data/*
+ /bin/umount /data /mnt /log
+ /bin/umount /etc
+ /bin/umount /NVM
+ for overlay in $overlays; do
+ echo -n "delete all file under $overlay/ ... "
+ rm -rf $overlay/*
+ /bin/umount $overlay
+ done
+ echo "done"
+ return 0
+ fi
+}
+
+__try_ubifs_syscfg_mount() {
+ overlay_mountpoint=$1
+ if [ -z $overlay_mountpoint ]
+ then
+ overlay_mountpoint=/overlay
+ fi
+ recover_ubifs=0
+ [ ! -e /dev/ubi0 ] && ubiattach /dev/ubi_ctrl -m $mtdpart_idx -d 0 || recover_ubifs=1
+ if [ $recover_ubifs -eq 0 ]
+ then
+ ubi0_nod_id=`cat /sys/class/ubi/ubi0/dev | tr -s ":" " "`
+ [ ! -e /dev/ubi0 ] && mknod /dev/ubi0 c ${ubi0_nod_id}
+ if [ ! -e /sys/class/ubi/ubi0_0/dev ]
+ then
+ # no volume
+ recover_ubifs=1
+ else
+ # check for "data" volume
+ ubi0_0_nod_id=`cat /sys/class/ubi/ubi0_0/dev | tr -s ":" " "`
+ [ ! -e /dev/ubi0_0 ] && mknod /dev/ubi0_0 c ${ubi0_0_nod_id}
+ { ubinfo /dev/ubi0_0 | grep Name | grep -qs "data" ; } || \
+ recover_ubifs=1
+ fi
+ fi
+ if [ $recover_ubifs -eq 1 ]
+ then
+ echo "ubifs syscfg partition is damaged"
+ echo "try to recover by formatting $mtdpart..."
+ [ -e /dev/ubi0 ] && ubidetach -m $mtdpart_idx
+ ubiformat -y -q /dev/mtd$mtdpart_idx
+ ubiattach -m $mtdpart_idx /dev/ubi_ctrl
+ ubi0_nod_id=`cat /sys/class/ubi/ubi0/dev | tr -s ":" " "`
+ [ ! -e /dev/ubi0 ] && mknod /dev/ubi0 c ${ubi0_nod_id}
+ ubimkvol /dev/ubi0 -n 1 -N etc -t dynamic -s 2MiB
+ ubimkvol /dev/ubi0 -n 0 -N data -t dynamic --maxavsize
+ fi
+
+ # finally mount the ubifs
+ mount -t ubifs -o noatime ubi0:data /data || return 1
+ mount -t ubifs -o noatime ubi0:data /mnt || return 1
+ mount -t ubifs -o noatime ubi0:data /log || return 1
+ mount -t ubifs -o noatime ubi0:etc $overlay_mountpoint/etc || return 1
+ return 0
+}
+
+try_ubifs_syscfg_mount() {
+ __try_ubifs_syscfg_mount || {
+ echo "roofs_data mount fail, try to recover by erase..."
+ mtd erase rootfs_data
+ __try_ubifs_syscfg_mount
+ }
+
+ return 0
+}
+
+if [ "$1" != "-y" ]
+then
+read -p "This will erase all settings and remove any installed packages. Are you sure? [N/y]" answer
+case $answer in
+ [Yy]* ) break;;
+ [Nn]* ) exit 0;;
+ * ) exit 0;;
+esac
+fi
+
+pre_check
+if [ ! -z "$overlays" ]
+then
+ echo "overlayfs is mounted"
+ clean_mounted_overlayfs
+else
+ echo "try to mount overlayfs"
+ try_ubifs_syscfg_mount || exit 1
+ overlays=$(awk '/ubifs/ {print $2}' /proc/mounts | grep overlay)
+ clean_mounted_overlayfs
+fi
+