[rtems commit] libblock: Use rtems_blkdev_create_partition()

Sebastian Huber sebh at rtems.org
Fri Dec 21 15:07:42 UTC 2012


Module:    rtems
Branch:    master
Commit:    72c686167dfa5836191068aa475b73a1bf5daca1
Changeset: http://git.rtems.org/rtems/commit/?id=72c686167dfa5836191068aa475b73a1bf5daca1

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Tue Dec 18 14:44:42 2012 +0100

libblock: Use rtems_blkdev_create_partition()

Use rtems_blkdev_create_partition() instead of rtems_disk_create_log()
to avoid problems with the huge IMFS_GENERIC_DEVICE_MAJOR_NUMBER.

---

 cpukit/libblock/src/bdpart-register.c |  135 ++++++++++++++++++++-------------
 testsuites/fstests/fsbdpart01/init.c  |   28 ++++++-
 2 files changed, 108 insertions(+), 55 deletions(-)

diff --git a/cpukit/libblock/src/bdpart-register.c b/cpukit/libblock/src/bdpart-register.c
index ebaffd1..c1de2ca 100644
--- a/cpukit/libblock/src/bdpart-register.c
+++ b/cpukit/libblock/src/bdpart-register.c
@@ -7,12 +7,13 @@
  */
 
 /*
- * Copyright (c) 2009, 2010
- * embedded brains GmbH
- * Obere Lagerstr. 30
- * D-82178 Puchheim
- * Germany
- * <rtems at embedded-brains.de>
+ * Copyright (c) 2009, 2012 embedded brains GmbH.  All rights reserved.
+ *
+ *  embedded brains GmbH
+ *  Obere Lagerstr. 30
+ *  82178 Puchheim
+ *  Germany
+ *  <rtems at embedded-brains.de>
  *
  * The license and distribution terms for this file may be
  * found in the file LICENSE in this distribution or at
@@ -20,16 +21,46 @@
  */
 
 #ifdef HAVE_CONFIG_H
-#include "config.h"
+  #include "config.h"
 #endif
 
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <unistd.h>
 
 #include <rtems.h>
 #include <rtems/bdpart.h>
 
