diff options
author | Lokesh Kumar Goel <lokeshgoel@google.com> | 2023-10-26 18:58:59 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2023-10-26 18:58:59 +0000 |
commit | 299569897fde77e2fb0d7f46f9492748f1548fc9 (patch) | |
tree | 09a89d2fdc33e2d85a2333b4129eb40fe2231322 | |
parent | f7fd3367667dc51a38dc0dac846c998dc463f53b (diff) | |
parent | 6c625e5d2e33bdaed7b9933b237502968c4b16e1 (diff) | |
download | core-299569897fde77e2fb0d7f46f9492748f1548fc9.tar.gz |
Merge "Run fsck to resolve possible data corruption" into udc-dev
-rw-r--r-- | fs_mgr/fs_mgr.cpp | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/fs_mgr/fs_mgr.cpp b/fs_mgr/fs_mgr.cpp index 742cdfab0..8b9bce1db 100644 --- a/fs_mgr/fs_mgr.cpp +++ b/fs_mgr/fs_mgr.cpp @@ -700,6 +700,29 @@ static void SetReadAheadSize(const std::string& entry_block_device, off64_t size } // +// Mechanism to allow fsck to be triggered by setting ro.preventative_fsck +// Introduced to address b/305658663 +// If the property value is not equal to the flag file contents, trigger +// fsck and store the property value in the flag file +// If we want to trigger again, simply change the property value +// +static bool check_if_preventative_fsck_needed(const FstabEntry& entry) { + const char* flag_file = "/metadata/vold/preventative_fsck"; + if (entry.mount_point != "/data") return false; + + // Don't error check - both default to empty string, which is OK + std::string prop = android::base::GetProperty("ro.preventative_fsck", ""); + std::string flag; + android::base::ReadFileToString(flag_file, &flag); + if (prop == flag) return false; + // fsck is run immediately, so assume it runs or there is some deeper problem + if (!android::base::WriteStringToFile(prop, flag_file)) + PERROR << "Failed to write file " << flag_file; + LINFO << "Run preventative fsck on /data"; + return true; +} + +// // Prepare the filesystem on the given block device to be mounted. // // If the "check" option was given in the fstab record, or it seems that the @@ -749,7 +772,7 @@ static int prepare_fs_for_mount(const std::string& blk_device, const FstabEntry& } } - if (entry.fs_mgr_flags.check || + if (check_if_preventative_fsck_needed(entry) || entry.fs_mgr_flags.check || (fs_stat & (FS_STAT_UNCLEAN_SHUTDOWN | FS_STAT_QUOTA_ENABLED))) { check_fs(blk_device, entry.fs_type, mount_point, &fs_stat); } |