diff options
author | Jaegeuk Kim <jaegeuk@google.com> | 2022-10-14 08:41:47 -0700 |
---|---|---|
committer | Jaegeuk Kim <jaegeuk@google.com> | 2022-10-17 11:38:45 -0700 |
commit | c1141779852c15ebb7f21d993a01c9001ddbc2f5 (patch) | |
tree | c7e22326147dda1cd2f27c4f6dcd498b270cb5e4 | |
parent | cfd803d5f5ff5e83bbfb5436124183eed8834f2f (diff) | |
download | core-c1141779852c15ebb7f21d993a01c9001ddbc2f5.tar.gz |
overlayfs: use overlayfs for f2fs readonly mode
F2FS doesn't allow remount,rw for RO partition, so that it caused adb remount.
Fix it.
Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
Change-Id: Ia4410d08e8be344d79292c16a335a7e5be7a48bb
-rw-r--r-- | fs_mgr/fs_mgr_overlayfs.cpp | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/fs_mgr/fs_mgr_overlayfs.cpp b/fs_mgr/fs_mgr_overlayfs.cpp index 6213aeba8..c7f33435b 100644 --- a/fs_mgr/fs_mgr_overlayfs.cpp +++ b/fs_mgr/fs_mgr_overlayfs.cpp @@ -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")) { |