summaryrefslogtreecommitdiffstats
path: root/cpukit/libblock
diff options
context:
space:
mode:
authorThomas Doerfler <Thomas.Doerfler@embedded-brains.de>2010-04-09 12:28:24 +0000
committerThomas Doerfler <Thomas.Doerfler@embedded-brains.de>2010-04-09 12:28:24 +0000
commitbdac0eed0c2acf442db943d116f53b8e0f7d2c3e (patch)
tree9254e0e000e5c75e082022db3b1a527d6df709da /cpukit/libblock
parentChanges throughout (diff)
downloadrtems-bdac0eed0c2acf442db943d116f53b8e0f7d2c3e.tar.bz2
fixed disk delete
Obtain/release disk during open/close
Diffstat (limited to 'cpukit/libblock')
-rw-r--r--cpukit/libblock/src/blkdev.c129
-rw-r--r--cpukit/libblock/src/diskdevs.c30
2 files changed, 59 insertions, 100 deletions
diff --git a/cpukit/libblock/src/blkdev.c b/cpukit/libblock/src/blkdev.c
index 74dac49ffd..10c14dfaf2 100644
--- a/cpukit/libblock/src/blkdev.c
+++ b/cpukit/libblock/src/blkdev.c
@@ -33,33 +33,22 @@
*/
rtems_device_driver
rtems_blkdev_generic_read(
- rtems_device_major_number major,
- rtems_device_minor_number minor,
+ rtems_device_major_number major __attribute__((unused)),
+ rtems_device_minor_number minor __attribute__((unused)),
void * arg)
{
rtems_status_code rc = RTEMS_SUCCESSFUL;
rtems_libio_rw_args_t *args = arg;
- uint32_t block_size;
- char *buf;
- uint32_t count;
- rtems_blkdev_bnum block;
- uint32_t blkofs;
- dev_t dev;
- rtems_disk_device *dd;
-
- dev = rtems_filesystem_make_dev_t(major, minor);
- dd = rtems_disk_obtain(dev);
- if (dd == NULL)
- return RTEMS_INVALID_NUMBER;
-
- block_size = dd->block_size;
-
- buf = args->buffer;
- count = args->count;
- args->bytes_moved = 0;
+ rtems_libio_t *iop = args->iop;
+ rtems_disk_device *dd = iop->data1;
+ uint32_t block_size = dd->block_size;
+ char *buf = args->buffer;
+ 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;
- block = (rtems_blkdev_bnum) (args->offset / block_size);
- blkofs = (uint32_t) (args->offset % block_size);
+ args->bytes_moved = 0;
while (count > 0)
{
@@ -83,8 +72,6 @@ rtems_blkdev_generic_read(
block++;
}
- rtems_disk_release(dd);
-
return rc;
}
@@ -94,33 +81,22 @@ rtems_blkdev_generic_read(
*/
rtems_device_driver
rtems_blkdev_generic_write(
- rtems_device_major_number major,
- rtems_device_minor_number minor,
+ rtems_device_major_number major __attribute__((unused)),
+ rtems_device_minor_number minor __attribute__((unused)),
void * arg)
{
rtems_status_code rc = RTEMS_SUCCESSFUL;
rtems_libio_rw_args_t *args = arg;
- uint32_t block_size;
- char *buf;
- uint32_t count;
- rtems_blkdev_bnum block;
- uint32_t blkofs;
- dev_t dev;
- rtems_disk_device *dd;
-
- dev = rtems_filesystem_make_dev_t(major, minor);
- dd = rtems_disk_obtain(dev);
- if (dd == NULL)
- return RTEMS_INVALID_NUMBER;
-
- block_size = dd->block_size;
-
- buf = args->buffer;
- count = args->count;
- args->bytes_moved = 0;
+ rtems_libio_t *iop = args->iop;
+ rtems_disk_device *dd = iop->data1;
+ uint32_t block_size = dd->block_size;
+ char *buf = args->buffer;
+ 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;
- block = (rtems_blkdev_bnum) (args->offset / block_size);
- blkofs = (uint32_t) (args->offset % block_size);
+ args->bytes_moved = 0;
while (count > 0)
{
@@ -150,8 +126,6 @@ rtems_blkdev_generic_write(
block++;
}
- rtems_disk_release(dd);
-
return rc;
}
@@ -162,21 +136,19 @@ rtems_device_driver
rtems_blkdev_generic_open(
rtems_device_major_number major,
rtems_device_minor_number minor,
- void * arg __attribute__((unused)))
+ void * arg)
{
- dev_t dev;
- rtems_disk_device *dd;
+ rtems_libio_open_close_args_t *oc = arg;
+ rtems_libio_t *iop = oc->iop;
+ dev_t dev = rtems_filesystem_make_dev_t(major, minor);
+ rtems_disk_device *dd = rtems_disk_obtain(dev);
- dev = rtems_filesystem_make_dev_t(major, minor);
- dd = rtems_disk_obtain(dev);
- if (dd == NULL)
- return RTEMS_INVALID_NUMBER;
-
- dd->uses++;
-
- rtems_disk_release(dd);
+ iop->data1 = dd;
+ if (dd != NULL)
return RTEMS_SUCCESSFUL;
+ else
+ return RTEMS_UNSATISFIED;
}
@@ -185,23 +157,17 @@ rtems_blkdev_generic_open(
*/
rtems_device_driver
rtems_blkdev_generic_close(
- rtems_device_major_number major,
- rtems_device_minor_number minor,
- void * arg __attribute__((unused)))
+ rtems_device_major_number major __attribute__((unused)),
+ rtems_device_minor_number minor __attribute__((unused)),
+ void * arg)
{
- dev_t dev;
- rtems_disk_device *dd;
-
- dev = rtems_filesystem_make_dev_t(major, minor);
- dd = rtems_disk_obtain(dev);
- if (dd == NULL)
- return RTEMS_INVALID_NUMBER;
+ rtems_libio_open_close_args_t *oc = arg;
+ rtems_libio_t *iop = oc->iop;
+ rtems_disk_device *dd = iop->data1;
- dd->uses--;
+ rtems_disk_release(dd);
- rtems_disk_release(dd);
-
- return RTEMS_SUCCESSFUL;
+ return RTEMS_SUCCESSFUL;
}
/* blkdev_generic_ioctl --
@@ -209,20 +175,15 @@ rtems_blkdev_generic_close(
*/
rtems_device_driver
rtems_blkdev_generic_ioctl(
- rtems_device_major_number major,
- rtems_device_minor_number minor,
+ rtems_device_major_number major __attribute__((unused)),
+ rtems_device_minor_number minor __attribute__((unused)),
void * arg)
{
rtems_libio_ioctl_args_t *args = arg;
- dev_t dev;
- rtems_disk_device *dd;
+ rtems_libio_t *iop = args->iop;
+ rtems_disk_device *dd = iop->data1;
int rc;
- dev = rtems_filesystem_make_dev_t(major, minor);
- dd = rtems_disk_obtain(dev);
- if (dd == NULL)
- return RTEMS_INVALID_NUMBER;
-
switch (args->command)
{
case RTEMS_BLKIO_GETMEDIABLKSIZE:
@@ -255,8 +216,7 @@ rtems_blkdev_generic_ioctl(
* It is not allowed to directly access the driver circumventing
* the cache.
*/
- rc = RTEMS_INVALID_NAME;
- args->ioctl_return = -1;
+ args->ioctl_return = (uint32_t) -1;
break;
default:
@@ -265,7 +225,6 @@ rtems_blkdev_generic_ioctl(
args->buffer);
break;
}
- rtems_disk_release(dd);
return RTEMS_SUCCESSFUL;
}
diff --git a/cpukit/libblock/src/diskdevs.c b/cpukit/libblock/src/diskdevs.c
index bf2d03f003..24e01a8f80 100644
--- a/cpukit/libblock/src/diskdevs.c
+++ b/cpukit/libblock/src/diskdevs.c
@@ -89,7 +89,7 @@ disk_unlock(void)
}
static rtems_disk_device *
-get_disk_entry(dev_t dev)
+get_disk_entry(dev_t dev, bool lookup_only)
{
rtems_device_major_number major = 0;
rtems_device_minor_number minor = 0;
@@ -102,11 +102,15 @@ get_disk_entry(dev_t dev)
if (minor < dtab->size && dtab->minor != NULL) {
rtems_disk_device *dd = dtab->minor [minor];
- if (dd != NULL && !dd->deleted) {
- ++dd->uses;
-
- return dd;
+ if (dd != NULL && !lookup_only) {
+ if (!dd->deleted) {
+ ++dd->uses;
+ } else {
+ dd = NULL;
+ }
}
+
+ return dd;
}
}
@@ -288,11 +292,8 @@ rtems_status_code rtems_disk_create_log(
return sc;
}
- physical_disk = get_disk_entry(phys);
+ physical_disk = get_disk_entry(phys, true);
if (physical_disk == NULL || !is_physical_disk(physical_disk)) {
- if (physical_disk != NULL) {
- --physical_disk->uses;
- }
disk_unlock();
return RTEMS_INVALID_ID;
@@ -303,7 +304,6 @@ rtems_status_code rtems_disk_create_log(
|| end_block <= begin_block
|| end_block > physical_disk->size
) {
- --physical_disk->uses;
disk_unlock();
return RTEMS_INVALID_NUMBER;
@@ -311,7 +311,6 @@ rtems_status_code rtems_disk_create_log(
sc = create_disk(dev, name, &dd);
if (sc != RTEMS_SUCCESSFUL) {
- --physical_disk->uses;
disk_unlock();
return sc;
@@ -324,6 +323,8 @@ rtems_status_code rtems_disk_create_log(
dd->ioctl = physical_disk->ioctl;
dd->driver_data = physical_disk->driver_data;
+ ++physical_disk->uses;
+
disk_unlock();
return RTEMS_SUCCESSFUL;
@@ -398,14 +399,13 @@ rtems_disk_delete(dev_t dev)
return sc;
}
- dd = get_disk_entry(dev);
+ dd = get_disk_entry(dev, true);
if (dd == NULL) {
disk_unlock();
return RTEMS_INVALID_ID;
}
- --dd->uses;
dd->deleted = true;
rtems_disk_cleanup(dd);
@@ -424,14 +424,14 @@ rtems_disk_obtain(dev_t dev)
rtems_interrupt_disable(level);
if (!diskdevs_protected) {
/* Frequent and quickest case */
- dd = get_disk_entry(dev);
+ dd = get_disk_entry(dev, false);
rtems_interrupt_enable(level);
} else {
rtems_interrupt_enable(level);
sc = disk_lock();
if (sc == RTEMS_SUCCESSFUL) {
- dd = get_disk_entry(dev);
+ dd = get_disk_entry(dev, false);
disk_unlock();
}
}