Skip to content

Commit

Permalink
Merge branch 'fix/disable_erase_check_for_spiffs_on_linux' into 'master'
Browse files Browse the repository at this point in the history
fix(storage/esp_partition): add option to control erase check during write for linux target

Closes IDF-9201

See merge request espressif/esp-idf!29294
  • Loading branch information
pacucha42 committed May 29, 2024
2 parents a946d0c + c44da2f commit 3b771d7
Show file tree
Hide file tree
Showing 6 changed files with 54 additions and 1 deletion.
9 changes: 9 additions & 0 deletions components/esp_partition/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,13 @@ menu "Partition API Configuration"
help
This option enables gathering host test statistics and SPI flash wear levelling simulation.

config ESP_PARTITION_ERASE_CHECK
bool "Check if flash is erased before writing"
depends on IDF_TARGET_LINUX
default y
help
This option controls whether the partition implementation checks
if the flash is erased before writing to it.
This is necessary for SPIFFS, which expects to be able to write without erasing first.

endmenu
2 changes: 2 additions & 0 deletions components/esp_partition/partition_linux.c
Original file line number Diff line number Diff line change
Expand Up @@ -396,12 +396,14 @@ esp_err_t esp_partition_write(const esp_partition_t *partition, size_t dst_offse

for (size_t x = 0; x < new_size; x++) {

#ifdef CONFIG_ESP_PARTITION_ERASE_CHECK
// Check if address to be written was erased first
if((~((uint8_t *)dst_addr)[x] & ((uint8_t *)src)[x]) != 0) {
ESP_LOGW(TAG, "invalid flash operation detected");
ret = ESP_ERR_FLASH_OP_FAIL;
break;
}
#endif // CONFIG_ESP_PARTITION_ERASE_CHECK

// AND with destination byte (to emulate real NOR FLASH behavior)
((uint8_t *)dst_addr)[x] &= ((uint8_t *)src)[x];
Expand Down
41 changes: 40 additions & 1 deletion components/spiffs/host_test/main/host_test_spiffs.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2016-2022 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2016-2024 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
Expand Down Expand Up @@ -274,10 +274,49 @@ TEST(spiffs, can_read_spiffs_image)
deinit_spiffs(&fs);
}

TEST(spiffs, erase_check)
{
spiffs fs;

init_spiffs(&fs, 5);


for (int boot_iter = 0; boot_iter <= 10000; ++boot_iter) {
for (int write_iter = 0; write_iter < 1000; ++write_iter) {
spiffs_file f = SPIFFS_open(&fs, "/test", SPIFFS_CREAT | SPIFFS_TRUNC | SPIFFS_RDWR, 0);
if (f < 0) {
fprintf(stderr, "Failed to open file\n");
#if !CONFIG_ESP_PARTITION_ERASE_CHECK
TEST_FAIL();
#endif
return;
}
const int data_sz = 7 * 1024;
char data[data_sz];
memset(data, 0x55, data_sz);
int cb = SPIFFS_write(&fs, f, data, data_sz);
if (cb != data_sz) {
fprintf(stderr, "Failed to write file\n");
TEST_FAIL();
}
int rc = SPIFFS_close(&fs, f);
if (rc < 0) {
fprintf(stderr, "Failed to close file\n");
TEST_FAIL();
}
}
}

#if CONFIG_ESP_PARTITION_ERASE_CHECK
TEST_FAIL();
#endif
}

TEST_GROUP_RUNNER(spiffs)
{
RUN_TEST_CASE(spiffs, format_disk_open_file_write_and_read_file);
RUN_TEST_CASE(spiffs, can_read_spiffs_image);
RUN_TEST_CASE(spiffs, erase_check);
}

static void run_all_tests(void)
Expand Down
1 change: 1 addition & 0 deletions components/spiffs/host_test/pytest_spiffs_linux.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,6 @@

@pytest.mark.linux
@pytest.mark.host_test
@pytest.mark.parametrize('config', ['erase_check', 'no_erase_check'])
def test_spiffs_linux(dut: Dut) -> None:
dut.expect_unity_test_output(timeout=5)
1 change: 1 addition & 0 deletions components/spiffs/host_test/sdkconfig.ci.erase_check
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
CONFIG_ESP_PARTITION_ERASE_CHECK=y
1 change: 1 addition & 0 deletions components/spiffs/host_test/sdkconfig.ci.no_erase_check
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
CONFIG_ESP_PARTITION_ERASE_CHECK=n

0 comments on commit 3b771d7

Please sign in to comment.