+static char *create_logical_disk_name( const char *disk_name, char **marker)
+{
+  size_t disk_name_size = strlen( disk_name);
+  char *logical_disk_name = malloc( disk_name_size + RTEMS_BDPART_NUMBER_SIZE);
+
+  if (logical_disk_name != NULL) {
+    strncpy( logical_disk_name, disk_name, disk_name_size);
+    *marker = logical_disk_name + disk_name_size;
+  }
+
+  return logical_disk_name;
+}
+
+static rtems_status_code update_logical_disk_name(
+  char *logical_disk_marker,
+  size_t i
+)
+{
+  rtems_status_code sc = RTEMS_SUCCESSFUL;
+  int rv = 0;
+
+  rv = snprintf( logical_disk_marker, RTEMS_BDPART_NUMBER_SIZE, "%zu", i + 1);
+  if (rv >= RTEMS_BDPART_NUMBER_SIZE) {
+    sc = RTEMS_INVALID_NAME;
+  }
+
+  return sc;
+}
+
 rtems_status_code rtems_bdpart_register(
   const char *disk_name,
   const rtems_bdpart_partition *pt,
@@ -38,14 +69,9 @@ rtems_status_code rtems_bdpart_register(
 {
   rtems_status_code sc = RTEMS_SUCCESSFUL;
   rtems_status_code esc = RTEMS_SUCCESSFUL;
-  rtems_device_major_number major = 0;
-  rtems_device_minor_number minor = 0;
   rtems_blkdev_bnum disk_end = 0;
-  dev_t disk = 0;
-  dev_t logical_disk = 0;
   char *logical_disk_name = NULL;
   char *logical_disk_marker = NULL;
-  size_t disk_name_size = strlen( disk_name);
   size_t i = 0;
   int fd = -1;
   rtems_disk_device *dd = NULL;
@@ -55,45 +81,34 @@ rtems_status_code rtems_bdpart_register(
   if (sc != RTEMS_SUCCESSFUL) {
     return sc;
   }
-  disk = rtems_disk_get_device_identifier( dd);
-  close( fd);
-
-  /* Get the disk device identifier */
-  rtems_filesystem_split_dev_t( disk, major, minor);
 
   /* Create logical disk name */
-  logical_disk_name = malloc( disk_name_size + RTEMS_BDPART_NUMBER_SIZE);
+  logical_disk_name = create_logical_disk_name(
+    disk_name,
+    &logical_disk_marker
+  );
   if (logical_disk_name == NULL) {
-    return RTEMS_NO_MEMORY;
+    esc = sc;
+    goto cleanup;
   }
-  strncpy( logical_disk_name, disk_name, disk_name_size);
-  logical_disk_marker = logical_disk_name + disk_name_size;
 
   /* Create a logical disk for each partition */
   for (i = 0; i < count; ++i) {
     const rtems_bdpart_partition *p = pt + i;
-    int rv = 0;
-
-    /* New minor number */
-    ++minor;
-
-    /* Create a new device identifier */
-    logical_disk = rtems_filesystem_make_dev_t( major, minor);
 
     /* Set partition number for logical disk name */
-    rv = snprintf( logical_disk_marker, RTEMS_BDPART_NUMBER_SIZE, "%zu", i + 1);
-    if (rv >= RTEMS_BDPART_NUMBER_SIZE) {
-      esc = RTEMS_INVALID_NAME;
+    sc = update_logical_disk_name( logical_disk_marker, i);
+    if (sc != RTEMS_SUCCESSFUL) {
+      esc = sc;
       goto cleanup;
     }
 
     /* Create logical disk */
-    sc = rtems_disk_create_log(
-      logical_disk,
-      disk,
+    sc = rtems_blkdev_create_partition(
+      logical_disk_name,
+      disk_name,
       p->begin,
-      p->end - p->begin,
-      logical_disk_name
+      p->end - p->begin
     );
     if (sc != RTEMS_SUCCESSFUL) {
       esc = sc;
@@ -104,6 +119,7 @@ rtems_status_code rtems_bdpart_register(
 cleanup:
 
   free( logical_disk_name);
+  close( fd);
 
   return esc;
 }
@@ -132,11 +148,10 @@ rtems_status_code rtems_bdpart_unregister(
 )
 {
   rtems_status_code sc = RTEMS_SUCCESSFUL;
-  rtems_device_major_number major = 0;
-  rtems_device_minor_number minor = 0;
+  rtems_status_code esc = RTEMS_SUCCESSFUL;
   rtems_blkdev_bnum disk_end = 0;
-  dev_t disk = 0;
-  dev_t logical_disk = 0;
+  char *logical_disk_name = NULL;
+  char *logical_disk_marker = NULL;
   size_t i = 0;
   int fd = -1;
   rtems_disk_device *dd = NULL;
@@ -146,26 +161,40 @@ rtems_status_code rtems_bdpart_unregister(
   if (sc != RTEMS_SUCCESSFUL) {
     return sc;
   }
-  disk = rtems_disk_get_device_identifier( dd);
-  close( fd);
 
-  /* Get the disk device identifier */
-  rtems_filesystem_split_dev_t( disk, major, minor);
+  /* Create logical disk name */
+  logical_disk_name = create_logical_disk_name(
+    disk_name,
+    &logical_disk_marker
+  );
+  if (logical_disk_name == NULL) {
+    esc = sc;
+    goto cleanup;
+  }
 
-  /* Create a logical disk for each partition */
+  /* Delete the logical disk for each partition */
   for (i = 0; i < count; ++i) {
-    /* New minor number */
-    ++minor;
+    int rv = 0;
 
-    /* Get the device identifier */
-    logical_disk = rtems_filesystem_make_dev_t( major, minor);
+    /* Set partition number for logical disk name */
+    sc = update_logical_disk_name( logical_disk_marker, i);
+    if (sc != RTEMS_SUCCESSFUL) {
+      esc = sc;
+      goto cleanup;
+    }
 
     /* Delete logical disk */
-    sc = rtems_disk_delete( logical_disk);
-    if (sc != RTEMS_SUCCESSFUL) {
-      return sc;
+    rv = unlink( logical_disk_name);
+    if (rv != 0) {
+      esc = sc;
+      goto cleanup;
     }
   }
 
-  return RTEMS_SUCCESSFUL;
+cleanup:
+
+  free( logical_disk_name);
+  close( fd);
+
+  return esc;
 }
diff --git a/testsuites/fstests/fsbdpart01/init.c b/testsuites/fstests/fsbdpart01/init.c
index 3539a05..aea0da0 100644
--- a/testsuites/fstests/fsbdpart01/init.c
+++ b/testsuites/fstests/fsbdpart01/init.c
@@ -25,6 +25,7 @@
 #include <rtems/blkdev.h>
 #include <rtems/ide_part_table.h>
 #include <rtems/ramdisk.h>
+#include <rtems/libcsupport.h>
 
 #define ASSERT_SC(sc) rtems_test_assert((sc) == RTEMS_SUCCESSFUL)
 
@@ -99,12 +100,27 @@ static void test_logical_disks(const char *const *rdax, bool exists)
   }
 }
 
+static void initialize_swapout_task(void)
+{
+  int fd = open(rda, O_RDONLY);
+  int rv = 0;
+
+  rtems_test_assert(fd >= 0);
+
+  rv = rtems_disk_fd_sync(fd);
+  rtems_test_assert(rv == 0);
+
+  rv = close(fd);
+  rtems_test_assert(rv == 0);
+}
+
 static void test_bdpart(void)
 {
   rtems_status_code sc = RTEMS_SUCCESSFUL;
   rtems_bdpart_partition created_partitions [PARTITION_COUNT];
   rtems_bdpart_format actual_format;
   rtems_bdpart_partition actual_partitions [PARTITION_COUNT];
+  rtems_resource_snapshot before;
   size_t actual_count = PARTITION_COUNT;
   size_t i = 0;
 
@@ -112,6 +128,10 @@ static void test_bdpart(void)
   memset(&actual_format, 0, sizeof(actual_format));
   memset(&actual_partitions [0], 0, sizeof(actual_partitions));
 
+  initialize_swapout_task();
+
+  rtems_resource_snapshot_take(&before);
+
   for (i = 0; i < PARTITION_COUNT; ++i) {
     rtems_bdpart_to_partition_type(
       RTEMS_BDPART_MBR_FAT_32,
@@ -168,6 +188,8 @@ static void test_bdpart(void)
   ASSERT_SC(sc);
   test_logical_disks(&bdpart_rdax [0], false);
 
+  rtems_test_assert(rtems_resource_snapshot_check(&before));
+
   sc = rtems_bdpart_register_from_disk(rda);
   ASSERT_SC(sc);
   test_logical_disks(&bdpart_rdax [0], true);
@@ -180,6 +202,8 @@ static void test_bdpart(void)
   ASSERT_SC(sc);
   test_logical_disks(&bdpart_rdax [0], false);
 
+  rtems_test_assert(rtems_resource_snapshot_check(&before));
+
   rtems_bdpart_dump(&actual_partitions [0], actual_count);
 }
 
@@ -216,13 +240,13 @@ size_t rtems_ramdisk_configuration_size = 1;
 #define CONFIGURE_APPLICATION_EXTRA_DRIVERS RAMDISK_DRIVER_TABLE_ENTRY
 #define CONFIGURE_APPLICATION_NEEDS_LIBBLOCK
 
-#define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 4
+#define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 13
 
 #define CONFIGURE_USE_IMFS_AS_BASE_FILESYSTEM
 
 #define CONFIGURE_MAXIMUM_TASKS 2
 
-#define CONFIGURE_EXTRA_TASK_STACKS (8 * 1024)
+#define CONFIGURE_INIT_TASK_STACK_SIZE (32 * 1024)
 
 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE
 




More information about the vc mailing list