diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2012-03-05 10:01:37 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2012-03-13 12:24:16 +0100 |
commit | beea58072d893f7ab820a409f494954f10152a3d (patch) | |
tree | 2ac83b36d5c0c7b36c87339eb38a65a698ef4a99 /cpukit | |
parent | IMFS: Node specific stat handlers (diff) | |
download | rtems-beea58072d893f7ab820a409f494954f10152a3d.tar.bz2 |
libblock: Add optional free at delete request
Diffstat (limited to 'cpukit')
-rw-r--r-- | cpukit/libblock/include/rtems/ramdisk.h | 10 | ||||
-rw-r--r-- | cpukit/libblock/src/ramdisk-driver.c | 9 |
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; |