summaryrefslogtreecommitdiffstats
path: root/cpukit/libblock/src/diskdevs.c
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/src/diskdevs.c
parentChanges throughout (diff)
downloadrtems-bdac0eed0c2acf442db943d116f53b8e0f7d2c3e.tar.bz2
fixed disk delete
Obtain/release disk during open/close
Diffstat (limited to 'cpukit/libblock/src/diskdevs.c')
-rw-r--r--cpukit/libblock/src/diskdevs.c30
1 files changed, 15 insertions, 15 deletions
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();
}
}