diff options
author | Thomas Doerfler <Thomas.Doerfler@embedded-brains.de> | 2010-04-09 12:28:24 +0000 |
---|---|---|
committer | Thomas Doerfler <Thomas.Doerfler@embedded-brains.de> | 2010-04-09 12:28:24 +0000 |
commit | bdac0eed0c2acf442db943d116f53b8e0f7d2c3e (patch) | |
tree | 9254e0e000e5c75e082022db3b1a527d6df709da /cpukit/libblock | |
parent | Changes throughout (diff) | |
download | rtems-bdac0eed0c2acf442db943d116f53b8e0f7d2c3e.tar.bz2 |
fixed disk delete
Obtain/release disk during open/close
Diffstat (limited to 'cpukit/libblock')
-rw-r--r-- | cpukit/libblock/src/blkdev.c | 129 | ||||
-rw-r--r-- | cpukit/libblock/src/diskdevs.c | 30 |
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(); } } |