summaryrefslogtreecommitdiffstats
path: root/cpukit/libblock/src/bdbuf.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2012-02-28 17:19:49 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2012-03-13 12:24:18 +0100
commit796967c3df40a51a9028bc83d1a4b6dbeae07c3f (patch)
treeedd7251883f74506a69f76e6e9fbf173de195f50 /cpukit/libblock/src/bdbuf.c
parentlibblock: Documentation (diff)
downloadrtems-796967c3df40a51a9028bc83d1a4b6dbeae07c3f.tar.bz2
libblock: Change bdbuf API
The functions o rtems_bdbuf_get(), o rtems_bdbuf_read(), o rtems_bdbuf_syncdev(), and o rtems_bdbuf_purge_dev(), use now the disk device instead of the device identifier. This makes bdbuf independent of rtems_disk_obtain() and rtems_disk_release(). It is the responsiblity of the file system to obtain the disk device. This also reduces the overhead to get a buffer. The key for the AVL tree uses now the disk device instead of the device identifier. The pointer is interpreted as an unsigned integer. This reduces the memory overhead and makes the comparison operation a bit faster. Removed function rtems_bdbuf_purge_major(). This function was too destructive and could have unpredictable side effects.
Diffstat (limited to 'cpukit/libblock/src/bdbuf.c')
-rw-r--r--cpukit/libblock/src/bdbuf.c237
1 files changed, 78 insertions, 159 deletions
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);
-}