Parcourir la source

storage: lfs fingerprint wasn't updated when both geometry changed & factory reset was requested, resulting in second re-format on next boot (#1372)

hedger il y a 3 ans
Parent
commit
c49db35ee0
1 fichiers modifiés avec 8 ajouts et 5 suppressions
  1. 8 5
      applications/storage/storages/storage_int.c

+ 8 - 5
applications/storage/storages/storage_int.c

@@ -4,6 +4,7 @@
 
 
 #define TAG "StorageInt"
 #define TAG "StorageInt"
 #define STORAGE_PATH "/int"
 #define STORAGE_PATH "/int"
+#define LFS_CLEAN_FINGERPRINT 0
 
 
 typedef struct {
 typedef struct {
     const size_t start_address;
     const size_t start_address;
@@ -162,8 +163,9 @@ static LFSData* storage_int_lfs_data_alloc() {
     return lfs_data;
     return lfs_data;
 };
 };
 
 
-static bool storage_int_is_fingerprint_valid(LFSData* lfs_data) {
-    bool value = true;
+// Returns true if fingerprint was invalid and LFS reformatting is needed
+static bool storage_int_check_and_set_fingerprint(LFSData* lfs_data) {
+    bool value = false;
 
 
     uint32_t os_fingerprint = 0;
     uint32_t os_fingerprint = 0;
     os_fingerprint |= ((lfs_data->start_page & 0xFF) << 0);
     os_fingerprint |= ((lfs_data->start_page & 0xFF) << 0);
@@ -171,13 +173,13 @@ static bool storage_int_is_fingerprint_valid(LFSData* lfs_data) {
     os_fingerprint |= ((LFS_DISK_VERSION_MAJOR & 0xFFFF) << 16);
     os_fingerprint |= ((LFS_DISK_VERSION_MAJOR & 0xFFFF) << 16);
 
 
     uint32_t rtc_fingerprint = furi_hal_rtc_get_register(FuriHalRtcRegisterLfsFingerprint);
     uint32_t rtc_fingerprint = furi_hal_rtc_get_register(FuriHalRtcRegisterLfsFingerprint);
-    if(rtc_fingerprint == 0) {
+    if(rtc_fingerprint == LFS_CLEAN_FINGERPRINT) {
         FURI_LOG_I(TAG, "Storing LFS fingerprint in RTC");
         FURI_LOG_I(TAG, "Storing LFS fingerprint in RTC");
         furi_hal_rtc_set_register(FuriHalRtcRegisterLfsFingerprint, os_fingerprint);
         furi_hal_rtc_set_register(FuriHalRtcRegisterLfsFingerprint, os_fingerprint);
     } else if(rtc_fingerprint != os_fingerprint) {
     } else if(rtc_fingerprint != os_fingerprint) {
         FURI_LOG_E(TAG, "LFS fingerprint mismatch");
         FURI_LOG_E(TAG, "LFS fingerprint mismatch");
         furi_hal_rtc_set_register(FuriHalRtcRegisterLfsFingerprint, os_fingerprint);
         furi_hal_rtc_set_register(FuriHalRtcRegisterLfsFingerprint, os_fingerprint);
-        value = false;
+        value = true;
     }
     }
 
 
     return value;
     return value;
@@ -187,8 +189,9 @@ static void storage_int_lfs_mount(LFSData* lfs_data, StorageData* storage) {
     int err;
     int err;
     lfs_t* lfs = &lfs_data->lfs;
     lfs_t* lfs = &lfs_data->lfs;
 
 
+    bool was_fingerprint_outdated = storage_int_check_and_set_fingerprint(lfs_data);
     bool need_format = furi_hal_rtc_is_flag_set(FuriHalRtcFlagFactoryReset) ||
     bool need_format = furi_hal_rtc_is_flag_set(FuriHalRtcFlagFactoryReset) ||
-                       !storage_int_is_fingerprint_valid(lfs_data);
+                       was_fingerprint_outdated;
 
 
     if(need_format) {
     if(need_format) {
         // Format storage
         // Format storage