From 7b4f21e81dd037ed10ab53df3a9ceaaadb6f07e6 Mon Sep 17 00:00:00 2001 From: Konstantin Vyshetsky Date: Mon, 11 Oct 2021 16:34:03 -0700 Subject: [PATCH] gs201: add script to convert persist to f2fs Currently the persist partition is formatted as ext4. In order to convert the partition to f2fs without losing data, add a script which will copy the partition contents out, format the partition as f2fs and then copy the contents back. Bug: 202511062 Signed-off-by: Konstantin Vyshetsky Change-Id: I89502694d1e02261902525c11ac875dd7756721b --- conf/init.gs201.rc | 2 ++ convert_to_f2fs.sh | 81 ++++++++++++++++++++++++++++++++++++++++++++++ device.mk | 4 +++ 3 files changed, 87 insertions(+) create mode 100644 convert_to_f2fs.sh diff --git a/conf/init.gs201.rc b/conf/init.gs201.rc index d80b5bc4..3ef6a955 100644 --- a/conf/init.gs201.rc +++ b/conf/init.gs201.rc @@ -14,6 +14,8 @@ service vendor.charger /system/bin/charger file /proc/last_kmsg r on early-init + # Convert /dev/block/by-name/persist to f2fs + exec -- /vendor/bin/convert_to_f2fs.sh /dev/block/by-name/persist false mount_all /vendor/etc/fstab.persist --early on init diff --git a/convert_to_f2fs.sh b/convert_to_f2fs.sh new file mode 100644 index 00000000..806964c3 --- /dev/null +++ b/convert_to_f2fs.sh @@ -0,0 +1,81 @@ +#!/bin/sh + +BLK=$1 +FORMAT_ONLY=$2 +MNT_OLD="/mnt/convert_old" +MNT_NEW="/mnt/convert_new" + +function log() { + if [ ! -z "$1" ]; then + echo "partition_convert: $1" > /dev/kmsg + fi +} + +function check_success() { + if [ $? -ne 0 ]; then + log "Failed: $1" + exit -1 + fi + log "Success: $1" +} + +F2FS_MAGIC=$(xxd $BLK -s 0x400 -l 4 -p) +if [ "$F2FS_MAGIC" = "1020f5f2" ]; then + log "$BLK is already f2fs - skipping" + exit 0 +fi + +EXT4_MAGIC=$(xxd $BLK -s 0x438 -l 2 -p) +if [ "$EXT4_MAGIC" != "53ef" ]; then + log "Unknown filesystem $EXT4_MAGIC" + exit -1 +fi + +if [ $FORMAT_ONLY == "true" ]; then + make_f2fs $BLK 2>&1 > /dev/null + check_success "make_f2fs $BLK" + sync + check_success "sync" + exit 0 +fi + +mkdir -p $MNT_OLD +check_success "mkdir $MNT_OLD" + +mkdir -p $MNT_NEW +check_success "mkdir $MNT_NEW" + +mount -t ext4 $BLK $MNT_OLD +check_success "mount $MNT_OLD as ext4" + +mount -t tmpfs tmpfs $MNT_NEW +check_success "mount $MNT_NEW as tmpfs" + +cp -rp $MNT_OLD/* $MNT_NEW/ +check_success "copy $MNT_OLD to $MNT_NEW" + +umount $MNT_OLD +check_success "umount $MNT_OLD" + +make_f2fs $BLK 2>&1 > /dev/null +check_success "make_f2fs $BLK" + +mount -t f2fs $BLK $MNT_OLD +check_success "mount $MNT_OLD as f2fs" + +cp -rp $MNT_NEW/* $MNT_OLD/ +check_success "copy $MNT_NEW to $MNT_OLD" + +sync +check_success "sync" + +umount $MNT_OLD +check_success "umount $MNT_OLD" +umount $MNT_NEW +check_success "umount $MNT_NEW" + +rmdir $MNT_OLD +check_success "rmdir $MNT_OLD" + +rmdir $MNT_NEW +check_success "rmdir $MNT_NEW" diff --git a/device.mk b/device.mk index 8a61dda2..91aec963 100644 --- a/device.mk +++ b/device.mk @@ -286,6 +286,10 @@ PRODUCT_PACKAGES += \ tune2fs.vendor_ramdisk \ resize2fs.vendor_ramdisk +# Filesystem: convert /dev/block/by-name/persist to f2fs +PRODUCT_COPY_FILES += \ + device/google/gs201/convert_to_f2fs.sh:$(TARGET_COPY_OUT_VENDOR)/bin/convert_to_f2fs.sh \ + # Userdata Checkpointing OTA GC PRODUCT_PACKAGES += \ checkpoint_gc