summaryrefslogtreecommitdiffstats
path: root/cpukit/libblock/src/diskdevs.c
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/libblock/src/diskdevs.c')
-rw-r--r--cpukit/libblock/src/diskdevs.c69
1 files changed, 47 insertions, 22 deletions
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