Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit df4e854f authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "overlayfs: use overlayfs for f2fs readonly mode" am: 37b878dc am:...

Merge "overlayfs: use overlayfs for f2fs readonly mode" am: 37b878dc am: 77f14ae6 am: c7b436b6

Original change: https://android-review.googlesource.com/c/platform/system/core/+/2255742



Change-Id: Id5f318f42a2eab4c868137b9d6fabd41db73a638
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 0d0a4a54 c7b436b6
Loading
Loading
Loading
Loading
+23 −0
Original line number Diff line number Diff line
@@ -200,6 +200,24 @@ bool fs_mgr_has_shared_blocks(const std::string& mount_point, const std::string&
    return (info.feat_ro_compat & EXT4_FEATURE_RO_COMPAT_SHARED_BLOCKS) != 0;
}

#define F2FS_SUPER_OFFSET 1024
#define F2FS_FEATURE_OFFSET 2180
#define F2FS_FEATURE_RO 0x4000
bool fs_mgr_is_read_only_f2fs(const std::string& dev) {
    if (!fs_mgr_is_f2fs(dev)) return false;

    android::base::unique_fd fd(open(dev.c_str(), O_RDONLY | O_CLOEXEC));
    if (fd < 0) return false;

    __le32 feat;
    if ((TEMP_FAILURE_RETRY(lseek64(fd, F2FS_SUPER_OFFSET + F2FS_FEATURE_OFFSET, SEEK_SET)) < 0) ||
        (TEMP_FAILURE_RETRY(read(fd, &feat, sizeof(feat))) < 0)) {
        return false;
    }

    return (feat & cpu_to_le32(F2FS_FEATURE_RO)) != 0;
}

bool fs_mgr_overlayfs_enabled(FstabEntry* entry) {
    // readonly filesystem, can not be mount -o remount,rw
    // for squashfs, erofs or if free space is (near) zero making such a remount
@@ -214,6 +232,11 @@ bool fs_mgr_overlayfs_enabled(FstabEntry* entry) {
        return true;
    }

    // f2fs read-only mode doesn't support remount,rw
    if (fs_mgr_is_read_only_f2fs(entry->blk_device)) {
        return true;
    }

    // check if ext4 de-dupe
    auto has_shared_blocks = fs_mgr_has_shared_blocks(entry->mount_point, entry->blk_device);
    if (!has_shared_blocks && (entry->mount_point == "/system")) {