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