summaryrefslogtreecommitdiffstats
path: root/cpukit
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2012-03-05 10:01:37 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2012-03-13 12:24:16 +0100
commitbeea58072d893f7ab820a409f494954f10152a3d (patch)
tree2ac83b36d5c0c7b36c87339eb38a65a698ef4a99 /cpukit
parentIMFS: Node specific stat handlers (diff)
downloadrtems-beea58072d893f7ab820a409f494954f10152a3d.tar.bz2
libblock: Add optional free at delete request
Diffstat (limited to 'cpukit')
-rw-r--r--cpukit/libblock/include/rtems/ramdisk.h10
-rw-r--r--cpukit/libblock/src/ramdisk-driver.c9
2 files changed, 18 insertions, 1 deletions
diff --git a/cpukit/libblock/include/rtems/ramdisk.h b/cpukit/libblock/include/rtems/ramdisk.h
index 71efc9fda0..a396bd6cfc 100644
--- a/cpukit/libblock/include/rtems/ramdisk.h
+++ b/cpukit/libblock/include/rtems/ramdisk.h
@@ -136,6 +136,11 @@ typedef struct ramdisk {
* @brief Trace enable.
*/
bool trace;
+
+ /**
+ * @brief Free the RAM disk at the block device delete request.
+ */
+ bool free_at_delete_request;
} ramdisk;
extern const rtems_driver_address_table ramdisk_ops;
@@ -213,6 +218,11 @@ ramdisk *ramdisk_allocate(
void ramdisk_free(ramdisk *rd);
+static inline void ramdisk_enable_free_at_delete_request(ramdisk *rd)
+{
+ rd->free_at_delete_request = true;
+}
+
/**
* @brief Allocates, initializes and registers a RAM disk.
*
diff --git a/cpukit/libblock/src/ramdisk-driver.c b/cpukit/libblock/src/ramdisk-driver.c
index 2bc8d27962..da36d79d17 100644
--- a/cpukit/libblock/src/ramdisk-driver.c
+++ b/cpukit/libblock/src/ramdisk-driver.c
@@ -102,12 +102,13 @@ ramdisk_write(struct ramdisk *rd, rtems_blkdev_request *req)
int
ramdisk_ioctl(rtems_disk_device *dd, uint32_t req, void *argp)
{
+ struct ramdisk *rd = rtems_disk_get_driver_data(dd);
+
switch (req)
{
case RTEMS_BLKIO_REQUEST:
{
rtems_blkdev_request *r = argp;
- struct ramdisk *rd = rtems_disk_get_driver_data(dd);
switch (r->req)
{
@@ -124,6 +125,12 @@ ramdisk_ioctl(rtems_disk_device *dd, uint32_t req, void *argp)
break;
}
+ case RTEMS_BLKIO_DELETED:
+ if (rd->free_at_delete_request) {
+ ramdisk_free(rd);
+ }
+ break;
+
default:
return rtems_blkdev_ioctl (dd, req, argp);
break;