fix(storage/partition): Update sizes in blockdev geometry in read-only mode for compatibility

This commit is contained in:
Tomáš Rohlínek
2026-02-05 16:35:07 +01:00
parent 148e333495
commit 0cc503180a
3 changed files with 35 additions and 30 deletions
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2025-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -163,15 +163,19 @@ TEST(partition_bdl, test_partition_bdl_limits)
TEST(partition_bdl, test_bdl_partition_readonly)
{
//storage3 is readonly partition
const esp_partition_t *partition = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_ANY, "storage3");
TEST_ASSERT_NOT_NULL(partition);
esp_blockdev_handle_t part_blockdev = NULL;
TEST_ESP_OK(esp_partition_get_blockdev(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_ANY, "storage3", &part_blockdev));
//test flags
TEST_ASSERT_EQUAL(1, part_blockdev->device_flags.read_only);
TEST_ASSERT_EQUAL(0, part_blockdev->geometry.write_size);
TEST_ASSERT_EQUAL(0, part_blockdev->geometry.erase_size);
TEST_ASSERT_EQUAL(0, part_blockdev->geometry.recommended_write_size);
TEST_ASSERT_EQUAL(0, part_blockdev->geometry.recommended_erase_size);
const size_t expected_write_size = partition->encrypted ? 16 : 1;
TEST_ASSERT_EQUAL(expected_write_size, part_blockdev->geometry.write_size);
TEST_ASSERT_EQUAL(partition->erase_size, part_blockdev->geometry.erase_size);
TEST_ASSERT_EQUAL(expected_write_size, part_blockdev->geometry.recommended_write_size);
TEST_ASSERT_EQUAL(partition->erase_size, part_blockdev->geometry.recommended_erase_size);
uint8_t dummy_test_buff[1024];
+15 -18
View File
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2015-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@@ -727,29 +727,26 @@ esp_err_t esp_partition_ptr_get_blockdev(const esp_partition_t* partition, esp_b
ESP_BLOCKDEV_FLAGS_INST_CONFIG_DEFAULT(out->device_flags);
if(partition->readonly) {
out->device_flags.read_only = 1;
out->geometry.write_size = 0;
out->geometry.erase_size = 0;
out->geometry.recommended_write_size = 0;
out->geometry.recommended_erase_size = 0;
}
else {
if (partition->encrypted) {
out->geometry.write_size = 16;
out->geometry.recommended_write_size = 16;
} else {
out->geometry.write_size = 1;
out->geometry.recommended_write_size = 1;
}
out->geometry.erase_size = partition->erase_size;
out->geometry.recommended_erase_size = partition->erase_size;
out->device_flags.read_only = partition->readonly ? 1 : 0;
if (partition->encrypted) {
out->geometry.write_size = 16;
out->geometry.recommended_write_size = 16;
} else {
out->geometry.write_size = 1;
out->geometry.recommended_write_size = 1;
}
out->geometry.erase_size = partition->erase_size;
out->geometry.recommended_erase_size = partition->erase_size;
out->geometry.read_size = 1;
out->geometry.recommended_read_size = 1;
out->geometry.disk_size = partition->size;
out->ops = &s_bdl_ops;
*out_bdl_handle_ptr = out;
return ESP_OK;
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2025-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@@ -188,15 +188,19 @@
TEST(esp_partition, test_bdl_interface_readonly)
{
//storage3 is readonly partition
esp_blockdev_handle_t part_blockdev = NULL;
TEST_ESP_OK(esp_partition_get_blockdev(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_ANY, "storage3", &part_blockdev));
const esp_partition_t *partition = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_ANY, "storage3");
TEST_ASSERT_NOT_NULL(partition);
esp_blockdev_handle_t part_blockdev = NULL;
TEST_ESP_OK(esp_partition_get_blockdev(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_ANY, "storage3", &part_blockdev));
//test flags
TEST_ASSERT_EQUAL(1, part_blockdev->device_flags.read_only);
TEST_ASSERT_EQUAL(0, part_blockdev->geometry.write_size);
TEST_ASSERT_EQUAL(0, part_blockdev->geometry.erase_size);
TEST_ASSERT_EQUAL(0, part_blockdev->geometry.recommended_write_size);
TEST_ASSERT_EQUAL(0, part_blockdev->geometry.recommended_erase_size);
const size_t expected_write_size = partition->encrypted ? 16 : 1;
TEST_ASSERT_EQUAL(expected_write_size, part_blockdev->geometry.write_size);
TEST_ASSERT_EQUAL(partition->erase_size, part_blockdev->geometry.erase_size);
TEST_ASSERT_EQUAL(expected_write_size, part_blockdev->geometry.recommended_write_size);
TEST_ASSERT_EQUAL(partition->erase_size, part_blockdev->geometry.recommended_erase_size);
uint8_t dummy_test_buff[1024];