diff options
Diffstat (limited to 'cpukit/libblock/src/diskdevs.c')
-rw-r--r-- | cpukit/libblock/src/diskdevs.c | 69 |
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 |