summaryrefslogtreecommitdiffstats
path: root/cpukit/libblock/src/diskdevs.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2012-05-30 13:40:34 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2012-05-31 11:05:48 +0200
commit73c09b3b8efc52831e80295e010fd7bfbd8c4b0c (patch)
treef4232b1f6ba94d5b0666177c8a00a2ff5c87a0f5 /cpukit/libblock/src/diskdevs.c
parentlibblock: Remove explicit bds_per_group parameter (diff)
downloadrtems-73c09b3b8efc52831e80295e010fd7bfbd8c4b0c.tar.bz2
libblock: Simplify disk management
Add block_count and media_blocks_per_block to rtems_disk_device. Add and use rtems_disk_init_phys() and rtems_disk_init_log().
Diffstat (limited to 'cpukit/libblock/src/diskdevs.c')
-rw-r--r--cpukit/libblock/src/diskdevs.c83
1 files changed, 41 insertions, 42 deletions
diff --git a/cpukit/libblock/src/diskdevs.c b/cpukit/libblock/src/diskdevs.c
index 285bc05efb..96bcf88f52 100644
--- a/cpukit/libblock/src/diskdevs.c
+++ b/cpukit/libblock/src/diskdevs.c
@@ -10,7 +10,7 @@
* Copyright (C) 2001 OKTET Ltd., St.-Petersburg, Russia
* Author: Victor V. Vengerov <vvv@oktet.ru>
*
- * Copyright (c) 2009 embedded brains GmbH.
+ * Copyright (c) 2009-2012 embedded brains GmbH.
*/
#if HAVE_CONFIG_H
@@ -170,7 +170,12 @@ create_disk_table_entry(dev_t dev)
}
static rtems_status_code
-create_disk(dev_t dev, const char *name, rtems_disk_device **dd_ptr)
+create_disk(
+ dev_t dev,
+ const char *name,
+ rtems_disk_device **dd_ptr,
+ char **alloc_name_ptr
+)
{
rtems_disk_device **dd_entry = create_disk_table_entry(dev);
rtems_disk_device *dd = NULL;
@@ -207,13 +212,9 @@ create_disk(dev_t dev, const char *name, rtems_disk_device **dd_ptr)
}
}
- dd->dev = dev;
- dd->name = alloc_name;
- dd->uses = 0;
- dd->deleted = false;
-
*dd_entry = dd;
*dd_ptr = dd;
+ *alloc_name_ptr = alloc_name;
return RTEMS_SUCCESSFUL;
}
@@ -238,6 +239,7 @@ rtems_status_code rtems_disk_create_phys(
{
rtems_disk_device *dd = NULL;
rtems_status_code sc = RTEMS_SUCCESSFUL;
+ char *alloc_name = NULL;
if (handler == NULL) {
return RTEMS_INVALID_ADDRESS;
@@ -248,25 +250,24 @@ rtems_status_code rtems_disk_create_phys(
return sc;
}
- sc = create_disk(dev, name, &dd);
+ sc = create_disk(dev, name, &dd, &alloc_name);
if (sc != RTEMS_SUCCESSFUL) {
disk_unlock();
return sc;
}
- dd->phys_dev = dd;
- dd->start = 0;
- dd->size = block_count;
- dd->media_block_size = block_size;
- dd->ioctl = handler;
- dd->driver_data = driver_data;
+ sc = rtems_disk_init_phys(
+ dd,
+ block_size,
+ block_count,
+ handler,
+ driver_data
+ );
- if ((*handler)(dd, RTEMS_BLKIO_CAPABILITIES, &dd->capabilities) < 0) {
- dd->capabilities = 0;
- }
+ dd->dev = dev;
+ dd->name = alloc_name;
- sc = rtems_bdbuf_set_block_size(dd, block_size);
if (sc != RTEMS_SUCCESSFUL) {
dd->ioctl = null_handler;
rtems_disk_delete(dev);
@@ -289,57 +290,55 @@ is_physical_disk(const rtems_disk_device *dd)
rtems_status_code rtems_disk_create_log(
dev_t dev,
dev_t phys,
- rtems_blkdev_bnum begin_block,
+ rtems_blkdev_bnum block_begin,
rtems_blkdev_bnum block_count,
const char *name
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
- rtems_disk_device *physical_disk = NULL;
+ rtems_disk_device *phys_dd = NULL;
rtems_disk_device *dd = NULL;
- rtems_blkdev_bnum end_block = begin_block + block_count;
+ char *alloc_name = NULL;
sc = disk_lock();
if (sc != RTEMS_SUCCESSFUL) {
return sc;
}
- physical_disk = get_disk_entry(phys, true);
- if (physical_disk == NULL || !is_physical_disk(physical_disk)) {
+ phys_dd = get_disk_entry(phys, true);
+ if (phys_dd == NULL) {
disk_unlock();
return RTEMS_INVALID_ID;
}
- if (
- begin_block >= physical_disk->size
- || end_block <= begin_block
- || end_block > physical_disk->size
- ) {
+ sc = create_disk(dev, name, &dd, &alloc_name);
+ if (sc != RTEMS_SUCCESSFUL) {
disk_unlock();
- return RTEMS_INVALID_NUMBER;
+ return sc;
}
- sc = create_disk(dev, name, &dd);
+ sc = rtems_disk_init_log(
+ dd,
+ phys_dd,
+ block_begin,
+ block_count
+ );
+
+ dd->dev = dev;
+ dd->name = alloc_name;
+
+ ++phys_dd->uses;
+
if (sc != RTEMS_SUCCESSFUL) {
+ dd->ioctl = null_handler;
+ rtems_disk_delete(dev);
disk_unlock();
return sc;
}
- dd->phys_dev = physical_disk;
- dd->start = begin_block;
- dd->size = block_count;
- dd->block_size = physical_disk->block_size;
- dd->media_block_size = physical_disk->media_block_size;
- dd->block_to_media_block_shift = physical_disk->block_to_media_block_shift;
- dd->bds_per_group = physical_disk->bds_per_group;
- dd->ioctl = physical_disk->ioctl;
- dd->driver_data = physical_disk->driver_data;
-
- ++physical_disk->uses;
-
disk_unlock();
return RTEMS_SUCCESSFUL;