Loading fs_mgr/fs_mgr.cpp +18 −46 Original line number Original line Diff line number Diff line Loading @@ -38,8 +38,10 @@ #include <array> #include <array> #include <chrono> #include <chrono> #include <functional> #include <map> #include <map> #include <memory> #include <memory> #include <numeric> #include <string> #include <string> #include <string_view> #include <string_view> #include <thread> #include <thread> Loading @@ -64,7 +66,6 @@ #include <fs_mgr/file_wait.h> #include <fs_mgr/file_wait.h> #include <fs_mgr_overlayfs.h> #include <fs_mgr_overlayfs.h> #include <fscrypt/fscrypt.h> #include <fscrypt/fscrypt.h> #include <fstab/fstab.h> #include <libdm/dm.h> #include <libdm/dm.h> #include <libdm/loop_control.h> #include <libdm/loop_control.h> #include <liblp/metadata_format.h> #include <liblp/metadata_format.h> Loading Loading @@ -137,8 +138,8 @@ enum FsStatFlags { static void log_fs_stat(const std::string& blk_device, int fs_stat) { static void log_fs_stat(const std::string& blk_device, int fs_stat) { std::string msg = std::string msg = android::base::StringPrintf("\nfs_stat,%s,0x%x\n", blk_device.c_str(), fs_stat); android::base::StringPrintf("\nfs_stat,%s,0x%x\n", blk_device.c_str(), fs_stat); android::base::unique_fd fd(TEMP_FAILURE_RETRY( android::base::unique_fd fd(TEMP_FAILURE_RETRY(open(FSCK_LOG_FILE, O_WRONLY | O_CLOEXEC | open(FSCK_LOG_FILE, O_WRONLY | O_CLOEXEC | O_APPEND | O_CREAT, 0664))); O_APPEND | O_CREAT, 0664))); if (fd == -1 || !android::base::WriteStringToFd(msg, fd)) { if (fd == -1 || !android::base::WriteStringToFd(msg, fd)) { LWARNING << __FUNCTION__ << "() cannot log " << msg; LWARNING << __FUNCTION__ << "() cannot log " << msg; } } Loading Loading @@ -1429,34 +1430,6 @@ bool WasMetadataEncryptionInterrupted(const FstabEntry& entry) { return access(fs_mgr_metadata_encryption_in_progress_file_name(entry).c_str(), R_OK) == 0; return access(fs_mgr_metadata_encryption_in_progress_file_name(entry).c_str(), R_OK) == 0; } } FstabEntry* LocateFormattableEntry(FstabEntry* const begin, FstabEntry* const end) { const bool dev_option_enabled = android::base::GetBoolProperty("ro.product.build.16k_page.enabled", false); FstabEntry* f2fs_entry = nullptr; for (auto iter = begin; iter->blk_device == begin->blk_device && iter < end; iter++) { if (iter->fs_mgr_flags.formattable) { if (getpagesize() != 4096 && is_f2fs(iter->fs_type) && dev_option_enabled) { f2fs_entry = iter; continue; } if (f2fs_entry) { LOG(INFO) << "Skipping F2FS format for block device " << iter->blk_device << " @ " << iter->mount_point << " in non-4K mode for dev option enabled devices, " "as these devices need to toggle between 4K/16K mode, and F2FS does " "not support page_size != block_size configuration."; } return iter; } } if (f2fs_entry) { LOG(INFO) << "Using F2FS for " << f2fs_entry->blk_device << " @ " << f2fs_entry->mount_point << " even though we are in non-4K mode. Device might require a data wipe after " "going back to 4K mode, as F2FS does not support page_size != block_size"; } return f2fs_entry; } // When multiple fstab records share the same mount_point, it will try to mount each // When multiple fstab records share the same mount_point, it will try to mount each // one in turn, and ignore any duplicates after a first successful mount. // one in turn, and ignore any duplicates after a first successful mount. // Returns -1 on error, and FS_MGR_MNTALL_* otherwise. // Returns -1 on error, and FS_MGR_MNTALL_* otherwise. Loading Loading @@ -1567,8 +1540,8 @@ int fs_mgr_mount_all(Fstab* fstab, int mount_mode) { } } } } int last_idx_inspected = -1; int last_idx_inspected; const int top_idx = i; int top_idx = i; int attempted_idx = -1; int attempted_idx = -1; bool encryption_interrupted = WasMetadataEncryptionInterrupted(current_entry); bool encryption_interrupted = WasMetadataEncryptionInterrupted(current_entry); Loading Loading @@ -1618,8 +1591,7 @@ int fs_mgr_mount_all(Fstab* fstab, int mount_mode) { // Success! Go get the next one. // Success! Go get the next one. continue; continue; } } auto formattable_entry = LocateFormattableEntry(fstab->data() + top_idx, fstab->data() + fstab->size()); // Mounting failed, understand why and retry. // Mounting failed, understand why and retry. wiped = partition_wiped(current_entry.blk_device.c_str()); wiped = partition_wiped(current_entry.blk_device.c_str()); if (mount_errno != EBUSY && mount_errno != EACCES && if (mount_errno != EBUSY && mount_errno != EACCES && Loading Loading @@ -1647,12 +1619,12 @@ int fs_mgr_mount_all(Fstab* fstab, int mount_mode) { encryptable = FS_MGR_MNTALL_DEV_IS_METADATA_ENCRYPTED; encryptable = FS_MGR_MNTALL_DEV_IS_METADATA_ENCRYPTED; set_type_property(encryptable); set_type_property(encryptable); if (!call_vdc({"cryptfs", "encryptFstab", formattable_entry->blk_device, if (!call_vdc({"cryptfs", "encryptFstab", current_entry.blk_device, formattable_entry->mount_point, "true" /* shouldFormat */, current_entry.mount_point, "true" /* shouldFormat */, formattable_entry->fs_type, current_entry.fs_type, formattable_entry->fs_mgr_flags.is_zoned ? "true" : "false", current_entry.fs_mgr_flags.is_zoned ? "true" : "false", std::to_string(formattable_entry->length), std::to_string(current_entry.length), android::base::Join(formattable_entry->user_devices, ' ')}, android::base::Join(current_entry.user_devices, ' ')}, nullptr)) { nullptr)) { LERROR << "Encryption failed"; LERROR << "Encryption failed"; } else { } else { Loading @@ -1661,7 +1633,7 @@ int fs_mgr_mount_all(Fstab* fstab, int mount_mode) { } } } } if (fs_mgr_do_format(*formattable_entry) == 0) { if (fs_mgr_do_format(current_entry) == 0) { // Let's replay the mount actions. // Let's replay the mount actions. i = top_idx - 1; i = top_idx - 1; continue; continue; Loading Loading
fs_mgr/fs_mgr.cpp +18 −46 Original line number Original line Diff line number Diff line Loading @@ -38,8 +38,10 @@ #include <array> #include <array> #include <chrono> #include <chrono> #include <functional> #include <map> #include <map> #include <memory> #include <memory> #include <numeric> #include <string> #include <string> #include <string_view> #include <string_view> #include <thread> #include <thread> Loading @@ -64,7 +66,6 @@ #include <fs_mgr/file_wait.h> #include <fs_mgr/file_wait.h> #include <fs_mgr_overlayfs.h> #include <fs_mgr_overlayfs.h> #include <fscrypt/fscrypt.h> #include <fscrypt/fscrypt.h> #include <fstab/fstab.h> #include <libdm/dm.h> #include <libdm/dm.h> #include <libdm/loop_control.h> #include <libdm/loop_control.h> #include <liblp/metadata_format.h> #include <liblp/metadata_format.h> Loading Loading @@ -137,8 +138,8 @@ enum FsStatFlags { static void log_fs_stat(const std::string& blk_device, int fs_stat) { static void log_fs_stat(const std::string& blk_device, int fs_stat) { std::string msg = std::string msg = android::base::StringPrintf("\nfs_stat,%s,0x%x\n", blk_device.c_str(), fs_stat); android::base::StringPrintf("\nfs_stat,%s,0x%x\n", blk_device.c_str(), fs_stat); android::base::unique_fd fd(TEMP_FAILURE_RETRY( android::base::unique_fd fd(TEMP_FAILURE_RETRY(open(FSCK_LOG_FILE, O_WRONLY | O_CLOEXEC | open(FSCK_LOG_FILE, O_WRONLY | O_CLOEXEC | O_APPEND | O_CREAT, 0664))); O_APPEND | O_CREAT, 0664))); if (fd == -1 || !android::base::WriteStringToFd(msg, fd)) { if (fd == -1 || !android::base::WriteStringToFd(msg, fd)) { LWARNING << __FUNCTION__ << "() cannot log " << msg; LWARNING << __FUNCTION__ << "() cannot log " << msg; } } Loading Loading @@ -1429,34 +1430,6 @@ bool WasMetadataEncryptionInterrupted(const FstabEntry& entry) { return access(fs_mgr_metadata_encryption_in_progress_file_name(entry).c_str(), R_OK) == 0; return access(fs_mgr_metadata_encryption_in_progress_file_name(entry).c_str(), R_OK) == 0; } } FstabEntry* LocateFormattableEntry(FstabEntry* const begin, FstabEntry* const end) { const bool dev_option_enabled = android::base::GetBoolProperty("ro.product.build.16k_page.enabled", false); FstabEntry* f2fs_entry = nullptr; for (auto iter = begin; iter->blk_device == begin->blk_device && iter < end; iter++) { if (iter->fs_mgr_flags.formattable) { if (getpagesize() != 4096 && is_f2fs(iter->fs_type) && dev_option_enabled) { f2fs_entry = iter; continue; } if (f2fs_entry) { LOG(INFO) << "Skipping F2FS format for block device " << iter->blk_device << " @ " << iter->mount_point << " in non-4K mode for dev option enabled devices, " "as these devices need to toggle between 4K/16K mode, and F2FS does " "not support page_size != block_size configuration."; } return iter; } } if (f2fs_entry) { LOG(INFO) << "Using F2FS for " << f2fs_entry->blk_device << " @ " << f2fs_entry->mount_point << " even though we are in non-4K mode. Device might require a data wipe after " "going back to 4K mode, as F2FS does not support page_size != block_size"; } return f2fs_entry; } // When multiple fstab records share the same mount_point, it will try to mount each // When multiple fstab records share the same mount_point, it will try to mount each // one in turn, and ignore any duplicates after a first successful mount. // one in turn, and ignore any duplicates after a first successful mount. // Returns -1 on error, and FS_MGR_MNTALL_* otherwise. // Returns -1 on error, and FS_MGR_MNTALL_* otherwise. Loading Loading @@ -1567,8 +1540,8 @@ int fs_mgr_mount_all(Fstab* fstab, int mount_mode) { } } } } int last_idx_inspected = -1; int last_idx_inspected; const int top_idx = i; int top_idx = i; int attempted_idx = -1; int attempted_idx = -1; bool encryption_interrupted = WasMetadataEncryptionInterrupted(current_entry); bool encryption_interrupted = WasMetadataEncryptionInterrupted(current_entry); Loading Loading @@ -1618,8 +1591,7 @@ int fs_mgr_mount_all(Fstab* fstab, int mount_mode) { // Success! Go get the next one. // Success! Go get the next one. continue; continue; } } auto formattable_entry = LocateFormattableEntry(fstab->data() + top_idx, fstab->data() + fstab->size()); // Mounting failed, understand why and retry. // Mounting failed, understand why and retry. wiped = partition_wiped(current_entry.blk_device.c_str()); wiped = partition_wiped(current_entry.blk_device.c_str()); if (mount_errno != EBUSY && mount_errno != EACCES && if (mount_errno != EBUSY && mount_errno != EACCES && Loading Loading @@ -1647,12 +1619,12 @@ int fs_mgr_mount_all(Fstab* fstab, int mount_mode) { encryptable = FS_MGR_MNTALL_DEV_IS_METADATA_ENCRYPTED; encryptable = FS_MGR_MNTALL_DEV_IS_METADATA_ENCRYPTED; set_type_property(encryptable); set_type_property(encryptable); if (!call_vdc({"cryptfs", "encryptFstab", formattable_entry->blk_device, if (!call_vdc({"cryptfs", "encryptFstab", current_entry.blk_device, formattable_entry->mount_point, "true" /* shouldFormat */, current_entry.mount_point, "true" /* shouldFormat */, formattable_entry->fs_type, current_entry.fs_type, formattable_entry->fs_mgr_flags.is_zoned ? "true" : "false", current_entry.fs_mgr_flags.is_zoned ? "true" : "false", std::to_string(formattable_entry->length), std::to_string(current_entry.length), android::base::Join(formattable_entry->user_devices, ' ')}, android::base::Join(current_entry.user_devices, ' ')}, nullptr)) { nullptr)) { LERROR << "Encryption failed"; LERROR << "Encryption failed"; } else { } else { Loading @@ -1661,7 +1633,7 @@ int fs_mgr_mount_all(Fstab* fstab, int mount_mode) { } } } } if (fs_mgr_do_format(*formattable_entry) == 0) { if (fs_mgr_do_format(current_entry) == 0) { // Let's replay the mount actions. // Let's replay the mount actions. i = top_idx - 1; i = top_idx - 1; continue; continue; Loading