From 72c686167dfa5836191068aa475b73a1bf5daca1 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Tue, 18 Dec 2012 14:44:42 +0100 Subject: 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 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 - * + * Copyright (c) 2009, 2012 embedded brains GmbH. All rights reserved. + * + * embedded brains GmbH + * Obere Lagerstr. 30 + * 82178 Puchheim + * Germany + * * * 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 #include #include +#include #include #include +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 #include #include +#include #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 -- cgit v1.2.3