[PATCH rtems6 - v2 14/16] flashdev: revise region creation

berndmoessner80 at gmail.com berndmoessner80 at gmail.com
Sun Jan 7 18:18:48 UTC 2024


From: Bernd Moessner <berndmoessner80 at gmail.com>

Create / update region only if it is aligned to erase size

Updates #4981
---
 cpukit/dev/flash/flashdev.c           | 14 ++++++++++++++
 testsuites/libtests/flashdev01/init.c | 12 ++++++++++++
 2 files changed, 26 insertions(+)

diff --git a/cpukit/dev/flash/flashdev.c b/cpukit/dev/flash/flashdev.c
index d18d14b2f8..8aa4380ab7 100644
--- a/cpukit/dev/flash/flashdev.c
+++ b/cpukit/dev/flash/flashdev.c
@@ -738,6 +738,13 @@ static int rtems_flashdev_ioctl_create_region(
   int i;
   rtems_flashdev_region_table *table = flash->region_table;
 
+  /* Region is only valid if it can be erased */
+  i = rtems_check_erase_valid(flash, region_in->offset, region_in->size);
+  if(i < 0)
+  {
+    return i;
+  }
+
   /* Find unallocated region slot */
   i = rtems_flashdev_find_unallocated_region(flash->region_table);
   if (i == RTEMS_FLASHDEV_REGION_ALLOC_FULL) {
@@ -764,6 +771,13 @@ static int rtems_flashdev_ioctl_update_region(
   uint32_t region_index = rtems_flashdev_get_region_index( iop );
   rtems_flashdev_region_table *table = flash->region_table;
 
+  /* Region is only valid if it can be erased */
+  int i = rtems_check_erase_valid(flash, region_in->offset, region_in->size);
+  if(i < 0)
+  {
+    return i;
+  }
+
   /**
    * If region index is larger then maximum region index or region
    * index at given index is undefined return an error.
diff --git a/testsuites/libtests/flashdev01/init.c b/testsuites/libtests/flashdev01/init.c
index fd3bda769e..5755708525 100644
--- a/testsuites/libtests/flashdev01/init.c
+++ b/testsuites/libtests/flashdev01/init.c
@@ -221,6 +221,18 @@ static void run_test(void) {
 
   fd = fileno(file);
 
+  /* Test Regions - this one must fail */
+  region.offset = 0x401;
+  region.size = 0x200;
+  status = ioctl(fd, RTEMS_FLASHDEV_IOCTL_SET_REGION, &region);
+  rtems_test_assert(status);
+
+  /* Test Regions - this one must fail */
+  region.offset = 0x400;
+  region.size = 0xFF;
+  status = ioctl(fd, RTEMS_FLASHDEV_IOCTL_SET_REGION, &region);
+  rtems_test_assert(status);
+
   /* Test Regions */
   region.offset = 0x400;
   region.size = 0x200;
-- 
2.34.1



More information about the devel mailing list