summaryrefslogtreecommitdiffstats
path: root/cpukit
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2010-05-17 08:08:30 +0000
committerSebastian Huber <sebastian.huber@embedded-brains.de>2010-05-17 08:08:30 +0000
commitc8522fd2c49ef89503806f3ef438a0ba46d93b4a (patch)
tree593212af723c72af15f6461bffea87490e2335f9 /cpukit
parent2010-05-15 Joel Sherrill <joel.sherrilL@OARcorp.com> (diff)
downloadrtems-c8522fd2c49ef89503806f3ef438a0ba46d93b4a.tar.bz2
2010-05-17 Oleg Kravtsov <Oleg.Kravtsov@oktetlabs.ru>
PR 1449/cpukit * libblock/src/diskdevs.c: rtems_disk_next() will now implicitly obtain the returned disk. * libblock/include/rtems/diskdevs.h: Documentation.
Diffstat (limited to 'cpukit')
-rw-r--r--cpukit/ChangeLog7
-rw-r--r--cpukit/libblock/include/rtems/diskdevs.h8
-rw-r--r--cpukit/libblock/src/diskdevs.c69
3 files changed, 59 insertions, 25 deletions
diff --git a/cpukit/ChangeLog b/cpukit/ChangeLog
index 9bfbdc14f1..6c97c84ae3 100644
--- a/cpukit/ChangeLog
+++ b/cpukit/ChangeLog
@@ -1,3 +1,10 @@
+2010-05-17 Oleg Kravtsov <Oleg.Kravtsov@oktetlabs.ru>
+
+ PR 1449/cpukit
+ * libblock/src/diskdevs.c: rtems_disk_next() will now implicitly
+ obtain the returned disk.
+ * libblock/include/rtems/diskdevs.h: Documentation.
+
2010-05-15 Chris Johns <chrisj@rtems.org>
* libfs/src/imfs/imfs_initsupp.c, libfs/src/imfs/imfs.h,
diff --git a/cpukit/libblock/include/rtems/diskdevs.h b/cpukit/libblock/include/rtems/diskdevs.h
index a8b7dce93e..8884999d95 100644
--- a/cpukit/libblock/include/rtems/diskdevs.h
+++ b/cpukit/libblock/include/rtems/diskdevs.h
@@ -323,10 +323,12 @@ rtems_status_code rtems_disk_io_done(void);
* one to start the search.
*
* @code
- * rtems_disk_device *dd = rtems_disk_next((dev_t) -1);
+ * rtems_status_code sc = RTEMS_SUCCESSFUL;
+ * rtems_disk_device *dd = (dev_t) -1;
*
- * while (dd != NULL) {
- * dd = rtems_disk_next(dd->dev);
+ * while (sc == RTEMS_SUCCESSFUL && (dd = rtems_disk_next(dev)) != NULL) {
+ * dev = rtems_disk_get_device_identifier(dd);
+ * sc = rtems_disk_release(dd);
* }
* @endcode
*/
diff --git a/cpukit/libblock/src/diskdevs.c b/cpukit/libblock/src/diskdevs.c
index 74cc3e3b24..8336fcbb67 100644
--- a/cpukit/libblock/src/diskdevs.c
+++ b/cpukit/libblock/src/diskdevs.c
@@ -462,33 +462,58 @@ rtems_disk_release(rtems_disk_device *dd)
rtems_disk_device *
rtems_disk_next(dev_t dev)
{
- rtems_device_major_number major;
- rtems_device_minor_number minor;
- rtems_disk_device_table *dtab;
+ rtems_status_code sc = RTEMS_SUCCESSFUL;
+ rtems_disk_device_table *dtab = NULL;
+ rtems_device_major_number major = 0;
+ rtems_device_minor_number minor = 0;
- dev++;
- rtems_filesystem_split_dev_t (dev, major, minor);
+ if (dev != (dev_t) -1) {
+ rtems_filesystem_split_dev_t(dev, major, minor);
- if (major >= disktab_size)
+ /* If minor wraps around */
+ if ((minor + 1) < minor) {
+ /* If major wraps around */
+ if ((major + 1) < major) {
return NULL;
+ }
+ ++major;
+ minor = 0;
+ } else {
+ ++minor;
+ }
+ }
- dtab = disktab + major;
- while (true)
- {
- if ((dtab == NULL) || (minor >= dtab->size))
- {
- major++; minor = 0;
- if (major >= disktab_size)
- return NULL;
- dtab = disktab + major;
- }
- else if (dtab->minor[minor] == NULL)
- {
- minor++;
- }
- else
- return dtab->minor[minor];
+ sc = disk_lock();
+ if (sc != RTEMS_SUCCESSFUL) {
+ return NULL;
+ }
+
+ if (major >= disktab_size) {
+ disk_unlock();
+
+ return NULL;
+ }
+
+ dtab = disktab + major;
+ while (true) {
+ if (dtab->minor == NULL || minor >= dtab->size) {
+ minor = 0;
+ ++major;
+ if (major >= disktab_size) {
+ disk_unlock();
+
+ return NULL;
+ }
+ dtab = disktab + major;
+ } else if (dtab->minor [minor] == NULL) {
+ ++minor;
+ } else {
+ ++dtab->minor [minor]->uses;
+ disk_unlock();
+
+ return dtab->minor [minor];
}
+ }
}
rtems_status_code