#!/bin/sh PERSIST_BLK='/dev/block/by-name/persist' EFS_BLK='/dev/block/by-name/efs' MNT_BASE='/mnt/product' MNT_OLD="$MNT_BASE/convert_old" MNT_NEW="$MNT_BASE/convert_new" function log() { if [ ! -z "$1" ]; then echo "partition_convert: $1" > /dev/kmsg fi } function check_success() { RES=$? if [ $RES -ne 0 ]; then log "Failed: $1" else log "Success: $1" fi return $RES } function get_fs_type() { BLOCK=$1 EXT4_MAGIC=$(xxd $BLOCK -s 0x438 -l 2 -p) if [ "$EXT4_MAGIC" = "53ef" ]; then echo "ext4" else F2FS_MAGIC=$(xxd $BLOCK -s 0x400 -l 4 -p) if [ "$F2FS_MAGIC" = "1020f5f2" ]; then echo "f2fs" else echo "unknown" fi fi } # Flow: # 1. If persist is f2fs we need to make efs ext4 and copy out the files. Once files are copied # successfully, format persist as ext4 to mark completion of step. # 2. If persist is ext4 and efs is ext4, we need to copy from efs to persist (use dd). Once # everything is copied successfully, erase efs to allow it to be formatted to f2fs later. # 3. If persist is ext4 and efs is not ext4, we have already migrated - do nothing. # If persist is already ext4 and efs is not ext4 we have already migrated. PERSIST_FS=$(get_fs_type $PERSIST_BLK) EFS_FS=$(get_fs_type $EFS_BLK) if [ "$PERSIST_FS" = "ext4" ]; then if [ "$EFS_FS" != "ext4" ]; then log "persist ext4 migration already done" exit 0 fi fi if [ "$PERSIST_FS" = "unknown" ]; then log "persist partition hasn't been initialized" exit 0 fi RETRIES=10 while [[ $RETRIES -gt 0 ]]; do # Sleep for 1 second here, as other failure points will trigger continue sleep 1 RETRIES=$((RETRIES-1)) # If persist is still f2fs, we need to copy to efs. if [ "$PERSIST_FS" = "f2fs" ]; then # Format efs as ext4 /system/bin/mke2fs -t ext4 -b 4096 $EFS_BLK check_success "/system/bin/mke2fs -t ext4 -b 4096 $EFS_BLK" if [ $? -ne 0 ]; then continue fi #Create directory to mount persist partition mkdir -p $MNT_OLD check_success "mkdir $MNT_OLD" if [ $? -ne 0 ]; then continue fi # Create directory to mount efs partition mkdir -p $MNT_NEW check_success "mkdir $MNT_NEW" if [ $? -ne 0 ]; then rm -rf $MNT_OLD continue fi # Mount persist mount -t f2fs $PERSIST_BLK $MNT_OLD check_success "mount -t f2fs $PERSIST_BLK $MNT_OLD" if [ $? -ne 0 ]; then rm -rf $MNT_NEW rm -rf $MNT_OLD continue fi # Mount efs mount -t ext4 $EFS_BLK $MNT_NEW check_success "mount -t ext4 $EFS_BLK $MNT_NEW" if [ $? -ne 0 ]; then umount $MNT_OLD rm -rf $MNT_NEW rm -rf $MNT_OLD continue fi cp -rp $MNT_OLD/.* $MNT_NEW/ cp -rp $MNT_OLD/* $MNT_NEW/ check_success "cp -rp $MNT_OLD/* $MNT_NEW/" if [ $? -ne 0 ]; then umount $MNT_NEW umount $MNT_OLD rm -rf $MNT_NEW rm -rf $MNT_OLD continue fi # Calculate md5sum of all files and compare between persist and efs (cd $MNT_NEW; find . -type f | xargs md5sum | sort) > $MNT_BASE/new.md5sums (cd $MNT_OLD; find . -type f | xargs md5sum | sort) > $MNT_BASE/old.md5sums diff $MNT_BASE/new.md5sums $MNT_BASE/old.md5sums check_success "diff $MNT_BASE/new.md5sums $MNT_BASE/old.md5sums" RES=$? rm $MNT_BASE/new.md5sums $MNT_BASE/old.md5sums umount $MNT_NEW umount $MNT_OLD rm -rf $MNT_NEW rm -rf $MNT_OLD if [ $RES -ne 0 ]; then continue fi /system/bin/mke2fs -t ext4 -b 4096 $PERSIST_BLK check_success "/system/bin/mke2fs -t ext4 -b 4096 $PERSIST_BLK" if [ $? -ne 0 ]; then continue fi PERSIST_FS="ext4" fi # copy efs to persist dd if=$EFS_BLK of=$PERSIST_BLK check_success "dd if=$EFS_BLK of=$PERSIST_BLK" if [ $? -ne 0 ]; then continue fi sync check_success "sync" if [ $? -ne 0 ]; then continue fi # compare md5sum for integrity EFS_MD5SUM=$(dd if=$EFS_BLK 2>/dev/null | md5sum) PERSIST_MD5SUM=$(dd if=$PERSIST_BLK 2>/dev/null | md5sum) if [ "$PERSIST_MD5SUM" != "$EFS_MD5SUM" ]; then log "dd md5sum mismatch" continue fi dd if=/dev/zero of=$EFS_BLK bs=1M count=64 check_success "dd if=/dev/zero of=$EFS_BLK bs=1M count=64" if [ $? -ne 0 ]; then continue fi log "Migration succeeded" break done