summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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