summaryrefslogtreecommitdiffstats
path: root/cpukit/libblock
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 /cpukit/libblock
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.
Diffstat (limited to 'cpukit/libblock')
-rw-r--r--cpukit/libblock/src/bdpart-register.c135
1 files changed, 82 insertions, 53 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;
}