summaryrefslogtreecommitdiffstats
path: root/cpukit/libblock
diff options
context:
space:
mode:
authorChristian Mauderer <christian.mauderer@embedded-brains.de>2020-07-09 10:21:29 +0200
committerChristian Mauderer <christian.mauderer@embedded-brains.de>2020-07-17 08:12:37 +0200
commit3a95a07d88a6926bd2f67dc53c977b8dbc828f9c (patch)
treebd0a63c5a5bb9ff72ea43bda17a2355bc3688a64 /cpukit/libblock
parentbsps/pc386: Fix IPI for non-consecutive APICIDs (diff)
downloadrtems-3a95a07d88a6926bd2f67dc53c977b8dbc828f9c.tar.bz2
media-server: Add ability for retry.
This adds the possibility to request a retry in the media-listener if an operation failed. Usefull for example if you want to automatically reformat a disk if it wasn't possible to mount it.
Diffstat (limited to 'cpukit/libblock')
-rw-r--r--cpukit/libblock/src/media.c30
1 files changed, 17 insertions, 13 deletions
diff --git a/cpukit/libblock/src/media.c b/cpukit/libblock/src/media.c
index 5b2b06b5b2..dd604d39bf 100644
--- a/cpukit/libblock/src/media.c
+++ b/cpukit/libblock/src/media.c
@@ -420,26 +420,30 @@ static rtems_status_code process_event(
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
+ rtems_status_code sc_retry = RTEMS_SUCCESSFUL;
rtems_media_state state = RTEMS_MEDIA_STATE_FAILED;
char *dest = NULL;
- sc = notify(event, RTEMS_MEDIA_STATE_INQUIRY, src, NULL);
- if (sc == RTEMS_SUCCESSFUL) {
- state = RTEMS_MEDIA_STATE_READY;
- } else {
- state = RTEMS_MEDIA_STATE_ABORTED;
- }
-
- sc = (*worker)(state, src, &dest, worker_arg);
- if (state == RTEMS_MEDIA_STATE_READY) {
+ do {
+ sc = notify(event, RTEMS_MEDIA_STATE_INQUIRY, src, NULL);
if (sc == RTEMS_SUCCESSFUL) {
- state = RTEMS_MEDIA_STATE_SUCCESS;
+ state = RTEMS_MEDIA_STATE_READY;
} else {
- state = RTEMS_MEDIA_STATE_FAILED;
+ state = RTEMS_MEDIA_STATE_ABORTED;
+ }
+
+ sc = (*worker)(state, src, &dest, worker_arg);
+ if (state == RTEMS_MEDIA_STATE_READY) {
+ if (sc == RTEMS_SUCCESSFUL) {
+ state = RTEMS_MEDIA_STATE_SUCCESS;
+ } else {
+ state = RTEMS_MEDIA_STATE_FAILED;
+ }
}
- }
- notify(event, state, src, dest);
+ sc_retry = notify(event, state, src, dest);
+ } while (state == RTEMS_MEDIA_STATE_FAILED
+ && sc_retry == RTEMS_INCORRECT_STATE);
remember_event(event, state, src, dest);
if (state == RTEMS_MEDIA_STATE_SUCCESS) {