Which commands are appropriate for jobs in which state is also somewhat
burdensome to keep track of. Introduce a verbs table that, as of this RFC
patch, does nothing but serve as a declaration of intent.

(At the very least, it forced me to consider all of the possibilities.)

If this idea seems appealing, I can expand the verbs concept into a list
of interfaces to consult the table and refuse inappropriate commands,
mostly serving as new errors for the QMP interface.


cancel: can apply to any created, running, paused or ready job.
pause: can apply to any created, running, or ready job. Addition pauses
       can and do stack, so a paused job can also be paused.
       Note that a pause from the QMP context is treated separately and
       does not stack.
resume: Only a paused job can be resumed. Only a job that has been paused
        via QMP can be resumed via QMP.
set-speed: Any created, running, paused or ready job can tolerate a
           set-speed request.
complete: Only a ready job may accept a complete request.
Signed-off-by: John Snow <js...@redhat.com>
---
 blockjob.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/blockjob.c b/blockjob.c
index d084a1e318..ea216aca5e 100644
--- a/blockjob.c
+++ b/blockjob.c
@@ -52,6 +52,24 @@ bool 
BlockJobSTT[BLOCK_JOB_STATUS__MAX][BLOCK_JOB_STATUS__MAX] = {
     /* Y: */ [BLOCK_JOB_STATUS_READY]     = {0, 0, 0, 1, 0},
 };
 
+enum BlockJobVerb {
+    BLOCK_JOB_VERB_CANCEL,
+    BLOCK_JOB_VERB_PAUSE,
+    BLOCK_JOB_VERB_RESUME,
+    BLOCK_JOB_VERB_SET_SPEED,
+    BLOCK_JOB_VERB_COMPLETE,
+    BLOCK_JOB_VERB__MAX
+};
+
+bool BlockJobVerb[BLOCK_JOB_VERB__MAX][BLOCK_JOB_STATUS__MAX] = {
+                                          /* U, C, R, P, Y */
+    [BLOCK_JOB_VERB_CANCEL]               = {0, 1, 1, 1, 1},
+    [BLOCK_JOB_VERB_PAUSE]                = {0, 1, 1, 1, 1},
+    [BLOCK_JOB_VERB_RESUME]               = {0, 0, 0, 1, 0},
+    [BLOCK_JOB_VERB_SET_SPEED]            = {0, 1, 1, 1, 1},
+    [BLOCK_JOB_VERB_COMPLETE]             = {0, 0, 0, 0, 1},
+};
+
 static void block_job_state_transition(BlockJob *job, BlockJobStatus s1)
 {
     BlockJobStatus s0 = job->status;
-- 
2.14.3


Reply via email to