diff options
-rw-r--r-- | cpukit/ChangeLog | 7 | ||||
-rw-r--r-- | cpukit/libblock/include/rtems/diskdevs.h | 8 | ||||
-rw-r--r-- | cpukit/libblock/src/diskdevs.c | 69 |
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 |