summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2012-12-18 14:44:42 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2012-12-21 15:45:55 +0100
commit72c686167dfa5836191068aa475b73a1bf5daca1 (patch)
treebe47f1e8012ebd45bc1f4179304ac900e2fb32cc
parentIMFS: Fix resource leak in IMFS_allocate_node() (diff)
downloadrtems-72c686167dfa5836191068aa475b73a1bf5daca1.tar.bz2
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.
-rw-r--r--cpukit/libblock/src/bdpart-register.c135
-rw-r--r--testsuites/fstests/fsbdpart01/init.c28
2 files changed, 108 insertions, 55 deletions
diff --git a/cpukit/libblock/src/bdpart-register.c b/cpukit/libblock/src/bdpart-register.c
index ebaffd181e..c1de2cab67 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@embedded-brains.de>
+ * Copyright (c) 2009, 2012 embedded brains GmbH. All rights reserved.
+ *
+ * embedded brains GmbH
+ * Obere Lagerstr. 30
+ * 82178 Puchheim
+ * Germany
+ * <rtems@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 3539a05359..aea0da08d1 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