diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2010-04-30 08:42:13 +0000 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2010-04-30 08:42:13 +0000 |
commit | 67808290370e184f5a4fb7e1bff0402e5104d016 (patch) | |
tree | 59733050629d923611f226d2a5c49ff1f9b0f2fa /cpukit/libblock/src/bdpart-register.c | |
parent | 2010-04-30 Sebastian Huber <sebastian.huber@embedded-brains.de> (diff) | |
download | rtems-67808290370e184f5a4fb7e1bff0402e5104d016.tar.bz2 |
2010-04-30 Sebastian Huber <sebastian.huber@embedded-brains.de>
* libblock/src/bdpart.c: Removed file.
* libblock/src/bdpart-create.c, libblock/src/bdpart-dump.c,
libblock/src/bdpart-mount.c, libblock/src/bdpart-read.c,
libblock/src/bdpart-register.c, libblock/src/bdpart-sort.c,
libblock/src/bdpart-write.c: New files.
* libblock/include/rtems/bdpart.h: Moved some definitions from bdpart.c.
* libblock/Makefile.am: Update for file changes.
Diffstat (limited to 'cpukit/libblock/src/bdpart-register.c')
-rw-r--r-- | cpukit/libblock/src/bdpart-register.c | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/cpukit/libblock/src/bdpart-register.c b/cpukit/libblock/src/bdpart-register.c new file mode 100644 index 0000000000..172c8b4964 --- /dev/null +++ b/cpukit/libblock/src/bdpart-register.c @@ -0,0 +1,163 @@ +/** + * @file + * + * @ingroup rtems_bdpart + * + * Block device partition management. + */ + +/* + * Copyright (c) 2009, 2010 + * embedded brains GmbH + * Obere Lagerstr. 30 + * D-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 + * http://www.rtems.com/license/LICENSE. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include <rtems.h> +#include <rtems/bdpart.h> + +rtems_status_code rtems_bdpart_register( + const char *disk_name, + const rtems_bdpart_partition *pt, + size_t count +) +{ + 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; + + /* Get disk data */ + sc = rtems_bdpart_get_disk_data( disk_name, &disk, &disk_end); + if (sc != RTEMS_SUCCESSFUL) { + return sc; + } + + /* 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); + if (logical_disk_name == NULL) { + return RTEMS_NO_MEMORY; + } + 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; + goto cleanup; + } + + /* Create logical disk */ + sc = rtems_disk_create_log( + logical_disk, + disk, + p->begin, + p->end - p->begin, + logical_disk_name + ); + if (sc != RTEMS_SUCCESSFUL) { + esc = sc; + goto cleanup; + } + } + +cleanup: + + free( logical_disk_name); + + return esc; +} + +rtems_status_code rtems_bdpart_register_from_disk( const char *disk_name) +{ + rtems_status_code sc = RTEMS_SUCCESSFUL; + rtems_bdpart_format format; + rtems_bdpart_partition pt [RTEMS_BDPART_PARTITION_NUMBER_HINT]; + size_t count = RTEMS_BDPART_PARTITION_NUMBER_HINT; + + /* Read partitions */ + sc = rtems_bdpart_read( disk_name, &format, pt, &count); + if (sc != RTEMS_SUCCESSFUL) { + return sc; + } + + /* Register partitions */ + return rtems_bdpart_register( disk_name, pt, count); +} + +rtems_status_code rtems_bdpart_unregister( + const char *disk_name, + const rtems_bdpart_partition *pt __attribute__((unused)), + size_t count +) +{ + rtems_status_code sc = 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; + size_t i = 0; + + /* Get disk data */ + sc = rtems_bdpart_get_disk_data( disk_name, &disk, &disk_end); + if (sc != RTEMS_SUCCESSFUL) { + return sc; + } + + /* Get the disk device identifier */ + rtems_filesystem_split_dev_t( disk, major, minor); + + /* Create a logical disk for each partition */ + for (i = 0; i < count; ++i) { + /* New minor number */ + ++minor; + + /* Get the device identifier */ + logical_disk = rtems_filesystem_make_dev_t( major, minor); + + /* Delete logical disk */ + sc = rtems_disk_delete( logical_disk); + if (sc != RTEMS_SUCCESSFUL) { + return sc; + } + } + + return RTEMS_SUCCESSFUL; +} |