summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2012-02-28 17:19:49 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2012-03-13 12:24:18 +0100
commit796967c3df40a51a9028bc83d1a4b6dbeae07c3f (patch)
treeedd7251883f74506a69f76e6e9fbf173de195f50
parentlibblock: Documentation (diff)
downloadrtems-796967c3df40a51a9028bc83d1a4b6dbeae07c3f.tar.bz2
libblock: Change bdbuf API
The functions o rtems_bdbuf_get(), o rtems_bdbuf_read(), o rtems_bdbuf_syncdev(), and o rtems_bdbuf_purge_dev(), use now the disk device instead of the device identifier. This makes bdbuf independent of rtems_disk_obtain() and rtems_disk_release(). It is the responsiblity of the file system to obtain the disk device. This also reduces the overhead to get a buffer. The key for the AVL tree uses now the disk device instead of the device identifier. The pointer is interpreted as an unsigned integer. This reduces the memory overhead and makes the comparison operation a bit faster. Removed function rtems_bdbuf_purge_major(). This function was too destructive and could have unpredictable side effects.
-rw-r--r--cpukit/libblock/include/rtems/bdbuf.h39
-rw-r--r--cpukit/libblock/include/rtems/bdpart.h16
-rw-r--r--cpukit/libblock/src/bdbuf.c237
-rw-r--r--cpukit/libblock/src/bdpart-create.c13
-rw-r--r--cpukit/libblock/src/bdpart-read.c65
-rw-r--r--cpukit/libblock/src/bdpart-register.c12
-rw-r--r--cpukit/libblock/src/bdpart-write.c17
-rw-r--r--cpukit/libblock/src/blkdev.c10
-rw-r--r--cpukit/libblock/src/media.c15
-rw-r--r--cpukit/libfs/src/dosfs/fat.c76
-rw-r--r--cpukit/libfs/src/dosfs/fat.h2
-rw-r--r--cpukit/libfs/src/dosfs/fat_file.c2
-rw-r--r--cpukit/libfs/src/dosfs/msdos_dir.c2
-rw-r--r--cpukit/libfs/src/dosfs/msdos_file.c2
-rw-r--r--cpukit/libfs/src/dosfs/msdos_format.c32
-rw-r--r--cpukit/libfs/src/rfs/rtems-rfs-buffer.c35
-rw-r--r--cpukit/libfs/src/rfs/rtems-rfs-file-system.h12
-rw-r--r--testsuites/libtests/block02/init.c35
-rw-r--r--testsuites/libtests/block03/init.c27
-rw-r--r--testsuites/libtests/block04/init.c23
-rw-r--r--testsuites/libtests/block05/init.c59
-rw-r--r--testsuites/libtests/block06/init.c78
-rw-r--r--testsuites/libtests/block07/init.c19
-rw-r--r--testsuites/libtests/block08/bdbuf_test1_1.c6
-rw-r--r--testsuites/libtests/block08/bdbuf_test1_2.c4
-rw-r--r--testsuites/libtests/block08/bdbuf_test1_3.c4
-rw-r--r--testsuites/libtests/block08/bdbuf_test1_4.c4
-rw-r--r--testsuites/libtests/block08/bdbuf_test1_5.c4
-rw-r--r--testsuites/libtests/block08/bdbuf_test2_1.c4
-rw-r--r--testsuites/libtests/block08/bdbuf_test2_2.c4
-rw-r--r--testsuites/libtests/block08/bdbuf_test3_1.c6
-rw-r--r--testsuites/libtests/block08/bdbuf_test3_2.c6
-rw-r--r--testsuites/libtests/block08/bdbuf_test3_3.c6
-rw-r--r--testsuites/libtests/block08/bdbuf_test4_1.c4
-rw-r--r--testsuites/libtests/block08/bdbuf_test4_2.c4
-rw-r--r--testsuites/libtests/block08/bdbuf_test4_3.c4
-rw-r--r--testsuites/libtests/block08/bdbuf_tests.c10
-rw-r--r--testsuites/libtests/block08/bdbuf_tests.h8
-rw-r--r--testsuites/libtests/block08/test_disk.c3
-rw-r--r--testsuites/libtests/block09/init.c40
-rw-r--r--testsuites/libtests/block10/init.c20
-rw-r--r--testsuites/samples/fileio/init.c67
42 files changed, 517 insertions, 519 deletions
diff --git a/cpukit/libblock/include/rtems/bdbuf.h b/cpukit/libblock/include/rtems/bdbuf.h
index 37e06aa9e9..254c745c7a 100644
--- a/cpukit/libblock/include/rtems/bdbuf.h
+++ b/cpukit/libblock/include/rtems/bdbuf.h
@@ -301,7 +301,7 @@ typedef struct rtems_bdbuf_group rtems_bdbuf_group;
* To manage buffers we using buffer descriptors (BD). A BD holds a buffer plus
* a range of other information related to managing the buffer in the cache. To
* speed-up buffer lookup descriptors are organized in AVL-Tree. The fields
- * 'dev' and 'block' are search keys.
+ * 'dd' and 'block' are search keys.
*/
typedef struct rtems_bdbuf_buffer
{
@@ -315,7 +315,7 @@ typedef struct rtems_bdbuf_buffer
signed char bal; /**< The balance of the sub-tree */
} avl;
- dev_t dev; /**< device number */
+ const rtems_disk_device *dd; /**< disk device */
rtems_blkdev_bnum block; /**< block number on the device */
@@ -470,8 +470,7 @@ rtems_bdbuf_init (void);
* The block number is the linear block number. This is relative to the start
* of the partition on the media.
*
- * @param device [in] Device number (constructed of major and minor device
- * number).
+ * @param dd [in] The disk device.
* @param block [in] Linear media block number.
* @param bd [out] Reference to the buffer descriptor pointer.
*
@@ -481,7 +480,11 @@ rtems_bdbuf_init (void);
* @retval RTEMS_INVALID_NUMBER Invalid block size.
*/
rtems_status_code
-rtems_bdbuf_get (dev_t device, rtems_blkdev_bnum block, rtems_bdbuf_buffer** bd);
+rtems_bdbuf_get (
+ const rtems_disk_device *dd,
+ rtems_blkdev_bnum block,
+ rtems_bdbuf_buffer** bd
+);
/**
* Get the block buffer and if not already in the cache read from the disk. If
@@ -498,8 +501,7 @@ rtems_bdbuf_get (dev_t device, rtems_blkdev_bnum block, rtems_bdbuf_buffer** bd)
* buffer is returned. The highest priority waiter will obtain the buffer
* first.
*
- * @param device [in] Device number (constructed of major and minor device
- * number).
+ * @param dd [in] The disk device.
* @param block [in] Linear media block number.
* @param bd [out] Reference to the buffer descriptor pointer.
*
@@ -510,7 +512,11 @@ rtems_bdbuf_get (dev_t device, rtems_blkdev_bnum block, rtems_bdbuf_buffer** bd)
* @retval RTEMS_IO_ERROR IO error.
*/
rtems_status_code
-rtems_bdbuf_read (dev_t device, rtems_blkdev_bnum block, rtems_bdbuf_buffer** bd);
+rtems_bdbuf_read (
+ const rtems_disk_device *dd,
+ rtems_blkdev_bnum block,
+ rtems_bdbuf_buffer** bd
+);
/**
* Release the buffer obtained by a read call back to the cache. If the buffer
@@ -575,31 +581,22 @@ rtems_bdbuf_sync (rtems_bdbuf_buffer* bd);
* @note Nesting calls to sync multiple devices will be handled sequentially. A
* nested call will be blocked until the first sync request has complete.
*
- * @param dev [in] Device number (constructed of major and minor device
- * number).
+ * @param dd [in] The disk device.
*
* @retval RTEMS_SUCCESSFUL Successful operation.
* @retval RTEMS_NOT_CONFIGURED Not initialized.
* @retval RTEMS_INVALID_ID No such device.
*/
rtems_status_code
-rtems_bdbuf_syncdev (dev_t dev);
+rtems_bdbuf_syncdev (const rtems_disk_device *dd);
/**
- * @brief Purges all buffers that matches the device identifier @a dev.
+ * @brief Purges all buffers corresponding to the disk device @a dd.
*
* This may result in loss of data.
*/
void
-rtems_bdbuf_purge_dev (dev_t dev);
-
-/**
- * @brief Purges all buffers that matches the device major number @a major.
- *
- * This may result in loss of data.
- */
-void
-rtems_bdbuf_purge_major (rtems_device_major_number major);
+rtems_bdbuf_purge_dev (const rtems_disk_device *dd);
/** @} */
diff --git a/cpukit/libblock/include/rtems/bdpart.h b/cpukit/libblock/include/rtems/bdpart.h
index 907866eb43..873b9d31f6 100644
--- a/cpukit/libblock/include/rtems/bdpart.h
+++ b/cpukit/libblock/include/rtems/bdpart.h
@@ -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
@@ -398,7 +399,8 @@ static inline uint8_t rtems_bdpart_mbr_partition_type(
rtems_status_code rtems_bdpart_get_disk_data(
const char *disk_name,
- dev_t *disk,
+ int *fd_ptr,
+ const rtems_disk_device **dd_ptr,
rtems_blkdev_bnum *disk_end
);
diff --git a/cpukit/libblock/src/bdbuf.c b/cpukit/libblock/src/bdbuf.c
index 53782e80fc..a5eaa9560d 100644
--- a/cpukit/libblock/src/bdbuf.c
+++ b/cpukit/libblock/src/bdbuf.c
@@ -19,7 +19,7 @@
* Rewritten to remove score mutex access. Fixes many performance
* issues.
*
- * Copyright (c) 2009 embedded brains GmbH.
+ * Copyright (c) 2009-2012 embedded brains GmbH.
*
* @(#) bdbuf.c,v 1.14 2004/04/17 08:15:17 ralf Exp
*/
@@ -44,7 +44,7 @@
#include "rtems/bdbuf.h"
-#define BDBUF_INVALID_DEV ((dev_t) -1)
+#define BDBUF_INVALID_DEV NULL
/*
* Simpler label for this file.
@@ -58,7 +58,7 @@
typedef struct rtems_bdbuf_swapout_transfer
{
rtems_chain_control bds; /**< The transfer list of BDs. */
- dev_t dev; /**< The device the transfer is for. */
+ const rtems_disk_device *dd; /**< The device the transfer is for. */
bool syncing; /**< The data is a sync'ing. */
rtems_blkdev_request* write_req; /**< The write request array. */
uint32_t bufs_per_bd; /**< Number of buffers per bd. */
@@ -113,7 +113,7 @@ typedef struct rtems_bdbuf_cache
rtems_id sync_lock; /**< Sync calls block writes. */
bool sync_active; /**< True if a sync is active. */
rtems_id sync_requester; /**< The sync requester. */
- dev_t sync_device; /**< The device to sync and
+ const rtems_disk_device *sync_device; /**< The device to sync and
* BDBUF_INVALID_DEV not a device
* sync. */
@@ -174,7 +174,6 @@ typedef struct rtems_bdbuf_cache
#define RTEMS_BLKDEV_FATAL_BDBUF_STATE_0 RTEMS_BLKDEV_FATAL_ERROR(28)
#define RTEMS_BLKDEV_FATAL_BDBUF_STATE_1 RTEMS_BLKDEV_FATAL_ERROR(29)
#define RTEMS_BLKDEV_FATAL_BDBUF_STATE_2 RTEMS_BLKDEV_FATAL_ERROR(30)
-#define RTEMS_BLKDEV_FATAL_BDBUF_DISK_REL RTEMS_BLKDEV_FATAL_ERROR(31)
/**
* The events used in this code. These should be system events rather than
@@ -322,24 +321,25 @@ rtems_bdbuf_fatal (rtems_bdbuf_buf_state state, uint32_t error)
}
/**
- * Searches for the node with specified dev/block.
+ * Searches for the node with specified dd/block.
*
* @param root pointer to the root node of the AVL-Tree
- * @param dev device search key
+ * @param dd disk device search key
* @param block block search key
- * @retval NULL node with the specified dev/block is not found
- * @return pointer to the node with specified dev/block
+ * @retval NULL node with the specified dd/block is not found
+ * @return pointer to the node with specified dd/block
*/
static rtems_bdbuf_buffer *
rtems_bdbuf_avl_search (rtems_bdbuf_buffer** root,
- dev_t dev,
+ const rtems_disk_device *dd,
rtems_blkdev_bnum block)
{
rtems_bdbuf_buffer* p = *root;
- while ((p != NULL) && ((p->dev != dev) || (p->block != block)))
+ while ((p != NULL) && ((p->dd != dd) || (p->block != block)))
{
- if ((p->dev < dev) || ((p->dev == dev) && (p->block < block)))
+ if (((uintptr_t) p->dd < (uintptr_t) dd)
+ || ((p->dd == dd) && (p->block < block)))
{
p = p->avl.right;
}
@@ -364,7 +364,7 @@ static int
rtems_bdbuf_avl_insert(rtems_bdbuf_buffer** root,
rtems_bdbuf_buffer* node)
{
- dev_t dev = node->dev;
+ const rtems_disk_device *dd = node->dd;
rtems_blkdev_bnum block = node->block;
rtems_bdbuf_buffer* p = *root;
@@ -389,7 +389,8 @@ rtems_bdbuf_avl_insert(rtems_bdbuf_buffer** root,
{
*buf_prev++ = p;
- if ((p->dev < dev) || ((p->dev == dev) && (p->block < block)))
+ if (((uintptr_t) p->dd < (uintptr_t) dd)
+ || ((p->dd == dd) && (p->block < block)))
{
p->avl.cache = 1;
q = p->avl.right;
@@ -400,7 +401,7 @@ rtems_bdbuf_avl_insert(rtems_bdbuf_buffer** root,
break;
}
}
- else if ((p->dev != dev) || (p->block != block))
+ else if ((p->dd != dd) || (p->block != block))
{
p->avl.cache = -1;
q = p->avl.left;
@@ -545,7 +546,7 @@ static int
rtems_bdbuf_avl_remove(rtems_bdbuf_buffer** root,
const rtems_bdbuf_buffer* node)
{
- dev_t dev = node->dev;
+ const rtems_disk_device *dd = node->dd;
rtems_blkdev_bnum block = node->block;
rtems_bdbuf_buffer* p = *root;
@@ -565,12 +566,13 @@ rtems_bdbuf_avl_remove(rtems_bdbuf_buffer** root,
{
*buf_prev++ = p;
- if ((p->dev < dev) || ((p->dev == dev) && (p->block < block)))
+ if (((uintptr_t) p->dd < (uintptr_t) dd)
+ || ((p->dd == dd) && (p->block < block)))
{
p->avl.cache = 1;
p = p->avl.right;
}
- else if ((p->dev != dev) || (p->block != block))
+ else if ((p->dd != dd) || (p->block != block))
{
p->avl.cache = -1;
p = p->avl.left;
@@ -1092,7 +1094,7 @@ rtems_bdbuf_discard_buffer (rtems_bdbuf_buffer *bd)
static void
rtems_bdbuf_add_to_modified_list_after_access (rtems_bdbuf_buffer *bd)
{
- if (bdbuf_cache.sync_active && bdbuf_cache.sync_device == bd->dev)
+ if (bdbuf_cache.sync_active && bdbuf_cache.sync_device == bd->dd)
{
rtems_bdbuf_unlock_cache ();
@@ -1221,10 +1223,10 @@ rtems_bdbuf_group_realloc (rtems_bdbuf_group* group, size_t new_bds_per_group)
static void
rtems_bdbuf_setup_empty_buffer (rtems_bdbuf_buffer *bd,
- dev_t dev,
+ const rtems_disk_device *dd,
rtems_blkdev_bnum block)
{
- bd->dev = dev;
+ bd->dd = dd ;
bd->block = block;
bd->avl.left = NULL;
bd->avl.right = NULL;
@@ -1237,7 +1239,7 @@ rtems_bdbuf_setup_empty_buffer (rtems_bdbuf_buffer *bd,
}
static rtems_bdbuf_buffer *
-rtems_bdbuf_get_buffer_from_lru_list (dev_t dev,
+rtems_bdbuf_get_buffer_from_lru_list (const rtems_disk_device *dd,
rtems_blkdev_bnum block,
size_t bds_per_group)
{
@@ -1271,7 +1273,7 @@ rtems_bdbuf_get_buffer_from_lru_list (dev_t dev,
if (empty_bd != NULL)
{
- rtems_bdbuf_setup_empty_buffer (empty_bd, dev, block);
+ rtems_bdbuf_setup_empty_buffer (empty_bd, dd, block);
return empty_bd;
}
@@ -1422,7 +1424,7 @@ rtems_bdbuf_init (void)
b < bdbuf_cache.buffer_min_count;
b++, bd++, buffer += bdbuf_config.buffer_min)
{
- bd->dev = BDBUF_INVALID_DEV;
+ bd->dd = BDBUF_INVALID_DEV;
bd->group = group;
bd->buffer = buffer;
@@ -1668,17 +1670,17 @@ rtems_bdbuf_sync_after_access (rtems_bdbuf_buffer *bd)
}
static rtems_bdbuf_buffer *
-rtems_bdbuf_get_buffer_for_read_ahead (dev_t dev,
+rtems_bdbuf_get_buffer_for_read_ahead (const rtems_disk_device *dd,
rtems_blkdev_bnum block,
size_t bds_per_group)
{
rtems_bdbuf_buffer *bd = NULL;
- bd = rtems_bdbuf_avl_search (&bdbuf_cache.tree, dev, block);
+ bd = rtems_bdbuf_avl_search (&bdbuf_cache.tree, dd, block);
if (bd == NULL)
{
- bd = rtems_bdbuf_get_buffer_from_lru_list (dev, block, bds_per_group);
+ bd = rtems_bdbuf_get_buffer_from_lru_list (dd, block, bds_per_group);
if (bd != NULL)
rtems_bdbuf_group_obtain (bd);
@@ -1694,7 +1696,7 @@ rtems_bdbuf_get_buffer_for_read_ahead (dev_t dev,
}
static rtems_bdbuf_buffer *
-rtems_bdbuf_get_buffer_for_access (dev_t dev,
+rtems_bdbuf_get_buffer_for_access (const rtems_disk_device *dd,
rtems_blkdev_bnum block,
size_t bds_per_group)
{
@@ -1702,7 +1704,7 @@ rtems_bdbuf_get_buffer_for_access (dev_t dev,
do
{
- bd = rtems_bdbuf_avl_search (&bdbuf_cache.tree, dev, block);
+ bd = rtems_bdbuf_avl_search (&bdbuf_cache.tree, dd, block);
if (bd != NULL)
{
@@ -1719,7 +1721,7 @@ rtems_bdbuf_get_buffer_for_access (dev_t dev,
}
else
{
- bd = rtems_bdbuf_get_buffer_from_lru_list (dev, block, bds_per_group);
+ bd = rtems_bdbuf_get_buffer_from_lru_list (dd, block, bds_per_group);
if (bd == NULL)
rtems_bdbuf_wait_for_buffer ();
@@ -1734,26 +1736,14 @@ rtems_bdbuf_get_buffer_for_access (dev_t dev,
}
static rtems_status_code
-rtems_bdbuf_obtain_disk (dev_t dev,
+rtems_bdbuf_obtain_disk (const rtems_disk_device *dd,
rtems_blkdev_bnum block,
- rtems_disk_device **dd_ptr,
rtems_blkdev_bnum *media_block_ptr,
size_t *bds_per_group_ptr)
{
- rtems_disk_device *dd = NULL;
-
if (!bdbuf_cache.initialised)
return RTEMS_NOT_CONFIGURED;
- /*
- * Do not hold the cache lock when obtaining the disk table.
- */
- dd = rtems_disk_obtain (dev);
- if (dd == NULL)
- return RTEMS_INVALID_ID;
-
- *dd_ptr = dd;
-
if (media_block_ptr != NULL)
{
/*
@@ -1766,7 +1756,6 @@ rtems_bdbuf_obtain_disk (dev_t dev,
dd->media_block_size);
if (mb >= dd->size)
{
- rtems_disk_release(dd);
return RTEMS_INVALID_NUMBER;
}
@@ -1779,7 +1768,6 @@ rtems_bdbuf_obtain_disk (dev_t dev,
if (bds_per_group == 0)
{
- rtems_disk_release (dd);
return RTEMS_INVALID_NUMBER;
}
@@ -1789,28 +1777,17 @@ rtems_bdbuf_obtain_disk (dev_t dev,
return RTEMS_SUCCESSFUL;
}
-static void
-rtems_bdbuf_release_disk (rtems_disk_device *dd)
-{
- rtems_status_code sc = RTEMS_SUCCESSFUL;
-
- sc = rtems_disk_release (dd);
- if (sc != RTEMS_SUCCESSFUL)
- rtems_fatal_error_occurred (RTEMS_BLKDEV_FATAL_BDBUF_DISK_REL);
-}
-
rtems_status_code
-rtems_bdbuf_get (dev_t dev,
+rtems_bdbuf_get (const rtems_disk_device *dd,
rtems_blkdev_bnum block,
rtems_bdbuf_buffer **bd_ptr)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
- rtems_disk_device *dd = NULL;
rtems_bdbuf_buffer *bd = NULL;
rtems_blkdev_bnum media_block = 0;
size_t bds_per_group = 0;
- sc = rtems_bdbuf_obtain_disk (dev, block, &dd, &media_block, &bds_per_group);
+ sc = rtems_bdbuf_obtain_disk (dd, block, &media_block, &bds_per_group);
if (sc != RTEMS_SUCCESSFUL)
return sc;
@@ -1821,9 +1798,9 @@ rtems_bdbuf_get (dev_t dev,
*/
if (rtems_bdbuf_tracer)
printf ("bdbuf:get: %" PRIu32 " (%" PRIu32 ") (dev = %08x)\n",
- media_block, block, (unsigned) dev);
+ media_block, block, (unsigned) dd->dev);
- bd = rtems_bdbuf_get_buffer_for_access (dev, media_block, bds_per_group);
+ bd = rtems_bdbuf_get_buffer_for_access (dd, media_block, bds_per_group);
switch (bd->state)
{
@@ -1856,8 +1833,6 @@ rtems_bdbuf_get (dev_t dev,
rtems_bdbuf_unlock_cache ();
- rtems_bdbuf_release_disk (dd);
-
*bd_ptr = bd;
return RTEMS_SUCCESSFUL;
@@ -1892,7 +1867,6 @@ rtems_bdbuf_create_read_request (const rtems_disk_device *dd,
rtems_bdbuf_buffer *bd = NULL;
rtems_blkdev_bnum media_block_end = dd->start + dd->size;
rtems_blkdev_bnum media_block_count = dd->block_size / dd->media_block_size;
- dev_t dev = dd->dev;
uint32_t block_size = dd->block_size;
uint32_t transfer_index = 1;
uint32_t transfer_count = bdbuf_config.max_read_ahead_blocks + 1;
@@ -1907,7 +1881,7 @@ rtems_bdbuf_create_read_request (const rtems_disk_device *dd,
req->status = RTEMS_RESOURCE_IN_USE;
req->bufnum = 0;
- bd = rtems_bdbuf_get_buffer_for_access (dev, media_block, bds_per_group);
+ bd = rtems_bdbuf_get_buffer_for_access (dd, media_block, bds_per_group);
*bd_ptr = bd;
@@ -1936,7 +1910,7 @@ rtems_bdbuf_create_read_request (const rtems_disk_device *dd,
{
media_block += media_block_count;
- bd = rtems_bdbuf_get_buffer_for_read_ahead (dev, media_block,
+ bd = rtems_bdbuf_get_buffer_for_read_ahead (dd, media_block,
bds_per_group);
if (bd == NULL)
@@ -2021,18 +1995,17 @@ rtems_bdbuf_execute_transfer_request (const rtems_disk_device *dd,
}
rtems_status_code
-rtems_bdbuf_read (dev_t dev,
+rtems_bdbuf_read (const rtems_disk_device *dd,
rtems_blkdev_bnum block,
rtems_bdbuf_buffer **bd_ptr)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
- rtems_disk_device *dd = NULL;
rtems_blkdev_request *req = NULL;
rtems_bdbuf_buffer *bd = NULL;
rtems_blkdev_bnum media_block = 0;
size_t bds_per_group = 0;
- sc = rtems_bdbuf_obtain_disk (dev, block, &dd, &media_block, &bds_per_group);
+ sc = rtems_bdbuf_obtain_disk (dd, block, &media_block, &bds_per_group);
if (sc != RTEMS_SUCCESSFUL)
return sc;
@@ -2047,7 +2020,7 @@ rtems_bdbuf_read (dev_t dev,
if (rtems_bdbuf_tracer)
printf ("bdbuf:read: %" PRIu32 " (%" PRIu32 ") (dev = %08x)\n",
- media_block + dd->start, block, (unsigned) dev);
+ media_block + dd->start, block, (unsigned) dd->dev);
rtems_bdbuf_lock_cache ();
rtems_bdbuf_create_read_request (dd, media_block, bds_per_group, req, &bd);
@@ -2089,7 +2062,6 @@ rtems_bdbuf_read (dev_t dev,
*bd_ptr = NULL;
rtems_bdbuf_unlock_cache ();
- rtems_bdbuf_release_disk (dd);
return sc;
}
@@ -2210,15 +2182,14 @@ rtems_bdbuf_sync (rtems_bdbuf_buffer *bd)
}
rtems_status_code
-rtems_bdbuf_syncdev (dev_t dev)
+rtems_bdbuf_syncdev (const rtems_disk_device *dd)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
- rtems_disk_device *dd = NULL;
if (rtems_bdbuf_tracer)
- printf ("bdbuf:syncdev: %08x\n", (unsigned) dev);
+ printf ("bdbuf:syncdev: %08x\n", (unsigned) dd->dev);
- sc = rtems_bdbuf_obtain_disk (dev, 0, &dd, NULL, NULL);
+ sc = rtems_bdbuf_obtain_disk (dd, 0, NULL, NULL);
if (sc != RTEMS_SUCCESSFUL)
return sc;
@@ -2240,23 +2211,16 @@ rtems_bdbuf_syncdev (dev_t dev)
*/
bdbuf_cache.sync_active = true;
bdbuf_cache.sync_requester = rtems_task_self ();
- bdbuf_cache.sync_device = dev;
+ bdbuf_cache.sync_device = dd;
rtems_bdbuf_wake_swapper ();
rtems_bdbuf_unlock_cache ();
rtems_bdbuf_wait_for_event (RTEMS_BDBUF_TRANSFER_SYNC);
rtems_bdbuf_unlock_sync ();
- rtems_bdbuf_release_disk (dd);
return RTEMS_SUCCESSFUL;
}
-static int
-rtems_bdbuf_null_disk_ioctl (rtems_disk_device *dd, uint32_t req, void *arg)
-{
- return -1;
-}
-
/**
* Swapout transfer to the driver. The driver will break this I/O into groups
* of consecutive write requests is multiple consecutive buffers are required
@@ -2268,14 +2232,9 @@ static void
rtems_bdbuf_swapout_write (rtems_bdbuf_swapout_transfer* transfer)
{
rtems_chain_node *node;
- static rtems_disk_device null_disk = {
- .phys_dev = &null_disk,
- .capabilities = 0,
- .ioctl = rtems_bdbuf_null_disk_ioctl
- };
if (rtems_bdbuf_tracer)
- printf ("bdbuf:swapout transfer: %08x\n", (unsigned) transfer->dev);
+ printf ("bdbuf:swapout transfer: %08x\n", (unsigned) transfer->dd->dev);
/*
* If there are buffers to transfer to the media transfer them.
@@ -2294,14 +2253,7 @@ rtems_bdbuf_swapout_write (rtems_bdbuf_swapout_transfer* transfer)
*/
uint32_t bufs_per_bd = 0;
- /*
- * Obtain the disk device. The cache's mutex has been released to avoid a
- * dead lock.
- */
- rtems_disk_device *dd = rtems_disk_obtain (transfer->dev);
-
- if (dd == NULL)
- dd = &null_disk;
+ const rtems_disk_device *dd = transfer->dd;
bufs_per_bd = dd->block_size / bdbuf_config.buffer_min;
@@ -2372,20 +2324,15 @@ rtems_bdbuf_swapout_write (rtems_bdbuf_swapout_transfer* transfer)
}
}
- if (dd != &null_disk)
+ /*
+ * If sync'ing and the deivce is capability of handling a sync IO control
+ * call perform the call.
+ */
+ if (transfer->syncing &&
+ (dd->phys_dev->capabilities & RTEMS_BLKDEV_CAP_SYNC))
{
- /*
- * If sync'ing and the deivce is capability of handling a sync IO control
- * call perform the call.
- */
- if (transfer->syncing &&
- (dd->phys_dev->capabilities & RTEMS_BLKDEV_CAP_SYNC))
- {
- /* int result = */ dd->ioctl (dd->phys_dev, RTEMS_BLKDEV_REQ_SYNC, NULL);
- /* How should the error be handled ? */
- }
-
- rtems_disk_release (dd);
+ /* int result = */ dd->ioctl (dd->phys_dev, RTEMS_BLKDEV_REQ_SYNC, NULL);
+ /* How should the error be handled ? */
}
}
}
@@ -2394,8 +2341,9 @@ rtems_bdbuf_swapout_write (rtems_bdbuf_swapout_transfer* transfer)
* Process the modified list of buffers. There is a sync or modified list that
* needs to be handled so we have a common function to do the work.
*
- * @param dev The device to handle. If BDBUF_INVALID_DEV no device is selected
- * so select the device of the first buffer to be written to disk.
+ * @param dd_ptr Pointer to the device to handle. If BDBUF_INVALID_DEV no
+ * device is selected so select the device of the first buffer to be written to
+ * disk.
* @param chain The modified chain to process.
* @param transfer The chain to append buffers to be written too.
* @param sync_active If true this is a sync operation so expire all timers.
@@ -2404,7 +2352,7 @@ rtems_bdbuf_swapout_write (rtems_bdbuf_swapout_transfer* transfer)
* amount.
*/
static void
-rtems_bdbuf_swapout_modified_processing (dev_t* dev,
+rtems_bdbuf_swapout_modified_processing (const rtems_disk_device **dd_ptr,
rtems_chain_control* chain,
rtems_chain_control* transfer,
bool sync_active,
@@ -2421,7 +2369,7 @@ rtems_bdbuf_swapout_modified_processing (dev_t* dev,
/*
* A sync active with no valid dev means sync all.
*/
- if (sync_active && (*dev == BDBUF_INVALID_DEV))
+ if (sync_active && (*dd_ptr == BDBUF_INVALID_DEV))
sync_all = true;
else
sync_all = false;
@@ -2437,7 +2385,7 @@ rtems_bdbuf_swapout_modified_processing (dev_t* dev,
* @note Lots of sync requests will skew this timer. It should be based
* on TOD to be accurate. Does it matter ?
*/
- if (sync_all || (sync_active && (*dev == bd->dev))
+ if (sync_all || (sync_active && (*dd_ptr == bd->dd))
|| rtems_bdbuf_has_buffer_waiters ())
bd->hold_timer = 0;
@@ -2459,14 +2407,14 @@ rtems_bdbuf_swapout_modified_processing (dev_t* dev,
}
/*
- * This assumes we can set dev_t to BDBUF_INVALID_DEV which is just an
+ * This assumes we can set it to BDBUF_INVALID_DEV which is just an
* assumption. Cannot use the transfer list being empty the sync dev
* calls sets the dev to use.
*/
- if (*dev == BDBUF_INVALID_DEV)
- *dev = bd->dev;
+ if (*dd_ptr == BDBUF_INVALID_DEV)
+ *dd_ptr = bd->dd;
- if (bd->dev == *dev)
+ if (bd->dd == *dd_ptr)
{
rtems_chain_node* next_node = node->next;
rtems_chain_node* tnode = rtems_chain_tail (transfer);
@@ -2556,7 +2504,7 @@ rtems_bdbuf_swapout_processing (unsigned long timer_delta,
}
rtems_chain_initialize_empty (&transfer->bds);
- transfer->dev = BDBUF_INVALID_DEV;
+ transfer->dd = BDBUF_INVALID_DEV;
transfer->syncing = bdbuf_cache.sync_active;
/*
@@ -2565,13 +2513,13 @@ rtems_bdbuf_swapout_processing (unsigned long timer_delta,
* list. This means the dev is BDBUF_INVALID_DEV.
*/
if (bdbuf_cache.sync_active)
- transfer->dev = bdbuf_cache.sync_device;
+ transfer->dd = bdbuf_cache.sync_device;
/*
* If we have any buffers in the sync queue move them to the modified
* list. The first sync buffer will select the device we use.
*/
- rtems_bdbuf_swapout_modified_processing (&transfer->dev,
+ rtems_bdbuf_swapout_modified_processing (&transfer->dd,
&bdbuf_cache.sync,
&transfer->bds,
true, false,
@@ -2580,7 +2528,7 @@ rtems_bdbuf_swapout_processing (unsigned long timer_delta,
/*
* Process the cache's modified list.
*/
- rtems_bdbuf_swapout_modified_processing (&transfer->dev,
+ rtems_bdbuf_swapout_modified_processing (&transfer->dd,
&bdbuf_cache.modified,
&transfer->bds,
bdbuf_cache.sync_active,
@@ -2678,7 +2626,7 @@ rtems_bdbuf_swapout_worker_task (rtems_task_argument arg)
rtems_bdbuf_lock_cache ();
rtems_chain_initialize_empty (&worker->transfer.bds);
- worker->transfer.dev = BDBUF_INVALID_DEV;
+ worker->transfer.dd = BDBUF_INVALID_DEV;
rtems_chain_append (&bdbuf_cache.swapout_workers, &worker->link);
@@ -2715,7 +2663,7 @@ rtems_bdbuf_swapout_workers_open (void)
worker->transfer.write_req = rtems_bdbuf_swapout_writereq_alloc ();
rtems_chain_initialize_empty (&worker->transfer.bds);
- worker->transfer.dev = BDBUF_INVALID_DEV;
+ worker->transfer.dd = BDBUF_INVALID_DEV;
sc = rtems_task_create (rtems_build_name('B', 'D', 'o', 'a' + w),
(bdbuf_config.swapout_priority ?
@@ -2777,7 +2725,7 @@ rtems_bdbuf_swapout_task (rtems_task_argument arg)
transfer.write_req = rtems_bdbuf_swapout_writereq_alloc ();
rtems_chain_initialize_empty (&transfer.bds);
- transfer.dev = BDBUF_INVALID_DEV;
+ transfer.dd = BDBUF_INVALID_DEV;
transfer.syncing = false;
/*
@@ -2871,12 +2819,9 @@ rtems_bdbuf_purge_list (rtems_chain_control *purge_list)
rtems_bdbuf_wake (&bdbuf_cache.buffer_waiters);
}
-typedef bool (*rtems_bdbuf_purge_compare)(dev_t a, dev_t b);
-
static void
rtems_bdbuf_gather_for_purge (rtems_chain_control *purge_list,
- rtems_bdbuf_purge_compare compare,
- dev_t dev)
+ const rtems_disk_device *dd)
{
rtems_bdbuf_buffer *stack [RTEMS_BDBUF_AVL_MAX_HEIGHT];
rtems_bdbuf_buffer **prev = stack;
@@ -2886,7 +2831,7 @@ rtems_bdbuf_gather_for_purge (rtems_chain_control *purge_list,
while (cur != NULL)
{
- if ((*compare) (cur->dev, dev))
+ if (cur->dd == dd)
{
switch (cur->state)
{
@@ -2950,40 +2895,14 @@ rtems_bdbuf_gather_for_purge (rtems_chain_control *purge_list,
}
}
-static void
-rtems_bdbuf_purge (rtems_bdbuf_purge_compare compare, dev_t dev)
+void
+rtems_bdbuf_purge_dev (const rtems_disk_device *dd)
{
rtems_chain_control purge_list;
rtems_chain_initialize_empty (&purge_list);
rtems_bdbuf_lock_cache ();
- rtems_bdbuf_gather_for_purge (&purge_list, compare, dev);
+ rtems_bdbuf_gather_for_purge (&purge_list, dd);
rtems_bdbuf_purge_list (&purge_list);
rtems_bdbuf_unlock_cache ();
}
-
-static bool
-rtems_bdbuf_purge_compare_dev (dev_t a, dev_t b)
-{
- return a == b;
-}
-
-void
-rtems_bdbuf_purge_dev (dev_t dev)
-{
- rtems_bdbuf_purge (rtems_bdbuf_purge_compare_dev, dev);
-}
-
-static bool
-rtems_bdbuf_purge_compare_major (dev_t a, dev_t b)
-{
- return rtems_filesystem_dev_major_t (a) == rtems_filesystem_dev_major_t (b);
-}
-
-void
-rtems_bdbuf_purge_major (rtems_device_major_number major)
-{
- dev_t dev = rtems_filesystem_make_dev_t (major, 0);
-
- rtems_bdbuf_purge (rtems_bdbuf_purge_compare_major, dev);
-}
diff --git a/cpukit/libblock/src/bdpart-create.c b/cpukit/libblock/src/bdpart-create.c
index dc93522c19..209f78ff31 100644
--- a/cpukit/libblock/src/bdpart-create.c
+++ b/cpukit/libblock/src/bdpart-create.c
@@ -45,7 +45,6 @@ rtems_status_code rtems_bdpart_create(
dos_compatibility ? RTEMS_BDPART_MBR_CYLINDER_SIZE : 1;
rtems_blkdev_bnum overhead = 0;
rtems_blkdev_bnum free_space = 0;
- dev_t disk = 0;
size_t i = 0;
/* Check if we have something to do */
@@ -60,7 +59,7 @@ rtems_status_code rtems_bdpart_create(
}
/* Get disk data */
- sc = rtems_bdpart_get_disk_data( disk_name, &disk, &disk_end);
+ sc = rtems_bdpart_get_disk_data( disk_name, NULL, NULL, &disk_end);
if (sc != RTEMS_SUCCESSFUL) {
return sc;
}
@@ -142,15 +141,15 @@ rtems_status_code rtems_bdpart_create(
/* Align partition upwards */
s += record_space - (s % record_space);
+ /* Reserve space for the EBR if necessary */
+ if (count > 4 && i > 2) {
+ pos += record_space;
+ }
+
/* Partition begin and end */
p->begin = pos;
pos += s;
p->end = pos;
-
- /* Reserve space for the EBR if necessary */
- if (count > 4 && i > 2) {
- p->begin += record_space;
- }
}
/* Expand the last partition to the disk end */
diff --git a/cpukit/libblock/src/bdpart-read.c b/cpukit/libblock/src/bdpart-read.c
index 3560dbd3a3..4604e1080b 100644
--- a/cpukit/libblock/src/bdpart-read.c
+++ b/cpukit/libblock/src/bdpart-read.c
@@ -23,6 +23,9 @@
#include "config.h"
#endif
+#include <sys/stat.h>
+#include <fcntl.h>
+
#include <rtems.h>
#include <rtems/bdbuf.h>
#include <rtems/bdpart.h>
@@ -64,48 +67,59 @@ bool rtems_bdpart_to_mbr_partition_type(
*/
rtems_status_code rtems_bdpart_get_disk_data(
const char *disk_name,
- dev_t *disk,
+ int *fd_ptr,
+ const rtems_disk_device **dd_ptr,
rtems_blkdev_bnum *disk_end
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
int rv = 0;
+ int fd = -1;
+ const rtems_disk_device *dd = NULL;
rtems_blkdev_bnum disk_begin = 0;
rtems_blkdev_bnum block_size = 0;
- rtems_disk_device *dd = NULL;
- struct stat st;
+
+ /* Open device file */
+ fd = open( disk_name, O_RDWR);
+ if (fd < 0) {
+ sc = RTEMS_INVALID_NAME;
+ goto error;
+ }
/* Get disk handle */
- rv = stat( disk_name, &st);
+ rv = rtems_disk_fd_get_disk_device( fd, &dd);
if (rv != 0) {
- return RTEMS_INVALID_NAME;
+ sc = RTEMS_INVALID_NAME;
+ goto error;
}
- *disk = st.st_rdev;
/* Get disk begin, end and block size */
- dd = rtems_disk_obtain( *disk);
- if (dd == NULL) {
- return RTEMS_INVALID_NAME;
- }
disk_begin = dd->start;
*disk_end = dd->size;
block_size = dd->block_size;
- sc = rtems_disk_release( dd);
- if (sc != RTEMS_SUCCESSFUL) {
- return sc;
- }
/* Check block size */
if (block_size < RTEMS_BDPART_BLOCK_SIZE) {
- return RTEMS_IO_ERROR;
+ sc = RTEMS_IO_ERROR;
+ goto error;
}
/* Check that we have do not have a logical disk */
if (disk_begin != 0) {
- return RTEMS_IO_ERROR;
+ sc = RTEMS_IO_ERROR;
+ goto error;
}
- return RTEMS_SUCCESSFUL;
+error:
+
+ if (sc == RTEMS_SUCCESSFUL && fd_ptr != NULL && dd_ptr != NULL) {
+ *fd_ptr = fd;
+ *dd_ptr = dd;
+ } else {
+ close( fd);
+ }
+
+ return sc;
}
static bool rtems_bdpart_is_valid_record( const uint8_t *data)
@@ -171,7 +185,7 @@ static rtems_status_code rtems_bdpart_read_mbr_partition(
}
static rtems_status_code rtems_bdpart_read_record(
- dev_t disk,
+ const rtems_disk_device *dd,
rtems_blkdev_bnum index,
rtems_bdbuf_buffer **block
)
@@ -187,7 +201,7 @@ static rtems_status_code rtems_bdpart_read_record(
}
/* Read the record block */
- sc = rtems_bdbuf_read( disk, index, block);
+ sc = rtems_bdbuf_read( dd, index, block);
if (sc != RTEMS_SUCCESSFUL) {
return sc;
}
@@ -220,9 +234,10 @@ rtems_status_code rtems_bdpart_read(
rtems_blkdev_bnum ep_begin = 0; /* Extended partition begin */
rtems_blkdev_bnum ebr = 0; /* Extended boot record block index */
rtems_blkdev_bnum disk_end = 0;
- dev_t disk = 0;
size_t i = 0;
const uint8_t *data = NULL;
+ int fd = -1;
+ const rtems_disk_device *dd = NULL;
/* Check parameter */
if (format == NULL || pt == NULL || count == NULL) {
@@ -233,13 +248,13 @@ rtems_status_code rtems_bdpart_read(
*count = 0;
/* Get disk data */
- sc = rtems_bdpart_get_disk_data( disk_name, &disk, &disk_end);
+ sc = rtems_bdpart_get_disk_data( disk_name, &fd, &dd, &disk_end);
if (sc != RTEMS_SUCCESSFUL) {
return sc;
}
/* Read MBR */
- sc = rtems_bdpart_read_record( disk, 0, &block);
+ sc = rtems_bdpart_read_record( dd, 0, &block);
if (sc != RTEMS_SUCCESSFUL) {
esc = sc;
goto cleanup;
@@ -283,7 +298,7 @@ rtems_status_code rtems_bdpart_read(
rtems_blkdev_bnum tmp = 0;
/* Read EBR */
- sc = rtems_bdpart_read_record( disk, ebr, &block);
+ sc = rtems_bdpart_read_record( dd, ebr, &block);
if (sc != RTEMS_SUCCESSFUL) {
esc = sc;
goto cleanup;
@@ -340,6 +355,10 @@ rtems_status_code rtems_bdpart_read(
cleanup:
+ if (fd >= 0) {
+ close( fd);
+ }
+
if (block != NULL) {
rtems_bdbuf_release( block);
}
diff --git a/cpukit/libblock/src/bdpart-register.c b/cpukit/libblock/src/bdpart-register.c
index 172c8b4964..d937e65e6c 100644
--- a/cpukit/libblock/src/bdpart-register.c
+++ b/cpukit/libblock/src/bdpart-register.c
@@ -47,12 +47,16 @@ rtems_status_code rtems_bdpart_register(
char *logical_disk_marker = NULL;
size_t disk_name_size = strlen( disk_name);
size_t i = 0;
+ int fd = -1;
+ const rtems_disk_device *dd = NULL;
/* Get disk data */
- sc = rtems_bdpart_get_disk_data( disk_name, &disk, &disk_end);
+ sc = rtems_bdpart_get_disk_data( disk_name, &fd, &dd, &disk_end);
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);
@@ -134,12 +138,16 @@ rtems_status_code rtems_bdpart_unregister(
dev_t disk = 0;
dev_t logical_disk = 0;
size_t i = 0;
+ int fd = -1;
+ const rtems_disk_device *dd = NULL;
/* Get disk data */
- sc = rtems_bdpart_get_disk_data( disk_name, &disk, &disk_end);
+ sc = rtems_bdpart_get_disk_data( disk_name, &fd, &dd, &disk_end);
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);
diff --git a/cpukit/libblock/src/bdpart-write.c b/cpukit/libblock/src/bdpart-write.c
index 92e80a24ec..9cccda5e5b 100644
--- a/cpukit/libblock/src/bdpart-write.c
+++ b/cpukit/libblock/src/bdpart-write.c
@@ -45,7 +45,7 @@ static void rtems_bdpart_write_mbr_partition(
}
static rtems_status_code rtems_bdpart_new_record(
- dev_t disk,
+ const rtems_disk_device *dd,
rtems_blkdev_bnum index,
rtems_bdbuf_buffer **block
)
@@ -61,7 +61,7 @@ static rtems_status_code rtems_bdpart_new_record(
}
/* Read the new record block (this accounts for disk block sizes > 512) */
- sc = rtems_bdbuf_read( disk, index, block);
+ sc = rtems_bdbuf_read( dd, index, block);
if (sc != RTEMS_SUCCESSFUL) {
return sc;
}
@@ -99,10 +99,11 @@ rtems_status_code rtems_bdpart_write(
rtems_blkdev_bnum disk_end = 0;
rtems_blkdev_bnum record_space =
dos_compatibility ? RTEMS_BDPART_MBR_CYLINDER_SIZE : 1;
- dev_t disk = 0;
size_t ppc = 0; /* Primary partition count */
size_t i = 0;
uint8_t *data = NULL;
+ int fd = -1;
+ const rtems_disk_device *dd = NULL;
/* Check if we have something to do */
if (count == 0) {
@@ -116,7 +117,7 @@ rtems_status_code rtems_bdpart_write(
}
/* Get disk data */
- sc = rtems_bdpart_get_disk_data( disk_name, &disk, &disk_end);
+ sc = rtems_bdpart_get_disk_data( disk_name, &fd, &dd, &disk_end);
if (sc != RTEMS_SUCCESSFUL) {
return sc;
}
@@ -211,7 +212,7 @@ rtems_status_code rtems_bdpart_write(
}
/* New MBR */
- sc = rtems_bdpart_new_record( disk, 0, &block);
+ sc = rtems_bdpart_new_record( dd, 0, &block);
if (sc != RTEMS_SUCCESSFUL) {
esc = sc;
goto cleanup;
@@ -275,7 +276,7 @@ rtems_status_code rtems_bdpart_write(
/* New EBR */
ebr = p->begin - record_space;
- sc = rtems_bdpart_new_record( disk, ebr, &block);
+ sc = rtems_bdpart_new_record( dd, ebr, &block);
if (sc != RTEMS_SUCCESSFUL) {
esc = sc;
goto cleanup;
@@ -294,6 +295,10 @@ rtems_status_code rtems_bdpart_write(
cleanup:
+ if (fd >= 0) {
+ close( fd);
+ }
+
if (block != NULL) {
rtems_bdbuf_sync( block);
}
diff --git a/cpukit/libblock/src/blkdev.c b/cpukit/libblock/src/blkdev.c
index c986e69889..3e950d6a72 100644
--- a/cpukit/libblock/src/blkdev.c
+++ b/cpukit/libblock/src/blkdev.c
@@ -46,7 +46,6 @@ rtems_blkdev_generic_read(
uint32_t count = args->count;
rtems_blkdev_bnum block = (rtems_blkdev_bnum) (args->offset / block_size);
uint32_t blkofs = (uint32_t) (args->offset % block_size);
- dev_t dev = dd->dev;
args->bytes_moved = 0;
@@ -55,7 +54,7 @@ rtems_blkdev_generic_read(
rtems_bdbuf_buffer *diskbuf;
uint32_t copy;
- rc = rtems_bdbuf_read(dev, block, &diskbuf);
+ rc = rtems_bdbuf_read(dd, block, &diskbuf);
if (rc != RTEMS_SUCCESSFUL)
break;
copy = block_size - blkofs;
@@ -94,7 +93,6 @@ rtems_blkdev_generic_write(
uint32_t count = args->count;
rtems_blkdev_bnum block = (rtems_blkdev_bnum) (args->offset / block_size);
uint32_t blkofs = (uint32_t) (args->offset % block_size);
- dev_t dev = dd->dev;
args->bytes_moved = 0;
@@ -104,9 +102,9 @@ rtems_blkdev_generic_write(
uint32_t copy;
if ((blkofs == 0) && (count >= block_size))
- rc = rtems_bdbuf_get(dev, block, &diskbuf);
+ rc = rtems_bdbuf_get(dd, block, &diskbuf);
else
- rc = rtems_bdbuf_read(dev, block, &diskbuf);
+ rc = rtems_bdbuf_read(dd, block, &diskbuf);
if (rc != RTEMS_SUCCESSFUL)
break;
@@ -207,7 +205,7 @@ rtems_blkdev_generic_ioctl(
break;
case RTEMS_BLKIO_SYNCDEV:
- rc = rtems_bdbuf_syncdev(dd->dev);
+ rc = rtems_bdbuf_syncdev(dd);
args->ioctl_return = (uint32_t) (rc == RTEMS_SUCCESSFUL ? 0 : -1);
break;
diff --git a/cpukit/libblock/src/media.c b/cpukit/libblock/src/media.c
index b4ddd6ad7c..989f80ded2 100644
--- a/cpukit/libblock/src/media.c
+++ b/cpukit/libblock/src/media.c
@@ -812,15 +812,19 @@ static rtems_status_code disk_detach_worker(
if (state == RTEMS_MEDIA_STATE_READY) {
dev_t dev = 0;
+ rtems_disk_device *dd = NULL;
sc = rtems_media_get_device_identifier(src, &dev);
if (sc != RTEMS_SUCCESSFUL) {
return RTEMS_IO_ERROR;
}
- sc = rtems_bdbuf_syncdev(dev);
- if (sc != RTEMS_SUCCESSFUL) {
- rsc = RTEMS_IO_ERROR;
+ dd = rtems_disk_obtain(dev);
+ if (dd != NULL) {
+ sc = rtems_bdbuf_syncdev(dd);
+ if (sc != RTEMS_SUCCESSFUL) {
+ rsc = RTEMS_IO_ERROR;
+ }
}
sc = rtems_disk_delete(dev);
@@ -828,7 +832,10 @@ static rtems_status_code disk_detach_worker(
rsc = RTEMS_IO_ERROR;
}
- rtems_bdbuf_purge_dev(dev);
+ if (dd != NULL) {
+ rtems_bdbuf_purge_dev(dd);
+ rtems_disk_release(dd);
+ }
if (rtems_filesystem_dev_minor_t(dev) == 0) {
sc = rtems_io_unregister_driver(rtems_filesystem_dev_major_t(dev));
diff --git a/cpukit/libfs/src/dosfs/fat.c b/cpukit/libfs/src/dosfs/fat.c
index ba9ae23e86..39a7bacb24 100644
--- a/cpukit/libfs/src/dosfs/fat.c
+++ b/cpukit/libfs/src/dosfs/fat.c
@@ -37,9 +37,9 @@ fat_buf_access(fat_fs_info_t *fs_info, uint32_t blk, int op_type,
if (fs_info->c.state == FAT_CACHE_EMPTY)
{
if (op_type == FAT_OP_TYPE_READ)
- sc = rtems_bdbuf_read(fs_info->vol.dev, blk, &fs_info->c.buf);
+ sc = rtems_bdbuf_read(fs_info->vol.dd, blk, &fs_info->c.buf);
else
- sc = rtems_bdbuf_get(fs_info->vol.dev, blk, &fs_info->c.buf);
+ sc = rtems_bdbuf_get(fs_info->vol.dd, blk, &fs_info->c.buf);
if (sc != RTEMS_SUCCESSFUL)
rtems_set_errno_and_return_minus_one(EIO);
fs_info->c.blk_num = blk;
@@ -70,7 +70,7 @@ fat_buf_access(fat_fs_info_t *fs_info, uint32_t blk, int op_type,
for (i = 1; i < fs_info->vol.fats; i++)
{
- sc = rtems_bdbuf_get(fs_info->vol.dev,
+ sc = rtems_bdbuf_get(fs_info->vol.dd,
fs_info->c.blk_num +
fs_info->vol.fat_length * i,
&b);
@@ -92,9 +92,9 @@ fat_buf_access(fat_fs_info_t *fs_info, uint32_t blk, int op_type,
}
if (op_type == FAT_OP_TYPE_READ)
- sc = rtems_bdbuf_read(fs_info->vol.dev, blk, &fs_info->c.buf);
+ sc = rtems_bdbuf_read(fs_info->vol.dd, blk, &fs_info->c.buf);
else
- sc = rtems_bdbuf_get(fs_info->vol.dev, blk, &fs_info->c.buf);
+ sc = rtems_bdbuf_get(fs_info->vol.dd, blk, &fs_info->c.buf);
if (sc != RTEMS_SUCCESSFUL)
rtems_set_errno_and_return_minus_one(EIO);
fs_info->c.blk_num = blk;
@@ -133,7 +133,7 @@ fat_buf_release(fat_fs_info_t *fs_info)
for (i = 1; i < fs_info->vol.fats; i++)
{
- sc = rtems_bdbuf_get(fs_info->vol.dev,
+ sc = rtems_bdbuf_get(fs_info->vol.dd,
fs_info->c.blk_num +
fs_info->vol.fat_length * i,
&b);
@@ -362,27 +362,39 @@ fat_init_volume_info(rtems_filesystem_mount_table_entry_t *mt_entry)
int i = 0;
rtems_bdbuf_buffer *block = NULL;
- rc = stat(mt_entry->dev, &stat_buf);
- if (rc == -1)
- return rc;
+ vol->fd = open(mt_entry->dev, O_RDWR);
+ if (vol->fd < 0)
+ {
+ rtems_set_errno_and_return_minus_one(ENXIO);
+ }
+
+ rc = fstat(vol->fd, &stat_buf);
+ if (rc != 0)
+ {
+ close(vol->fd);
+ rtems_set_errno_and_return_minus_one(ENXIO);
+ }
/* Must be a block device. */
if (!S_ISBLK(stat_buf.st_mode))
- rtems_set_errno_and_return_minus_one(ENOTTY);
+ {
+ close(vol->fd);
+ rtems_set_errno_and_return_minus_one(ENXIO);
+ }
/* check that device is registred as block device and lock it */
- vol->dd = rtems_disk_obtain(stat_buf.st_rdev);
- if (vol->dd == NULL)
- rtems_set_errno_and_return_minus_one(EIO);
-
- vol->dev = stat_buf.st_rdev;
+ rc = rtems_disk_fd_get_disk_device(vol->fd, &vol->dd);
+ if (rc != 0) {
+ close(vol->fd);
+ rtems_set_errno_and_return_minus_one(ENXIO);
+ }
/* Read boot record */
/* FIXME: Asserts FAT_MAX_BPB_SIZE < bdbuf block size */
- sc = rtems_bdbuf_read( vol->dev, 0, &block);
+ sc = rtems_bdbuf_read( vol->dd, 0, &block);
if (sc != RTEMS_SUCCESSFUL)
{
- rtems_disk_release(vol->dd);
+ close(vol->fd);
rtems_set_errno_and_return_minus_one( EIO);
}
@@ -391,7 +403,7 @@ fat_init_volume_info(rtems_filesystem_mount_table_entry_t *mt_entry)
sc = rtems_bdbuf_release( block);
if (sc != RTEMS_SUCCESSFUL)
{
- rtems_disk_release(vol->dd);
+ close(vol->fd);
rtems_set_errno_and_return_minus_one( EIO );
}
@@ -403,7 +415,7 @@ fat_init_volume_info(rtems_filesystem_mount_table_entry_t *mt_entry)
(vol->bps != 2048) &&
(vol->bps != 4096))
{
- rtems_disk_release(vol->dd);
+ close(vol->fd);
rtems_set_errno_and_return_minus_one( EINVAL );
}
@@ -419,7 +431,7 @@ fat_init_volume_info(rtems_filesystem_mount_table_entry_t *mt_entry)
*/
if (vol->spc == 0)
{
- rtems_disk_release(vol->dd);
+ close(vol->fd);
rtems_set_errno_and_return_minus_one(EINVAL);
}
@@ -431,7 +443,7 @@ fat_init_volume_info(rtems_filesystem_mount_table_entry_t *mt_entry)
*/
if ((vol->bpc = vol->bps << vol->spc_log2) > MS_BYTES_PER_CLUSTER_LIMIT)
{
- rtems_disk_release(vol->dd);
+ close(vol->fd);
rtems_set_errno_and_return_minus_one(EINVAL);
}
@@ -505,7 +517,7 @@ fat_init_volume_info(rtems_filesystem_mount_table_entry_t *mt_entry)
vol->info_sec = FAT_GET_BR_FAT32_FS_INFO_SECTOR(boot_rec);
if( vol->info_sec == 0 )
{
- rtems_disk_release(vol->dd);
+ close(vol->fd);
rtems_set_errno_and_return_minus_one( EINVAL );
}
else
@@ -514,7 +526,7 @@ fat_init_volume_info(rtems_filesystem_mount_table_entry_t *mt_entry)
FAT_FSI_LEADSIG_SIZE, fs_info_sector);
if ( ret < 0 )
{
- rtems_disk_release(vol->dd);
+ close(vol->fd);
return -1;
}
@@ -522,7 +534,7 @@ fat_init_volume_info(rtems_filesystem_mount_table_entry_t *mt_entry)
FAT_FSINFO_LEAD_SIGNATURE_VALUE)
{
_fat_block_release(mt_entry);
- rtems_disk_release(vol->dd);
+ close(vol->fd);
rtems_set_errno_and_return_minus_one( EINVAL );
}
else
@@ -532,7 +544,7 @@ fat_init_volume_info(rtems_filesystem_mount_table_entry_t *mt_entry)
if ( ret < 0 )
{
_fat_block_release(mt_entry);
- rtems_disk_release(vol->dd);
+ close(vol->fd);
return -1;
}
@@ -543,7 +555,7 @@ fat_init_volume_info(rtems_filesystem_mount_table_entry_t *mt_entry)
if ( rc != RC_OK )
{
_fat_block_release(mt_entry);
- rtems_disk_release(vol->dd);
+ close(vol->fd);
return rc;
}
}
@@ -566,7 +578,7 @@ fat_init_volume_info(rtems_filesystem_mount_table_entry_t *mt_entry)
fs_info->vhash = calloc(FAT_HASH_SIZE, sizeof(rtems_chain_control));
if ( fs_info->vhash == NULL )
{
- rtems_disk_release(vol->dd);
+ close(vol->fd);
rtems_set_errno_and_return_minus_one( ENOMEM );
}
@@ -576,7 +588,7 @@ fat_init_volume_info(rtems_filesystem_mount_table_entry_t *mt_entry)
fs_info->rhash = calloc(FAT_HASH_SIZE, sizeof(rtems_chain_control));
if ( fs_info->rhash == NULL )
{
- rtems_disk_release(vol->dd);
+ close(vol->fd);
free(fs_info->vhash);
rtems_set_errno_and_return_minus_one( ENOMEM );
}
@@ -589,7 +601,7 @@ fat_init_volume_info(rtems_filesystem_mount_table_entry_t *mt_entry)
fs_info->uino = (char *)calloc(fs_info->uino_pool_size, sizeof(char));
if ( fs_info->uino == NULL )
{
- rtems_disk_release(vol->dd);
+ close(vol->fd);
free(fs_info->vhash);
free(fs_info->rhash);
rtems_set_errno_and_return_minus_one( ENOMEM );
@@ -597,7 +609,7 @@ fat_init_volume_info(rtems_filesystem_mount_table_entry_t *mt_entry)
fs_info->sec_buf = (uint8_t *)calloc(vol->bps, sizeof(uint8_t));
if (fs_info->sec_buf == NULL)
{
- rtems_disk_release(vol->dd);
+ close(vol->fd);
free(fs_info->vhash);
free(fs_info->rhash);
free(fs_info->uino);
@@ -634,7 +646,7 @@ fat_shutdown_drive(rtems_filesystem_mount_table_entry_t *mt_entry)
fat_buf_release(fs_info);
- if (rtems_bdbuf_syncdev(fs_info->vol.dev) != RTEMS_SUCCESSFUL)
+ if (rtems_bdbuf_syncdev(fs_info->vol.dd) != RTEMS_SUCCESSFUL)
rc = -1;
for (i = 0; i < FAT_HASH_SIZE; i++)
@@ -660,7 +672,7 @@ fat_shutdown_drive(rtems_filesystem_mount_table_entry_t *mt_entry)
free(fs_info->uino);
free(fs_info->sec_buf);
- rtems_disk_release(fs_info->vol.dd);
+ close(fs_info->vol.fd);
if (rc)
errno = EIO;
diff --git a/cpukit/libfs/src/dosfs/fat.h b/cpukit/libfs/src/dosfs/fat.h
index 8d62662c10..204095cae2 100644
--- a/cpukit/libfs/src/dosfs/fat.h
+++ b/cpukit/libfs/src/dosfs/fat.h
@@ -319,7 +319,7 @@ typedef struct fat_vol_s
uint8_t mirror; /* mirroring enabla/disable */
uint32_t afat_loc; /* active FAT location */
uint8_t afat; /* the number of active FAT */
- dev_t dev; /* device ID */
+ int fd; /* the disk device file descriptor */
rtems_disk_device *dd; /* disk device (see libblock) */
void *private_data; /* reserved */
} fat_vol_t;
diff --git a/cpukit/libfs/src/dosfs/fat_file.c b/cpukit/libfs/src/dosfs/fat_file.c
index 5375e90336..01dabc8f80 100644
--- a/cpukit/libfs/src/dosfs/fat_file.c
+++ b/cpukit/libfs/src/dosfs/fat_file.c
@@ -795,7 +795,7 @@ fat_file_datasync(
for ( i = 0; i < fs_info->vol.spc; i++ )
{
/* ... sync it */
- sc = rtems_bdbuf_read(fs_info->vol.dev, (sec + i), &block);
+ sc = rtems_bdbuf_read(fs_info->vol.dd, (sec + i), &block);
if (sc != RTEMS_SUCCESSFUL)
rtems_set_errno_and_return_minus_one( EIO );
diff --git a/cpukit/libfs/src/dosfs/msdos_dir.c b/cpukit/libfs/src/dosfs/msdos_dir.c
index 725fd254d0..67a0bdaaa9 100644
--- a/cpukit/libfs/src/dosfs/msdos_dir.c
+++ b/cpukit/libfs/src/dosfs/msdos_dir.c
@@ -532,7 +532,7 @@ msdos_dir_stat(
if (sc != RTEMS_SUCCESSFUL)
rtems_set_errno_and_return_minus_one(EIO);
- buf->st_dev = fs_info->fat.vol.dev;
+ buf->st_dev = rtems_disk_get_device_identifier(fs_info->fat.vol.dd);
buf->st_ino = fat_fd->ino;
buf->st_mode = S_IFDIR | S_IRWXU | S_IRWXG | S_IRWXO;
buf->st_rdev = 0ll;
diff --git a/cpukit/libfs/src/dosfs/msdos_file.c b/cpukit/libfs/src/dosfs/msdos_file.c
index b2f98b890d..7cd55b0494 100644
--- a/cpukit/libfs/src/dosfs/msdos_file.c
+++ b/cpukit/libfs/src/dosfs/msdos_file.c
@@ -281,7 +281,7 @@ msdos_file_stat(
if (sc != RTEMS_SUCCESSFUL)
rtems_set_errno_and_return_minus_one(EIO);
- buf->st_dev = fs_info->fat.vol.dev;
+ buf->st_dev = rtems_disk_get_device_identifier(fs_info->fat.vol.dd);
buf->st_ino = fat_fd->ino;
buf->st_mode = S_IFREG | S_IRWXU | S_IRWXG | S_IRWXO;
buf->st_rdev = 0ll;
diff --git a/cpukit/libfs/src/dosfs/msdos_format.c b/cpukit/libfs/src/dosfs/msdos_format.c
index 1394f811c4..2a9d09048f 100644
--- a/cpukit/libfs/src/dosfs/msdos_format.c
+++ b/cpukit/libfs/src/dosfs/msdos_format.c
@@ -370,7 +370,7 @@ static int msdos_format_determine_fmt_params
+---------------------------------------------------------------------------+
| Input Parameters: |
\*-------------------------------------------------------------------------*/
- const rtems_disk_device *dd, /* disk device structure */
+ int fd, /* disk file descriptor */
const msdos_format_request_param_t *rqdata, /* requested fmt parameters */
msdos_format_param_t *fmt_params/* computed fmt parameters */
)
@@ -386,18 +386,24 @@ static int msdos_format_determine_fmt_params
uint64_t total_size = 0;
memset(fmt_params,0,sizeof(*fmt_params));
+
/*
* this one is fixed in this implementation.
* At least one thing we don't have to magically guess...
*/
if (ret_val == 0) {
- fmt_params->bytes_per_sector = dd->block_size;
- fmt_params->totl_sector_cnt = dd->size;
- total_size = dd->block_size * dd->size;
+ ret_val = rtems_disk_fd_get_block_size(fd, &fmt_params->bytes_per_sector);
+ }
+ if (ret_val == 0) {
+ ret_val = rtems_disk_fd_get_block_count(fd, &fmt_params->totl_sector_cnt);
+ }
+ if (ret_val == 0) {
+ total_size = fmt_params->bytes_per_sector * fmt_params->totl_sector_cnt;
msdos_format_printf (rqdata, MSDOS_FMT_INFO_LEVEL_DETAIL,
"bytes per sector: %d\ntotal sectors: %d\ntotal size: %lu\n",
- dd->block_size, dd->size, total_size);
+ fmt_params->bytes_per_sector, fmt_params->totl_sector_cnt, total_size);
}
+
/*
* determine number of FATs
*/
@@ -889,7 +895,6 @@ int msdos_format
{
char tmp_sec[FAT_TOTAL_MBR_SIZE];
int rc;
- rtems_disk_device *dd = NULL;
struct stat stat_buf;
int ret_val = 0;
int fd = -1;
@@ -923,20 +928,11 @@ int msdos_format
ret_val = -1;
}
- /* check that device is registered as block device and lock it */
- if (ret_val == 0) {
- dd = rtems_disk_obtain(stat_buf.st_rdev);
- if (dd == NULL) {
- errno = ENOTTY;
- ret_val = -1;
- }
- }
-
/*
* compute formatting parameters
*/
if (ret_val == 0) {
- ret_val = msdos_format_determine_fmt_params(dd,rqdata,&fmt_params);
+ ret_val = msdos_format_determine_fmt_params(fd,rqdata,&fmt_params);
}
/*
* if requested, write whole disk/partition with 0xe5
@@ -1120,8 +1116,6 @@ int msdos_format
if (fd != -1) {
close(fd);
}
- if (dd != NULL) {
- rtems_disk_release(dd);
- }
+
return ret_val;
}
diff --git a/cpukit/libfs/src/rfs/rtems-rfs-buffer.c b/cpukit/libfs/src/rfs/rtems-rfs-buffer.c
index ea5cbb3fb3..60f9deae32 100644
--- a/cpukit/libfs/src/rfs/rtems-rfs-buffer.c
+++ b/cpukit/libfs/src/rfs/rtems-rfs-buffer.c
@@ -20,8 +20,10 @@
#include "config.h"
#endif
+#include <sys/stat.h>
#include <inttypes.h>
#include <errno.h>
+#include <fcntl.h>
#include <rtems/rfs/rtems-rfs-buffer.h>
#include <rtems/rfs/rtems-rfs-file-system.h>
@@ -285,16 +287,27 @@ int
rtems_rfs_buffer_open (const char* name, rtems_rfs_file_system* fs)
{
struct stat st;
+#if RTEMS_RFS_USE_LIBBLOCK
+ int rv;
+#endif
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_SYNC))
printf ("rtems-rfs: buffer-open: opening: %s\n", name);
- if (stat (name, &st) < 0)
+ fs->device = open (name, O_RDWR);
+ if (fs->device < 0)
+ {
+ if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_OPEN))
+ printf ("rtems-rfs: buffer-open: cannot open file\n");
+ return ENXIO;
+ }
+
+ if (fstat (fs->device, &st) < 0)
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_OPEN))
printf ("rtems-rfs: buffer-open: stat '%s' failed: %s\n",
name, strerror (errno));
- return ENOENT;
+ return ENXIO;
}
#if RTEMS_RFS_USE_LIBBLOCK
@@ -305,26 +318,20 @@ rtems_rfs_buffer_open (const char* name, rtems_rfs_file_system* fs)
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_OPEN))
printf ("rtems-rfs: buffer-open: '%s' is not a block device\n", name);
- return EIO;
+ return ENXIO;
}
/*
* Check that device is registred as a block device and lock it.
*/
- fs->disk = rtems_disk_obtain (st.st_rdev);
- if (!fs->disk)
+ rv = rtems_disk_fd_get_disk_device (fs->device, &fs->disk);
+ if (rv != 0)
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_OPEN))
printf ("rtems-rfs: buffer-open: cannot obtain the disk\n");
- return EIO;
+ return ENXIO;
}
#else
- fs->device = open (name, O_RDWR);
- if (fs->device < 0)
- {
- if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_OPEN))
- printf ("rtems-rfs: buffer-open: cannot open file\n");
- }
fs->media_size = st.st_size;
strcat (fs->name, name);
#endif
@@ -355,9 +362,6 @@ rtems_rfs_buffer_close (rtems_rfs_file_system* fs)
printf ("rtems-rfs: buffer-close: set media block size failed: %d: %s\n",
rc, strerror (rc));
-#if RTEMS_RFS_USE_LIBBLOCK
- rtems_disk_release (fs->disk);
-#else
if (close (fs->device) < 0)
{
rc = errno;
@@ -365,7 +369,6 @@ rtems_rfs_buffer_close (rtems_rfs_file_system* fs)
printf ("rtems-rfs: buffer-close: file close failed: %d: %s\n",
rc, strerror (rc));
}
-#endif
return rc;
}
diff --git a/cpukit/libfs/src/rfs/rtems-rfs-file-system.h b/cpukit/libfs/src/rfs/rtems-rfs-file-system.h
index 0ceade228e..96fdf6c9ab 100644
--- a/cpukit/libfs/src/rfs/rtems-rfs-file-system.h
+++ b/cpukit/libfs/src/rfs/rtems-rfs-file-system.h
@@ -131,6 +131,11 @@ struct _rtems_rfs_file_system
*/
size_t block_size;
+ /**
+ * The file descriptor for device I/O.
+ */
+ int device;
+
#if RTEMS_RFS_USE_LIBBLOCK
/**
* The disk device. This is the data about the block device this file system
@@ -140,11 +145,6 @@ struct _rtems_rfs_file_system
rtems_disk_device* disk;
#else
/**
- * The device number which is a the file handle for device I/O.
- */
- dev_t device;
-
- /**
* The number of blocks in the file system.
*/
size_t size;
@@ -284,7 +284,7 @@ struct _rtems_rfs_file_system
* @param _fs Pointer to the file system.
*/
#if RTEMS_RFS_USE_LIBBLOCK
-#define rtems_rfs_fs_device(_fs) ((_fs)->disk->dev)
+#define rtems_rfs_fs_device(_fs) ((_fs)->disk)
#else
#define rtems_rfs_fs_device(_fs) ((_fs)->device)
#endif
diff --git a/testsuites/libtests/block02/init.c b/testsuites/libtests/block02/init.c
index 00c83a162f..58b78d3e47 100644
--- a/testsuites/libtests/block02/init.c
+++ b/testsuites/libtests/block02/init.c
@@ -7,12 +7,13 @@
*/
/*
- * Copyright (c) 2009
- * 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
@@ -48,9 +49,9 @@
#define BLOCK_COUNT_B 1
-static dev_t dev_a;
+static const rtems_disk_device *dd_a;
-static dev_t dev_b;
+static const rtems_disk_device *dd_b;
static volatile bool sync_done = false;
@@ -67,14 +68,14 @@ static void task_low(rtems_task_argument arg)
printk("L: try access: A0\n");
- sc = rtems_bdbuf_get(dev_a, 0, &bd);
+ sc = rtems_bdbuf_get(dd_a, 0, &bd);
ASSERT_SC(sc);
rtems_test_assert(sync_done);
printk("L: access: A0\n");
- rtems_test_assert(bd->dev == dev_a);
+ rtems_test_assert(bd->dd == dd_a);
printk("*** END OF TEST BLOCK 2 ***\n");
@@ -90,7 +91,7 @@ static void task_high(rtems_task_argument arg)
printk("H: try access: A0\n");
- sc = rtems_bdbuf_get(dev_a, 0, &bd);
+ sc = rtems_bdbuf_get(dd_a, 0, &bd);
ASSERT_SC(sc);
rtems_test_assert(sync_done);
@@ -106,7 +107,7 @@ static void task_high(rtems_task_argument arg)
printk("H: try access: B0\n");
- sc = rtems_bdbuf_get(dev_b, 0, &bd);
+ sc = rtems_bdbuf_get(dd_b, 0, &bd);
ASSERT_SC(sc);
printk("H: access: B0\n");
@@ -127,6 +128,8 @@ static rtems_task Init(rtems_task_argument argument)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_bdbuf_buffer *bd = NULL;
+ dev_t dev_a = 0;
+ dev_t dev_b = 0;
printk("\n\n*** TEST BLOCK 2 ***\n");
@@ -139,6 +142,12 @@ static rtems_task Init(rtems_task_argument argument)
sc = ramdisk_register(BLOCK_SIZE_B, BLOCK_COUNT_B, false, "/dev/rdb", &dev_b);
ASSERT_SC(sc);
+ dd_a = rtems_disk_obtain(dev_a);
+ rtems_test_assert(dd_a != NULL);
+
+ dd_b = rtems_disk_obtain(dev_b);
+ rtems_test_assert(dd_b != NULL);
+
sc = rtems_task_create(
rtems_build_name(' ', 'L', 'O', 'W'),
PRIORITY_LOW,
@@ -165,7 +174,7 @@ static rtems_task Init(rtems_task_argument argument)
sc = rtems_task_start(task_id_high, task_high, 0);
ASSERT_SC(sc);
- sc = rtems_bdbuf_get(dev_a, 0, &bd);
+ sc = rtems_bdbuf_get(dd_a, 0, &bd);
ASSERT_SC(sc);
sc = rtems_bdbuf_sync(bd);
diff --git a/testsuites/libtests/block03/init.c b/testsuites/libtests/block03/init.c
index f101eb78cd..2cfb8060a8 100644
--- a/testsuites/libtests/block03/init.c
+++ b/testsuites/libtests/block03/init.c
@@ -7,12 +7,13 @@
*/
/*
- * Copyright (c) 2009
- * 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
@@ -44,7 +45,7 @@
#define BLOCK_COUNT 2
-static dev_t dev;
+static const rtems_disk_device *dd;
static volatile bool sync_done = false;
@@ -61,7 +62,7 @@ static void task_low(rtems_task_argument arg)
printk("L: try access: 0\n");
- sc = rtems_bdbuf_get(dev, 0, &bd);
+ sc = rtems_bdbuf_get(dd, 0, &bd);
ASSERT_SC(sc);
rtems_test_assert(sync_done);
@@ -84,7 +85,7 @@ static void task_high(rtems_task_argument arg)
printk("H: try access: 0\n");
- sc = rtems_bdbuf_get(dev, 0, &bd);
+ sc = rtems_bdbuf_get(dd, 0, &bd);
ASSERT_SC(sc);
rtems_test_assert(sync_done);
@@ -100,7 +101,7 @@ static void task_high(rtems_task_argument arg)
printk("H: try access: 1\n");
- sc = rtems_bdbuf_get(dev, 1, &bd);
+ sc = rtems_bdbuf_get(dd, 1, &bd);
ASSERT_SC(sc);
printk("H: access: 1\n");
@@ -121,6 +122,7 @@ static rtems_task Init(rtems_task_argument argument)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_bdbuf_buffer *bd = NULL;
+ dev_t dev = 0;
printk("\n\n*** TEST BLOCK 3 ***\n");
@@ -130,6 +132,9 @@ static rtems_task Init(rtems_task_argument argument)
sc = ramdisk_register(BLOCK_SIZE, BLOCK_COUNT, false, "/dev/rda", &dev);
ASSERT_SC(sc);
+ dd = rtems_disk_obtain(dev);
+ rtems_test_assert(dd != NULL);
+
sc = rtems_task_create(
rtems_build_name(' ', 'L', 'O', 'W'),
PRIORITY_LOW,
@@ -156,7 +161,7 @@ static rtems_task Init(rtems_task_argument argument)
sc = rtems_task_start(task_id_high, task_high, 0);
ASSERT_SC(sc);
- sc = rtems_bdbuf_get(dev, 0, &bd);
+ sc = rtems_bdbuf_get(dd, 0, &bd);
ASSERT_SC(sc);
sc = rtems_bdbuf_sync(bd);
diff --git a/testsuites/libtests/block04/init.c b/testsuites/libtests/block04/init.c
index 27b932a63c..ff7b204d2b 100644
--- a/testsuites/libtests/block04/init.c
+++ b/testsuites/libtests/block04/init.c
@@ -7,12 +7,13 @@
*/
/*
- * Copyright (c) 2009
- * 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
@@ -44,7 +45,7 @@
#define BLOCK_COUNT 1
-static dev_t dev;
+static const rtems_disk_device *dd;
static rtems_id task_id_low;
@@ -57,7 +58,7 @@ static void task_low(rtems_task_argument arg)
printk("L: try access: 0\n");
- sc = rtems_bdbuf_get(dev, 0, &bd);
+ sc = rtems_bdbuf_get(dd, 0, &bd);
ASSERT_SC(sc);
printk("L: access: 0\n");
@@ -83,7 +84,7 @@ static void task_high(rtems_task_argument arg)
printk("H: try access: 0\n");
- sc = rtems_bdbuf_get(dev, 0, &bd);
+ sc = rtems_bdbuf_get(dd, 0, &bd);
ASSERT_SC(sc);
printk("H: access: 0\n");
@@ -103,6 +104,7 @@ static void task_high(rtems_task_argument arg)
static rtems_task Init(rtems_task_argument argument)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
+ dev_t dev = 0;
printk("\n\n*** TEST BLOCK 4 ***\n");
@@ -112,6 +114,9 @@ static rtems_task Init(rtems_task_argument argument)
sc = ramdisk_register(BLOCK_SIZE, BLOCK_COUNT, false, "/dev/rda", &dev);
ASSERT_SC(sc);
+ dd = rtems_disk_obtain(dev);
+ rtems_test_assert(dd != NULL);
+
sc = rtems_task_create(
rtems_build_name(' ', 'L', 'O', 'W'),
PRIORITY_LOW,
diff --git a/testsuites/libtests/block05/init.c b/testsuites/libtests/block05/init.c
index e795f7effe..8af26fe937 100644
--- a/testsuites/libtests/block05/init.c
+++ b/testsuites/libtests/block05/init.c
@@ -7,12 +7,13 @@
*/
/*
- * Copyright (c) 2009
- * 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
@@ -56,9 +57,9 @@
/* In case of trouble change this to 1 or 2 for more output */
static unsigned output_level = 0;
-static dev_t dev_a;
+static const rtems_disk_device *dd_a;
-static dev_t dev_b;
+static const rtems_disk_device *dd_b;
static rtems_id task_id_init;
@@ -146,24 +147,27 @@ static rtems_bdbuf_buffer *get(enum get_type type, enum blk_kind kind)
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_bdbuf_buffer *bd = NULL;
rtems_blkdev_bnum blk_index = 0;
- rtems_status_code (*get_bd)(dev_t, rtems_blkdev_bnum, rtems_bdbuf_buffer **)
- = NULL;
- dev_t dev = 0;
+ rtems_status_code (*get_bd)(
+ const rtems_disk_device *,
+ rtems_blkdev_bnum,
+ rtems_bdbuf_buffer **
+ ) = NULL;
+ const rtems_disk_device *dd = NULL;
size_t bds_per_group = 0;
switch (kind) {
case BLK_A0:
- dev = dev_a;
+ dd = dd_a;
blk_index = 0;
bds_per_group = 2;
break;
case BLK_A1:
- dev = dev_a;
+ dd = dd_a;
blk_index = 1;
bds_per_group = 2;
break;
case BLK_B0:
- dev = dev_b;
+ dd = dd_b;
blk_index = 0;
bds_per_group = 1;
break;
@@ -184,10 +188,10 @@ static rtems_bdbuf_buffer *get(enum get_type type, enum blk_kind kind)
break;
}
- sc = (*get_bd)(dev, blk_index, &bd);
+ sc = (*get_bd)(dd, blk_index, &bd);
rtems_test_assert(
sc == RTEMS_SUCCESSFUL
- && bd->dev == dev
+ && bd->dd == dd
&& bd->block == blk_index
&& bd->group->bds_per_group == bds_per_group
);
@@ -313,8 +317,8 @@ static void execute_test(unsigned i)
sc = rtems_task_resume(task_id_high);
ASSERT_SC(sc);
- sc = rtems_bdbuf_get(dev_b, 0, &bd);
- rtems_test_assert(sc == RTEMS_SUCCESSFUL && bd->dev == dev_b && bd->block == 0);
+ sc = rtems_bdbuf_get(dd_b, 0, &bd);
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL && bd->dd == dd_b && bd->block == 0);
sc = rtems_bdbuf_release(bd);
ASSERT_SC(sc);
@@ -350,10 +354,10 @@ static void execute_test(unsigned i)
print(2, "F\n");
- sc = rtems_bdbuf_syncdev(dev_a);
+ sc = rtems_bdbuf_syncdev(dd_a);
ASSERT_SC(sc);
- sc = rtems_bdbuf_syncdev(dev_b);
+ sc = rtems_bdbuf_syncdev(dd_b);
ASSERT_SC(sc);
}
@@ -383,10 +387,10 @@ static int disk_ioctl(rtems_disk_device *dd, uint32_t req, void *argp)
}
}
-rtems_status_code disk_register(
+static void disk_register(
uint32_t block_size,
rtems_blkdev_bnum block_count,
- dev_t *dev_ptr
+ const rtems_disk_device **dd_ptr
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
@@ -408,9 +412,8 @@ rtems_status_code disk_register(
);
ASSERT_SC(sc);
- *dev_ptr = dev;
-
- return RTEMS_SUCCESSFUL;
+ *dd_ptr = rtems_disk_obtain(dev);
+ rtems_test_assert(*dd_ptr!= NULL);
}
static rtems_task Init(rtems_task_argument argument)
@@ -425,11 +428,9 @@ static rtems_task Init(rtems_task_argument argument)
sc = rtems_disk_io_initialize();
ASSERT_SC(sc);
- sc = disk_register(BLOCK_SIZE_A, BLOCK_COUNT_A, &dev_a);
- ASSERT_SC(sc);
+ disk_register(BLOCK_SIZE_A, BLOCK_COUNT_A, &dd_a);
- sc = disk_register(BLOCK_SIZE_B, BLOCK_COUNT_B, &dev_b);
- ASSERT_SC(sc);
+ disk_register(BLOCK_SIZE_B, BLOCK_COUNT_B, &dd_b);
sc = rtems_task_create(
rtems_build_name(' ', 'L', 'O', 'W'),
diff --git a/testsuites/libtests/block06/init.c b/testsuites/libtests/block06/init.c
index fd84049bd4..11e26e2d1f 100644
--- a/testsuites/libtests/block06/init.c
+++ b/testsuites/libtests/block06/init.c
@@ -107,6 +107,7 @@ typedef struct bdbuf_task_control
rtems_device_major_number major;
rtems_device_minor_number minor;
bool passed;
+ const rtems_disk_device *dd;
} bdbuf_task_control;
#define BDBUF_TEST_TASKS (3)
@@ -188,7 +189,7 @@ bdbuf_disk_unlock (bdbuf_disk* bdd)
/**
* BDBUf wait for the wait event.
*/
-rtems_status_code
+static rtems_status_code
bdbuf_wait (const char* who, unsigned long timeout)
{
rtems_status_code sc;
@@ -340,7 +341,8 @@ static void
bdbuf_task_control_init (int task,
bdbuf_task_control* tc,
rtems_id master,
- rtems_device_major_number major)
+ rtems_device_major_number major,
+ const rtems_disk_device *dd)
{
char name[6];
sprintf (name, "bdt%d", task);
@@ -353,6 +355,7 @@ bdbuf_task_control_init (int task,
tc->major = major;
tc->minor = 0;
tc->passed = false;
+ tc->dd = dd;
}
static bool
@@ -608,9 +611,11 @@ static rtems_driver_address_table bdbuf_disk_io_ops = {
*/
static bool
-bdbuf_tests_setup_disk (rtems_device_major_number* major)
+bdbuf_tests_setup_disk (rtems_device_major_number* major,
+ const rtems_disk_device **dd_ptr)
{
rtems_status_code sc;
+ bool ok;
/*
* Register the disk driver.
@@ -620,8 +625,14 @@ bdbuf_tests_setup_disk (rtems_device_major_number* major)
sc = rtems_io_register_driver (RTEMS_DRIVER_AUTO_MAJOR,
&bdbuf_disk_io_ops,
major);
+ ok = sc == RTEMS_SUCCESSFUL;
- return sc == RTEMS_SUCCESSFUL;
+ if (ok) {
+ *dd_ptr = rtems_disk_obtain (rtems_filesystem_make_dev_t (*major, 0));
+ ok = *dd_ptr != NULL;
+ }
+
+ return ok;
}
static bool
@@ -672,10 +683,8 @@ bdbuf_tests_task_0_test_1 (bdbuf_task_control* tc)
for (i = 0; (i < 2) && passed; i++)
{
- dev_t device = rtems_filesystem_make_dev_t (tc->major, tc->minor);
-
bdbuf_test_printf ("%s: rtems_bdbuf_get[0]: ", tc->name);
- sc = rtems_bdbuf_get (device, 0, &bd);
+ sc = rtems_bdbuf_get (tc->dd, 0, &bd);
if (!bdbuf_test_print_sc (sc, true))
{
passed = false;
@@ -722,10 +731,8 @@ bdbuf_tests_task_0_test_2 (bdbuf_task_control* tc)
for (i = 0; (i < 5) && passed; i++)
{
- dev_t device = rtems_filesystem_make_dev_t (tc->major, tc->minor);
-
bdbuf_test_printf ("%s: rtems_bdbuf_get[%d]: ", tc->name, i);
- sc = rtems_bdbuf_get (device, i, &bd);
+ sc = rtems_bdbuf_get (tc->dd, i, &bd);
if (!bdbuf_test_print_sc (sc, true))
passed = false;
@@ -783,7 +790,6 @@ bdbuf_tests_task_0_test_3 (bdbuf_task_control* tc)
rtems_status_code sc;
bool passed;
rtems_bdbuf_buffer* bd;
- dev_t device;
/*
* Set task control's passed to false to handle a timeout.
@@ -791,8 +797,6 @@ bdbuf_tests_task_0_test_3 (bdbuf_task_control* tc)
tc->passed = false;
passed = true;
- device = rtems_filesystem_make_dev_t (tc->major, tc->minor);
-
bdbuf_disk_lock (&bdbuf_disks[tc->minor]);
bdbuf_disks[tc->minor].driver_action = BDBUF_DISK_NOOP;
bdbuf_disk_unlock (&bdbuf_disks[tc->minor]);
@@ -801,7 +805,7 @@ bdbuf_tests_task_0_test_3 (bdbuf_task_control* tc)
* Read the buffer and then release it.
*/
bdbuf_test_printf ("%s: rtems_bdbuf_read[5]: ", tc->name);
- sc = rtems_bdbuf_read (device, 5, &bd);
+ sc = rtems_bdbuf_read (tc->dd, 5, &bd);
if ((passed = bdbuf_test_print_sc (sc, true)))
{
bdbuf_test_printf ("%s: rtems_bdbuf_release_modified[5]: ", tc->name);
@@ -814,7 +818,7 @@ bdbuf_tests_task_0_test_3 (bdbuf_task_control* tc)
* be maintained as modified.
*/
bdbuf_test_printf ("%s: rtems_bdbuf_read[5]: ", tc->name);
- sc = rtems_bdbuf_read (device, 5, &bd);
+ sc = rtems_bdbuf_read (tc->dd, 5, &bd);
if ((passed = bdbuf_test_print_sc (sc, true)))
{
bdbuf_test_printf ("%s: rtems_bdbuf_release[5]: ", tc->name);
@@ -871,10 +875,8 @@ bdbuf_tests_task_0_test_4 (bdbuf_task_control* tc)
for (i = 0; (i < num) && passed; i++)
{
- dev_t device = rtems_filesystem_make_dev_t (tc->major, tc->minor);
-
bdbuf_test_printf ("%s: rtems_bdbuf_read[%d]: ", tc->name, i);
- sc = rtems_bdbuf_read (device, i, &bd);
+ sc = rtems_bdbuf_read (tc->dd, i, &bd);
if (!bdbuf_test_print_sc (sc, true))
passed = false;
@@ -991,10 +993,8 @@ bdbuf_tests_task_0_test_6 (bdbuf_task_control* tc)
for (i = 0; (i < 5) && passed; i++)
{
- dev_t device = rtems_filesystem_make_dev_t (tc->major, tc->minor);
-
bdbuf_test_printf ("%s: rtems_bdbuf_read[%d]: ", tc->name, i);
- sc = rtems_bdbuf_get (device, i, &bd);
+ sc = rtems_bdbuf_get (tc->dd, i, &bd);
if (!bdbuf_test_print_sc (sc, true))
passed = false;
@@ -1030,7 +1030,6 @@ bdbuf_tests_task_0_test_7 (bdbuf_task_control* tc)
int i;
rtems_bdbuf_buffer* bd;
rtems_chain_control buffers;
- dev_t device;
/*
* Set task control's passed to false to handle a timeout.
@@ -1044,8 +1043,6 @@ bdbuf_tests_task_0_test_7 (bdbuf_task_control* tc)
bdbuf_clear_disk_driver_watch (tc);
bdbuf_set_disk_driver_action (tc, BDBUF_DISK_NOOP);
- device = rtems_filesystem_make_dev_t (tc->major, tc->minor);
-
/*
* Get the blocks 0 -> 4 and hold them.
*/
@@ -1054,7 +1051,7 @@ bdbuf_tests_task_0_test_7 (bdbuf_task_control* tc)
for (i = 0; (i < 5) && passed; i++)
{
bdbuf_test_printf ("%s: rtems_bdbuf_read[%d]: ", tc->name, i);
- sc = rtems_bdbuf_get (device, i, &bd);
+ sc = rtems_bdbuf_get (tc->dd, i, &bd);
if (!bdbuf_test_print_sc (sc, true))
passed = false;
@@ -1074,9 +1071,9 @@ bdbuf_tests_task_0_test_7 (bdbuf_task_control* tc)
{
bdbuf_test_printf ("%s: rtems_bdbuf_syncdev[%d:%d]: ",
tc->name, i,
- rtems_filesystem_dev_major_t (device),
- rtems_filesystem_dev_minor_t (device));
- passed = bdbuf_test_print_sc (rtems_bdbuf_syncdev (device), true);
+ tc->major,
+ tc->minor);
+ passed = bdbuf_test_print_sc (rtems_bdbuf_syncdev (tc->dd), true);
}
tc->passed = passed;
@@ -1093,7 +1090,6 @@ bdbuf_tests_task_0_test_8 (bdbuf_task_control* tc)
rtems_chain_control buffers;
rtems_chain_node* node;
rtems_chain_node* pnode;
- dev_t device;
/*
* Set task control's passed to false to handle a timeout.
@@ -1107,8 +1103,6 @@ bdbuf_tests_task_0_test_8 (bdbuf_task_control* tc)
bdbuf_clear_disk_driver_watch (tc);
bdbuf_set_disk_driver_action (tc, BDBUF_DISK_NOOP);
- device = rtems_filesystem_make_dev_t (tc->major, tc->minor);
-
/*
* Get the blocks 0 -> 4 and hold them.
*/
@@ -1117,7 +1111,7 @@ bdbuf_tests_task_0_test_8 (bdbuf_task_control* tc)
for (i = 0; (i < 5) && passed; i++)
{
bdbuf_test_printf ("%s: rtems_bdbuf_read[%d]: ", tc->name, i);
- sc = rtems_bdbuf_get (device, i, &bd);
+ sc = rtems_bdbuf_get (tc->dd, i, &bd);
if (!bdbuf_test_print_sc (sc, true))
passed = false;
@@ -1159,13 +1153,13 @@ bdbuf_tests_task_0_test_8 (bdbuf_task_control* tc)
bdbuf_test_printf ("%s: rtems_bdbuf_syncdev[%d:%d]: checking order\n",
tc->name, i,
- rtems_filesystem_dev_major_t (device),
- rtems_filesystem_dev_minor_t (device));
- sc = rtems_bdbuf_syncdev (device);
+ tc->major,
+ tc->minor);
+ sc = rtems_bdbuf_syncdev (tc->dd);
bdbuf_test_printf ("%s: rtems_bdbuf_syncdev[%d:%d]: ",
tc->name, i,
- rtems_filesystem_dev_major_t (device),
- rtems_filesystem_dev_minor_t (device));
+ tc->major,
+ tc->minor);
passed = bdbuf_test_print_sc (sc, true);
}
@@ -1259,10 +1253,8 @@ bdbuf_tests_ranged_get_release (bdbuf_task_control* tc,
for (i = lower; (i < upper) && passed; i++)
{
- dev_t device = rtems_filesystem_make_dev_t (tc->major, tc->minor);
-
bdbuf_test_printf ("%s: rtems_bdbuf_get[%d]: blocking ...\n", tc->name, i);
- sc = rtems_bdbuf_get (device, i, &bd);
+ sc = rtems_bdbuf_get (tc->dd, i, &bd);
bdbuf_test_printf ("%s: rtems_bdbuf_get[%d]: ", tc->name, i);
if (!bdbuf_test_print_sc (sc, true))
{
@@ -1770,6 +1762,7 @@ bdbuf_tester (void)
rtems_task_priority old_priority;
int t;
bool passed = true;
+ const rtems_disk_device *dd;
/*
* Change priority to a lower one.
@@ -1783,7 +1776,7 @@ bdbuf_tester (void)
/*
* This sets up the buffer pools.
*/
- if (!bdbuf_tests_setup_disk (&major))
+ if (!bdbuf_tests_setup_disk (&major, &dd))
{
bdbuf_test_printf ("disk set up failed\n");
return;
@@ -1804,7 +1797,8 @@ bdbuf_tester (void)
{
bdbuf_task_control_init (t, &tasks[t],
rtems_task_self (),
- major);
+ major,
+ dd);
if (!bdbuf_tests_create_task (&tasks[t],
BDBUF_TESTS_PRI_HIGH - t,
diff --git a/testsuites/libtests/block07/init.c b/testsuites/libtests/block07/init.c
index ea60a1f092..969fd36207 100644
--- a/testsuites/libtests/block07/init.c
+++ b/testsuites/libtests/block07/init.c
@@ -54,7 +54,7 @@
#define BLOCK_COUNT 2
-static dev_t dev;
+static rtems_disk_device *dd;
static rtems_id task_id_low;
@@ -65,12 +65,11 @@ static rtems_id task_id_high;
static void change_block_size(void)
{
int rv = 0;
- uint32_t new_block_size = BLOCK_SIZE_B;
int fd = open("/dev/rda", O_RDWR);
rtems_test_assert(fd >= 0);
- rv = ioctl(fd, RTEMS_BLKIO_SETBLKSIZE, &new_block_size);
+ rv = rtems_disk_fd_set_block_size(fd, BLOCK_SIZE_B);
rtems_test_assert(rv == 0);
rv = close(fd);
@@ -84,7 +83,7 @@ static void task_low(rtems_task_argument arg)
printk("L: try access: 0\n");
- sc = rtems_bdbuf_get(dev, 0, &bd);
+ sc = rtems_bdbuf_get(dd, 0, &bd);
ASSERT_SC(sc);
printk("L: access: 0\n");
@@ -110,7 +109,7 @@ static void task_mid(rtems_task_argument arg)
printk("M: try access: 0\n");
- sc = rtems_bdbuf_get(dev, 0, &bd);
+ sc = rtems_bdbuf_get(dd, 0, &bd);
ASSERT_SC(sc);
printk("M: access: 0\n");
@@ -136,7 +135,7 @@ static void task_high(rtems_task_argument arg)
printk("H: try access: 0\n");
- sc = rtems_bdbuf_get(dev, 0, &bd);
+ sc = rtems_bdbuf_get(dd, 0, &bd);
ASSERT_SC(sc);
printk("H: access: 0\n");
@@ -158,6 +157,7 @@ static rtems_task Init(rtems_task_argument argument)
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_task_priority cur_prio = 0;
rtems_bdbuf_buffer *bd = NULL;
+ dev_t dev = 0;
printk("\n\n*** TEST BLOCK 7 ***\n");
@@ -167,6 +167,9 @@ static rtems_task Init(rtems_task_argument argument)
sc = ramdisk_register(BLOCK_SIZE_A, BLOCK_COUNT, false, "/dev/rda", &dev);
ASSERT_SC(sc);
+ dd = rtems_disk_obtain(dev);
+ rtems_test_assert(dd != NULL);
+
sc = rtems_task_create(
rtems_build_name(' ', 'L', 'O', 'W'),
PRIORITY_LOW,
@@ -212,7 +215,7 @@ static rtems_task Init(rtems_task_argument argument)
sc = rtems_task_suspend(task_id_high);
ASSERT_SC(sc);
- sc = rtems_bdbuf_get(dev, 1, &bd);
+ sc = rtems_bdbuf_get(dd, 1, &bd);
ASSERT_SC(sc);
sc = rtems_bdbuf_release(bd);
@@ -220,7 +223,7 @@ static rtems_task Init(rtems_task_argument argument)
printk("I: try access: 0\n");
- sc = rtems_bdbuf_get(dev, 0, &bd);
+ sc = rtems_bdbuf_get(dd, 0, &bd);
ASSERT_SC(sc);
printk("I: access: 0\n");
diff --git a/testsuites/libtests/block08/bdbuf_test1_1.c b/testsuites/libtests/block08/bdbuf_test1_1.c
index 9f3ee06b93..2958f27167 100644
--- a/testsuites/libtests/block08/bdbuf_test1_1.c
+++ b/testsuites/libtests/block08/bdbuf_test1_1.c
@@ -106,7 +106,7 @@ bdbuf_test1_1_thread1(rtems_task_argument arg)
* Step 1-2:
* Successful read operation.
*/
- rc = rtems_bdbuf_read(test_dev, 0, &bd1);
+ rc = rtems_bdbuf_read(test_dd, 0, &bd1);
if (rc != RTEMS_SUCCESSFUL)
{
TEST_FAILED();
@@ -124,7 +124,7 @@ bdbuf_test1_1_thread1(rtems_task_argument arg)
* Read operation fails with RTEMS_IO_ERROR code.
* The function shall not update user pointer.
*/
- rc = rtems_bdbuf_read(test_dev, TEST_BLK_NUM, &bd2);
+ rc = rtems_bdbuf_read(test_dd, TEST_BLK_NUM, &bd2);
if (rc != RTEMS_IO_ERROR || bd2 != NULL)
{
TEST_FAILED();
@@ -137,7 +137,7 @@ bdbuf_test1_1_thread1(rtems_task_argument arg)
* Read operation fails with RTEMS_IO_ERROR code.
* The function shall not update user pointer.
*/
- rc = rtems_bdbuf_read(test_dev, TEST_BLK_NUM, &bd2);
+ rc = rtems_bdbuf_read(test_dd, TEST_BLK_NUM, &bd2);
if (rc != RTEMS_IO_ERROR || bd2 != NULL)
{
TEST_FAILED();
diff --git a/testsuites/libtests/block08/bdbuf_test1_2.c b/testsuites/libtests/block08/bdbuf_test1_2.c
index 61b978ce49..1d5e44b1e3 100644
--- a/testsuites/libtests/block08/bdbuf_test1_2.c
+++ b/testsuites/libtests/block08/bdbuf_test1_2.c
@@ -122,7 +122,7 @@ bdbuf_test1_2_thread1(rtems_task_argument arg)
* driver will notify about an error, and as the
* result this call will return an error.
*/
- rc = rtems_bdbuf_read(test_dev, TEST_BLK_NUM, &bd);
+ rc = rtems_bdbuf_read(test_dd, TEST_BLK_NUM, &bd);
if (rc != RTEMS_IO_ERROR || bd != NULL)
{
TEST_FAILED();
@@ -152,7 +152,7 @@ bdbuf_test1_2_thread2(rtems_task_argument arg)
* But main test task will agin tell device driver to return
* RTEMS_IO_ERROR data transfer result.
*/
- rc = rtems_bdbuf_read(test_dev, TEST_BLK_NUM, &bd);
+ rc = rtems_bdbuf_read(test_dd, TEST_BLK_NUM, &bd);
if (rc != RTEMS_IO_ERROR || bd != NULL)
{
TEST_FAILED();
diff --git a/testsuites/libtests/block08/bdbuf_test1_3.c b/testsuites/libtests/block08/bdbuf_test1_3.c
index 9ea5b653ab..ab5d1dcbc6 100644
--- a/testsuites/libtests/block08/bdbuf_test1_3.c
+++ b/testsuites/libtests/block08/bdbuf_test1_3.c
@@ -131,7 +131,7 @@ bdbuf_test1_3_thread1(rtems_task_argument arg)
* driver will notify about an error, and as the
* result this call will return an error.
*/
- rc = rtems_bdbuf_read(test_dev, TEST_BLK_NUM, &bd);
+ rc = rtems_bdbuf_read(test_dd, TEST_BLK_NUM, &bd);
if (rc != RTEMS_IO_ERROR || bd != NULL)
{
TEST_FAILED();
@@ -160,7 +160,7 @@ bdbuf_test1_3_thread2(rtems_task_argument arg)
* number, bdbuf library should ask for re-read data again.
* Time time main task will tell driver to report success.
*/
- rc = rtems_bdbuf_read(test_dev, TEST_BLK_NUM, &bd);
+ rc = rtems_bdbuf_read(test_dd, TEST_BLK_NUM, &bd);
if (rc != RTEMS_SUCCESSFUL || bd == NULL)
{
TEST_FAILED();
diff --git a/testsuites/libtests/block08/bdbuf_test1_4.c b/testsuites/libtests/block08/bdbuf_test1_4.c
index b7a4b0c399..4d6e02835d 100644
--- a/testsuites/libtests/block08/bdbuf_test1_4.c
+++ b/testsuites/libtests/block08/bdbuf_test1_4.c
@@ -125,7 +125,7 @@ bdbuf_test1_4_thread1(rtems_task_argument arg)
* date transfer, and as the result this call
* will return valid buffer.
*/
- rc = rtems_bdbuf_read(test_dev, TEST_BLK_NUM, &bd);
+ rc = rtems_bdbuf_read(test_dd, TEST_BLK_NUM, &bd);
if (rc != RTEMS_SUCCESSFUL)
{
TEST_FAILED();
@@ -161,7 +161,7 @@ bdbuf_test1_4_thread2(rtems_task_argument arg)
* On step 4 thread #1 releases buffer and as the result
* our read operation should finish with success.
*/
- rc = rtems_bdbuf_read(test_dev, TEST_BLK_NUM, &bd);
+ rc = rtems_bdbuf_read(test_dd, TEST_BLK_NUM, &bd);
if (rc != RTEMS_SUCCESSFUL)
{
TEST_FAILED();
diff --git a/testsuites/libtests/block08/bdbuf_test1_5.c b/testsuites/libtests/block08/bdbuf_test1_5.c
index 4e09359652..c054db320f 100644
--- a/testsuites/libtests/block08/bdbuf_test1_5.c
+++ b/testsuites/libtests/block08/bdbuf_test1_5.c
@@ -101,7 +101,7 @@ bdbuf_test1_5_thread1(rtems_task_argument arg)
* Step 1:
* read blk #N on thread #1
*/
- rc = rtems_bdbuf_read(test_dev, TEST_BLK_NUM, &bd);
+ rc = rtems_bdbuf_read(test_dd, TEST_BLK_NUM, &bd);
if (rc != RTEMS_SUCCESSFUL)
{
TEST_FAILED();
@@ -133,7 +133,7 @@ bdbuf_test1_5_thread2(rtems_task_argument arg)
* Try to read block #N. Right now thread #1 owns
* this buffer, so we will block waiting for buffer.
*/
- rc = rtems_bdbuf_read(test_dev, TEST_BLK_NUM, &bd);
+ rc = rtems_bdbuf_read(test_dd, TEST_BLK_NUM, &bd);
if (rc != RTEMS_SUCCESSFUL)
{
TEST_FAILED();
diff --git a/testsuites/libtests/block08/bdbuf_test2_1.c b/testsuites/libtests/block08/bdbuf_test2_1.c
index 6005657024..435d7184a0 100644
--- a/testsuites/libtests/block08/bdbuf_test2_1.c
+++ b/testsuites/libtests/block08/bdbuf_test2_1.c
@@ -142,7 +142,7 @@ bdbuf_test2_1_thread1(rtems_task_argument arg)
* date transfer, and as the result this call
* will return valid buffer.
*/
- rc = rtems_bdbuf_read(test_dev, TEST_BLK_NUM, &bd);
+ rc = rtems_bdbuf_read(test_dd, TEST_BLK_NUM, &bd);
if (rc != RTEMS_SUCCESSFUL)
{
TEST_FAILED();
@@ -178,7 +178,7 @@ bdbuf_test2_1_thread2(rtems_task_argument arg)
* On step 4 thread #1 releases buffer and as the result
* our read operation should finish with success.
*/
- rc = rtems_bdbuf_read(test_dev, TEST_BLK_NUM, &bd);
+ rc = rtems_bdbuf_read(test_dd, TEST_BLK_NUM, &bd);
if (rc != RTEMS_SUCCESSFUL)
{
TEST_FAILED();
diff --git a/testsuites/libtests/block08/bdbuf_test2_2.c b/testsuites/libtests/block08/bdbuf_test2_2.c
index 394a158426..5ee614c44c 100644
--- a/testsuites/libtests/block08/bdbuf_test2_2.c
+++ b/testsuites/libtests/block08/bdbuf_test2_2.c
@@ -142,7 +142,7 @@ bdbuf_test2_2_thread1(rtems_task_argument arg)
* date transfer, and as the result this call
* will return valid buffer.
*/
- rc = rtems_bdbuf_read(test_dev, TEST_BLK_NUM, &bd);
+ rc = rtems_bdbuf_read(test_dd, TEST_BLK_NUM, &bd);
if (rc != RTEMS_SUCCESSFUL)
{
TEST_FAILED();
@@ -178,7 +178,7 @@ bdbuf_test2_2_thread2(rtems_task_argument arg)
* On step 4 thread #1 releases buffer and as the result
* our read operation should finish with success.
*/
- rc = rtems_bdbuf_read(test_dev, TEST_BLK_NUM, &bd);
+ rc = rtems_bdbuf_read(test_dd, TEST_BLK_NUM, &bd);
if (rc != RTEMS_SUCCESSFUL)
{
TEST_FAILED();
diff --git a/testsuites/libtests/block08/bdbuf_test3_1.c b/testsuites/libtests/block08/bdbuf_test3_1.c
index cdee6eb4be..592fa019c3 100644
--- a/testsuites/libtests/block08/bdbuf_test3_1.c
+++ b/testsuites/libtests/block08/bdbuf_test3_1.c
@@ -116,7 +116,7 @@ bdbuf_test3_1_thread1(rtems_task_argument arg)
* [An entry is found in AVL tree, removed from modified list and
* returned with state ACCESS_MODIFIED]
*/
- rc = rtems_bdbuf_get(test_dev, TEST_BLK_NUM_N, &bd);
+ rc = rtems_bdbuf_get(test_dd, TEST_BLK_NUM_N, &bd);
if (rc != RTEMS_SUCCESSFUL)
{
TEST_FAILED();
@@ -128,7 +128,7 @@ bdbuf_test3_1_thread1(rtems_task_argument arg)
TEST_FAILED();
}
- rc = rtems_bdbuf_read(test_dev, TEST_BLK_NUM_N, &bd);
+ rc = rtems_bdbuf_read(test_dd, TEST_BLK_NUM_N, &bd);
if (rc != RTEMS_SUCCESSFUL)
{
TEST_FAILED();
@@ -166,7 +166,7 @@ bdbuf_test3_1_thread2(rtems_task_argument arg)
* this thread blocks on
* rtems_bdbuf_wait(pool, &pool->waiting, &pool->wait_waiters)]
*/
- rc = rtems_bdbuf_get(test_dev, TEST_BLK_NUM_M, &bd);
+ rc = rtems_bdbuf_get(test_dd, TEST_BLK_NUM_M, &bd);
if (rc != RTEMS_SUCCESSFUL)
{
TEST_FAILED();
diff --git a/testsuites/libtests/block08/bdbuf_test3_2.c b/testsuites/libtests/block08/bdbuf_test3_2.c
index b9c97754fb..111b57fdf7 100644
--- a/testsuites/libtests/block08/bdbuf_test3_2.c
+++ b/testsuites/libtests/block08/bdbuf_test3_2.c
@@ -117,7 +117,7 @@ bdbuf_test3_2_thread1(rtems_task_argument arg)
* Step 1:
* Call rtems_bdbuf_read(#N) to get a buffer;
*/
- rc = rtems_bdbuf_read(test_dev, TEST_BLK_NUM_N1, &bd);
+ rc = rtems_bdbuf_read(test_dd, TEST_BLK_NUM_N1, &bd);
if (rc != RTEMS_SUCCESSFUL)
{
TEST_FAILED();
@@ -150,7 +150,7 @@ bdbuf_test3_2_thread2(rtems_task_argument arg)
* Step 2:
* In thread #2 call get(#N2)
*/
- rc = rtems_bdbuf_get(test_dev, TEST_BLK_NUM_N2, &bd);
+ rc = rtems_bdbuf_get(test_dd, TEST_BLK_NUM_N2, &bd);
if (rc != RTEMS_SUCCESSFUL)
{
TEST_FAILED();
@@ -180,7 +180,7 @@ bdbuf_test3_2_thread3(rtems_task_argument arg)
* Step 3:
* In thread #3 call get(#N3)
*/
- rc = rtems_bdbuf_get(test_dev, TEST_BLK_NUM_N3, &bd);
+ rc = rtems_bdbuf_get(test_dd, TEST_BLK_NUM_N3, &bd);
if (rc != RTEMS_SUCCESSFUL)
{
TEST_FAILED();
diff --git a/testsuites/libtests/block08/bdbuf_test3_3.c b/testsuites/libtests/block08/bdbuf_test3_3.c
index 13ac7a25fb..27dbfa2687 100644
--- a/testsuites/libtests/block08/bdbuf_test3_3.c
+++ b/testsuites/libtests/block08/bdbuf_test3_3.c
@@ -128,7 +128,7 @@ bdbuf_test3_3_thread1(rtems_task_argument arg)
* Step 1:
* Call rtems_bdbuf_read(#N) to get a buffer;
*/
- rc = rtems_bdbuf_read(test_dev, TEST_BLK_NUM_N1, &bd);
+ rc = rtems_bdbuf_read(test_dd, TEST_BLK_NUM_N1, &bd);
if (rc != RTEMS_SUCCESSFUL)
{
TEST_FAILED();
@@ -161,7 +161,7 @@ bdbuf_test3_3_thread2(rtems_task_argument arg)
* Step 2:
* In thread #2 call read(#N2)
*/
- rc = rtems_bdbuf_read(test_dev, TEST_BLK_NUM_N2, &bd);
+ rc = rtems_bdbuf_read(test_dd, TEST_BLK_NUM_N2, &bd);
if (rc != RTEMS_SUCCESSFUL)
{
TEST_FAILED();
@@ -191,7 +191,7 @@ bdbuf_test3_3_thread3(rtems_task_argument arg)
* Step 3:
* In thread #3 call read(#N3)
*/
- rc = rtems_bdbuf_read(test_dev, TEST_BLK_NUM_N3, &bd);
+ rc = rtems_bdbuf_read(test_dd, TEST_BLK_NUM_N3, &bd);
if (rc != RTEMS_SUCCESSFUL)
{
TEST_FAILED();
diff --git a/testsuites/libtests/block08/bdbuf_test4_1.c b/testsuites/libtests/block08/bdbuf_test4_1.c
index 6961c35020..914216d0c1 100644
--- a/testsuites/libtests/block08/bdbuf_test4_1.c
+++ b/testsuites/libtests/block08/bdbuf_test4_1.c
@@ -122,7 +122,7 @@ bdbuf_test4_1_thread1(rtems_task_argument arg)
* Step 1:
* Call rtems_bdbuf_read(#N) in thread #1;
*/
- rc = rtems_bdbuf_read(test_dev, TEST_BLK_NUM_N, &bd);
+ rc = rtems_bdbuf_read(test_dd, TEST_BLK_NUM_N, &bd);
if (rc != RTEMS_SUCCESSFUL)
{
TEST_FAILED();
@@ -158,7 +158,7 @@ bdbuf_test4_1_thread2(rtems_task_argument arg)
* In thread #2 call rtems_bdbuf_read(#N).
* We will block on this call.
*/
- rc = rtems_bdbuf_read(test_dev, TEST_BLK_NUM_N, &bd);
+ rc = rtems_bdbuf_read(test_dd, TEST_BLK_NUM_N, &bd);
if (rc != RTEMS_SUCCESSFUL)
{
TEST_FAILED();
diff --git a/testsuites/libtests/block08/bdbuf_test4_2.c b/testsuites/libtests/block08/bdbuf_test4_2.c
index 628e65eaf9..c1d8890661 100644
--- a/testsuites/libtests/block08/bdbuf_test4_2.c
+++ b/testsuites/libtests/block08/bdbuf_test4_2.c
@@ -109,7 +109,7 @@ bdbuf_test4_2_thread1(rtems_task_argument arg)
* Step 1:
* Call rtems_bdbuf_read(#N) in thread #1;
*/
- rc = rtems_bdbuf_read(test_dev, TEST_BLK_NUM_N, &bd);
+ rc = rtems_bdbuf_read(test_dd, TEST_BLK_NUM_N, &bd);
if (rc != RTEMS_SUCCESSFUL)
{
TEST_FAILED();
@@ -143,7 +143,7 @@ bdbuf_test4_2_thread2(rtems_task_argument arg)
* In thread #2 call read(#N).
* We will block on this call.
*/
- rc = rtems_bdbuf_read(test_dev, TEST_BLK_NUM_N, &bd);
+ rc = rtems_bdbuf_read(test_dd, TEST_BLK_NUM_N, &bd);
if (rc != RTEMS_SUCCESSFUL)
{
TEST_FAILED();
diff --git a/testsuites/libtests/block08/bdbuf_test4_3.c b/testsuites/libtests/block08/bdbuf_test4_3.c
index 55de280f3d..ab7861ee14 100644
--- a/testsuites/libtests/block08/bdbuf_test4_3.c
+++ b/testsuites/libtests/block08/bdbuf_test4_3.c
@@ -103,7 +103,7 @@ bdbuf_test4_3_thread1(rtems_task_argument arg)
* Step 1:
* Call rtems_bdbuf_read(#N) in thread #1;
*/
- rc = rtems_bdbuf_read(test_dev, TEST_BLK_NUM_N, &bd);
+ rc = rtems_bdbuf_read(test_dd, TEST_BLK_NUM_N, &bd);
if (rc != RTEMS_SUCCESSFUL)
{
TEST_FAILED();
@@ -137,7 +137,7 @@ bdbuf_test4_3_thread2(rtems_task_argument arg)
* In thread #2 call rtems_bdbuf_read(#N).
* We will block on this call.
*/
- rc = rtems_bdbuf_read(test_dev, TEST_BLK_NUM_N, &bd);
+ rc = rtems_bdbuf_read(test_dd, TEST_BLK_NUM_N, &bd);
if (rc != RTEMS_SUCCESSFUL)
{
TEST_FAILED();
diff --git a/testsuites/libtests/block08/bdbuf_tests.c b/testsuites/libtests/block08/bdbuf_tests.c
index bc6b772fb2..f265a094c1 100644
--- a/testsuites/libtests/block08/bdbuf_tests.c
+++ b/testsuites/libtests/block08/bdbuf_tests.c
@@ -49,7 +49,7 @@ struct bdbuf_test_descr {
#define TEST_SEM_ATTRIBS RTEMS_DEFAULT_ATTRIBUTES
/** Device ID used for testing */
-dev_t test_dev = (dev_t)-1;
+const rtems_disk_device *test_dd = NULL;
/** Test result variable */
bool good_test_result = true;
@@ -108,6 +108,7 @@ run_bdbuf_tests()
rtems_disk_device *disk;
rtems_status_code sc;
dev_t dev = -1;
+ dev_t test_dev;
unsigned int i;
rtems_device_major_number major;
@@ -153,6 +154,13 @@ run_bdbuf_tests()
return;
}
+ test_dd = rtems_disk_obtain(test_dev);
+ if (test_dd == NULL)
+ {
+ printf("Failed to obtain %s disk\n", TEST_DISK_NAME);
+ return;
+ }
+
/*
* On initialization test disk device driver registers
* its RX message queue, so we just need to locate it.
diff --git a/testsuites/libtests/block08/bdbuf_tests.h b/testsuites/libtests/block08/bdbuf_tests.h
index e8affa1cbc..ecd932fa4d 100644
--- a/testsuites/libtests/block08/bdbuf_tests.h
+++ b/testsuites/libtests/block08/bdbuf_tests.h
@@ -85,7 +85,7 @@ typedef struct bdbuf_test_msg {
union {
struct driver_req {
- dev_t dev;
+ const rtems_disk_device *dd;
uint32_t req;
void *argp;
} driver_req;
@@ -152,7 +152,7 @@ typedef struct test_ctx {
extern test_ctx g_test_ctx;
/** Device ID used for testing */
-extern dev_t test_dev;
+extern const rtems_disk_device *test_dd;
/**
* Create a message queue for test driver that is used for
@@ -259,7 +259,7 @@ extern bool good_test_result;
do { \
WAIT_DRV_MSG(msg_); \
if ((msg_)->val.driver_req.req != RTEMS_BLKIO_REQUEST || \
- (msg_)->val.driver_req.dev != test_dev || \
+ (msg_)->val.driver_req.dd != test_dd || \
((rtems_blkdev_request *) \
((msg_)->val.driver_req.argp))->req != \
RTEMS_BLKDEV_REQ_WRITE) \
@@ -267,7 +267,7 @@ extern bool good_test_result;
printk("Unexpected message received by disk driver: " \
"req - 0x%x (0x%x), dev - %d (%d)\n", \
(msg_)->val.driver_req.req, RTEMS_BLKIO_REQUEST, \
- (msg_)->val.driver_req.dev, test_dev); \
+ (msg_)->val.driver_req.dd, test_dd); \
return; \
} \
} while (0)
diff --git a/testsuites/libtests/block08/test_disk.c b/testsuites/libtests/block08/test_disk.c
index 358b3614ae..461914f345 100644
--- a/testsuites/libtests/block08/test_disk.c
+++ b/testsuites/libtests/block08/test_disk.c
@@ -34,7 +34,6 @@ static Objects_Id testq_id = OBJECTS_ID_NONE;
static int
test_disk_ioctl(rtems_disk_device *dd, uint32_t req, void *argp)
{
- dev_t dev = rtems_disk_get_device_identifier(dd);
rtems_status_code rc;
bdbuf_test_msg msg;
size_t msg_size;
@@ -66,7 +65,7 @@ test_disk_ioctl(rtems_disk_device *dd, uint32_t req, void *argp)
memset(&msg, 0, sizeof(msg));
msg.type = BDBUF_TEST_MSG_TYPE_DRIVER_REQ;
- msg.val.driver_req.dev = dev;
+ msg.val.driver_req.dd = dd;
msg.val.driver_req.req = req;
msg.val.driver_req.argp = argp;
diff --git a/testsuites/libtests/block09/init.c b/testsuites/libtests/block09/init.c
index 5d7a8b7e69..b7426c36c2 100644
--- a/testsuites/libtests/block09/init.c
+++ b/testsuites/libtests/block09/init.c
@@ -7,12 +7,13 @@
*/
/*
- * Copyright (c) 2009
- * 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
@@ -108,7 +109,7 @@ static int disk_ioctl(rtems_disk_device *dd, uint32_t req, void *arg)
}
}
-rtems_status_code disk_register(
+static rtems_status_code disk_register(
uint32_t block_size,
rtems_blkdev_bnum block_count,
dev_t *dev_ptr
@@ -139,7 +140,7 @@ rtems_status_code disk_register(
}
static void check_read(
- dev_t dev,
+ const rtems_disk_device *dd,
rtems_blkdev_bnum block,
rtems_status_code expected_sc
)
@@ -147,7 +148,7 @@ static void check_read(
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_bdbuf_buffer *bd = NULL;
- sc = rtems_bdbuf_read(dev, block, &bd);
+ sc = rtems_bdbuf_read(dd, block, &bd);
assert(sc == expected_sc);
if (sc == RTEMS_SUCCESSFUL) {
@@ -161,6 +162,7 @@ static rtems_task Init(rtems_task_argument argument)
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_bdbuf_buffer *bd = NULL;
dev_t dev = 0;
+ rtems_disk_device *dd = NULL;
printk("\n\n*** TEST BLOCK 9 ***\n");
@@ -170,14 +172,17 @@ static rtems_task Init(rtems_task_argument argument)
sc = disk_register(BLOCK_SIZE, BLOCK_COUNT, &dev);
ASSERT_SC(sc);
- check_read(dev, BLOCK_READ_IO_ERROR, RTEMS_IO_ERROR);
- check_read(dev, BLOCK_READ_UNSATISFIED, RTEMS_UNSATISFIED);
- check_read(dev, BLOCK_READ_SUCCESSFUL, RTEMS_SUCCESSFUL);
- check_read(dev, BLOCK_WRITE_IO_ERROR, RTEMS_SUCCESSFUL);
+ dd = rtems_disk_obtain(dev);
+ assert(dd != NULL);
+
+ check_read(dd, BLOCK_READ_IO_ERROR, RTEMS_IO_ERROR);
+ check_read(dd, BLOCK_READ_UNSATISFIED, RTEMS_UNSATISFIED);
+ check_read(dd, BLOCK_READ_SUCCESSFUL, RTEMS_SUCCESSFUL);
+ check_read(dd, BLOCK_WRITE_IO_ERROR, RTEMS_SUCCESSFUL);
/* Check write IO error */
- sc = rtems_bdbuf_read(dev, BLOCK_WRITE_IO_ERROR, &bd);
+ sc = rtems_bdbuf_read(dd, BLOCK_WRITE_IO_ERROR, &bd);
ASSERT_SC(sc);
bd->buffer [0] = 1;
@@ -185,7 +190,7 @@ static rtems_task Init(rtems_task_argument argument)
sc = rtems_bdbuf_sync(bd);
ASSERT_SC(sc);
- sc = rtems_bdbuf_read(dev, BLOCK_WRITE_IO_ERROR, &bd);
+ sc = rtems_bdbuf_read(dd, BLOCK_WRITE_IO_ERROR, &bd);
ASSERT_SC(sc);
assert(bd->buffer [0] == 0);
@@ -195,7 +200,7 @@ static rtems_task Init(rtems_task_argument argument)
/* Check write to deleted disk */
- sc = rtems_bdbuf_read(dev, BLOCK_READ_SUCCESSFUL, &bd);
+ sc = rtems_bdbuf_read(dd, BLOCK_READ_SUCCESSFUL, &bd);
ASSERT_SC(sc);
sc = rtems_disk_delete(dev);
@@ -204,6 +209,9 @@ static rtems_task Init(rtems_task_argument argument)
sc = rtems_bdbuf_sync(bd);
ASSERT_SC(sc);
+ sc = rtems_disk_release(dd);
+ ASSERT_SC(sc);
+
printk("*** END OF TEST BLOCK 9 ***\n");
exit(0);
diff --git a/testsuites/libtests/block10/init.c b/testsuites/libtests/block10/init.c
index 18af160be1..80ca98e5ae 100644
--- a/testsuites/libtests/block10/init.c
+++ b/testsuites/libtests/block10/init.c
@@ -52,7 +52,7 @@ typedef rtems_bdbuf_buffer *(*access_func)(char task);
typedef void (*release_func)(char task, rtems_bdbuf_buffer *bd);
-static dev_t dev;
+static const rtems_disk_device *dd;
static rtems_id task_id_init;
@@ -110,7 +110,7 @@ static int disk_ioctl(rtems_disk_device *dd, uint32_t req, void *arg)
}
}
-rtems_status_code disk_register(
+static rtems_status_code disk_register(
uint32_t block_size,
rtems_blkdev_bnum block_count,
dev_t *dev_ptr
@@ -147,7 +147,7 @@ static rtems_bdbuf_buffer *do_get(char task)
printk("%c: try get\n", task);
- sc = rtems_bdbuf_get(dev, 0, &bd);
+ sc = rtems_bdbuf_get(dd, 0, &bd);
ASSERT_SC(sc);
printk("%c: get\n", task);
@@ -162,13 +162,13 @@ static rtems_bdbuf_buffer *do_get_mod(char task)
printk("%c: try get modified\n", task);
- sc = rtems_bdbuf_get(dev, 0, &bd);
+ sc = rtems_bdbuf_get(dd, 0, &bd);
ASSERT_SC(sc);
sc = rtems_bdbuf_release_modified(bd);
ASSERT_SC(sc);
- sc = rtems_bdbuf_get(dev, 0, &bd);
+ sc = rtems_bdbuf_get(dd, 0, &bd);
ASSERT_SC(sc);
printk("%c: get modified\n", task);
@@ -183,7 +183,7 @@ static rtems_bdbuf_buffer *do_read(char task)
printk("%c: try read\n", task);
- sc = rtems_bdbuf_read(dev, 0, &bd);
+ sc = rtems_bdbuf_read(dd, 0, &bd);
ASSERT_SC(sc);
printk("%c: read\n", task);
@@ -203,7 +203,7 @@ static void do_rel(char task, rtems_bdbuf_buffer *bd)
printk("%c: release done\n", task);
}
-void do_rel_mod(char task, rtems_bdbuf_buffer *bd)
+static void do_rel_mod(char task, rtems_bdbuf_buffer *bd)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
@@ -231,7 +231,7 @@ static void purge(char task)
{
printk("%c: purge\n", task);
- rtems_bdbuf_purge_dev(dev);
+ rtems_bdbuf_purge_dev(dd);
}
static void task_purger(rtems_task_argument arg)
@@ -387,6 +387,7 @@ static const char *purger_assoc_table [PURGER_COUNT] = {
static rtems_task Init(rtems_task_argument argument)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
+ dev_t dev = 0;
size_t i_w = 0;
size_t i_ac = 0;
size_t i_rel = 0;
@@ -402,6 +403,9 @@ static rtems_task Init(rtems_task_argument argument)
sc = disk_register(BLOCK_SIZE, BLOCK_COUNT, &dev);
ASSERT_SC(sc);
+ dd = rtems_disk_obtain(dev);
+ assert(dd != NULL);
+
sc = rtems_task_create(
rtems_build_name('P', 'U', 'R', 'G'),
PRIORITY_HIGH,
diff --git a/testsuites/samples/fileio/init.c b/testsuites/samples/fileio/init.c
index f8c33fc261..5c63744e9a 100644
--- a/testsuites/samples/fileio/init.c
+++ b/testsuites/samples/fileio/init.c
@@ -325,23 +325,9 @@ shell_bdbuf_trace (int argc, char* argv[])
}
static int
-disk_test_set_block_size (dev_t dev, size_t size)
+disk_test_set_block_size (rtems_disk_device *dd, size_t size)
{
- rtems_disk_device* dd;
- int rc;
-
- dd = rtems_disk_obtain (dev);
- if (!dd)
- {
- printf ("error: cannot obtain disk\n");
- return 1;
- }
-
- rc = dd->ioctl (dd, RTEMS_BLKIO_SETBLKSIZE, &size);
-
- rtems_disk_release (dd);
-
- return rc;
+ return dd->ioctl (dd, RTEMS_BLKIO_SETBLKSIZE, &size);
}
static int
@@ -353,37 +339,50 @@ disk_test_write_blocks (dev_t dev, int start, int count, size_t size)
int i;
rtems_bdbuf_buffer* bd;
rtems_status_code sc;
+ int rv = 0;
+ rtems_disk_device* dd;
+
+ dd = rtems_disk_obtain (dev);
+ if (!dd)
+ {
+ printf ("error: cannot obtain disk\n");
+ rv = 1;
+ }
- if (disk_test_set_block_size (dev, size) < 0)
+ if (rv == 0 && disk_test_set_block_size (dd, size) < 0)
{
printf ("error: set block size failed: %s\n", strerror (errno));
- return 1;
+ rv = 1;
}
- for (block = start; block < (start + count); block++)
+ for (block = start; rv == 0 && block < (start + count); block++)
{
- sc = rtems_bdbuf_read (dev, block, &bd);
- if (sc != RTEMS_SUCCESSFUL)
+ sc = rtems_bdbuf_read (dd, block, &bd);
+ if (sc == RTEMS_SUCCESSFUL)
{
- printf ("error: get block %d bd failed: %s\n",
- block, rtems_status_text (sc));
- return 1;
- }
+ ip = (uint32_t*) bd->buffer;
+ for (i = 0; i < (size / sizeof (uint32_t)); i++, ip++, value++)
+ *ip = (size << 16) | value;
- ip = (uint32_t*) bd->buffer;
- for (i = 0; i < (size / sizeof (uint32_t)); i++, ip++, value++)
- *ip = (size << 16) | value;
-
- sc = rtems_bdbuf_release_modified (bd);
- if (sc != RTEMS_SUCCESSFUL)
+ sc = rtems_bdbuf_release_modified (bd);
+ if (sc != RTEMS_SUCCESSFUL)
+ {
+ printf ("error: release block %d bd failed: %s\n",
+ block, rtems_status_text (sc));
+ rv = 1;
+ }
+ }
+ else
{
- printf ("error: release block %d bd failed: %s\n",
+ printf ("error: get block %d bd failed: %s\n",
block, rtems_status_text (sc));
- return 1;
+ rv = 1;
}
}
- return 0;
+ rtems_disk_release (dd);
+
+ return rv;
}
static int