diff mbox

[7/8] QMP: query-status: Add 'io-status' key

Message ID 1309889871-6267-8-git-send-email-lcapitulino@redhat.com
State New
Headers show

Commit Message

Luiz Capitulino July 5, 2011, 6:17 p.m. UTC
Contains the last I/O status for the given device. Currently this is
only supported by ide, scsi and virtio block devices.

Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
---
 block.c         |   15 ++++++++++++++-
 block.h         |    2 +-
 qmp-commands.hx |    6 ++++++
 3 files changed, 21 insertions(+), 2 deletions(-)

Comments

Markus Armbruster July 12, 2011, 7:47 a.m. UTC | #1
Luiz Capitulino <lcapitulino@redhat.com> writes:

> Contains the last I/O status for the given device. Currently this is
> only supported by ide, scsi and virtio block devices.
>
> Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
> ---
>  block.c         |   15 ++++++++++++++-
>  block.h         |    2 +-
>  qmp-commands.hx |    6 ++++++
>  3 files changed, 21 insertions(+), 2 deletions(-)
>
> diff --git a/block.c b/block.c
> index cc0a34e..28df3d8 100644
> --- a/block.c
> +++ b/block.c
> @@ -1720,6 +1720,12 @@ void bdrv_info_print(Monitor *mon, const QObject *data)
>      qlist_iter(qobject_to_qlist(data), bdrv_print_dict, mon);
>  }
>  
> +static const char *const io_status_name[BDRV_IOS_MAX] = {
> +    [BDRV_IOS_OK] = "ok",
> +    [BDRV_IOS_FAILED] = "failed",
> +    [BDRV_IOS_ENOSPC] = "nospace",
> +};
> +
>  void bdrv_info(Monitor *mon, QObject **ret_data)
>  {
>      QList *bs_list;
> @@ -1729,15 +1735,16 @@ void bdrv_info(Monitor *mon, QObject **ret_data)
>  
>      QTAILQ_FOREACH(bs, &bdrv_states, list) {
>          QObject *bs_obj;
> +        QDict *bs_dict;
>  
>          bs_obj = qobject_from_jsonf("{ 'device': %s, 'type': 'unknown', "
>                                      "'removable': %i, 'locked': %i }",
>                                      bs->device_name, bs->removable,
>                                      bs->locked);
> +        bs_dict = qobject_to_qdict(bs_obj);
>  
>          if (bs->drv) {
>              QObject *obj;
> -            QDict *bs_dict = qobject_to_qdict(bs_obj);
>  
>              obj = qobject_from_jsonf("{ 'file': %s, 'ro': %i, 'drv': %s, "
>                                       "'encrypted': %i }",
> @@ -1752,6 +1759,12 @@ void bdrv_info(Monitor *mon, QObject **ret_data)
>  
>              qdict_put_obj(bs_dict, "inserted", obj);
>          }
> +
> +        if (bs->iostatus_enabled) {
> +            qdict_put(bs_dict, "io-status",
> +                      qstring_from_str(io_status_name[bs->iostatus]));
> +        }
> +
>          qlist_append_obj(bs_list, bs_obj);
>      }
>  
> diff --git a/block.h b/block.h
> index 0dca1bb..0141fe6 100644
> --- a/block.h
> +++ b/block.h
> @@ -51,7 +51,7 @@ typedef enum {
>  } BlockMonEventAction;
>  
>  typedef enum {
> -    BDRV_IOS_OK, BDRV_IOS_FAILED, BDRV_IOS_ENOSPC
> +    BDRV_IOS_OK, BDRV_IOS_FAILED, BDRV_IOS_ENOSPC, BDRV_IOS_MAX
>  } BlockIOStatus;
>  
>  void bdrv_iostatus_update(BlockDriverState *bs, int error);
> diff --git a/qmp-commands.hx b/qmp-commands.hx
> index 6b8eb0a..1746b6d 100644
> --- a/qmp-commands.hx
> +++ b/qmp-commands.hx
> @@ -1082,6 +1082,9 @@ Each json-object contain the following:
>                                  "tftp", "vdi", "vmdk", "vpc", "vvfat"
>           - "backing_file": backing file name (json-string, optional)
>           - "encrypted": true if encrypted, false otherwise (json-bool)
> +- "io-status": last executed I/O operation status, only present if the device
> +               supports it (json_string, optional)
> +             - Possible values: "ok", "failed", "nospace"
>  
>  Example:
>  
> @@ -1089,6 +1092,7 @@ Example:
>  <- {
>        "return":[
>           {
> +            "io-status": "ok",
>              "device":"ide0-hd0",
>              "locked":false,
>              "removable":false,
> @@ -1101,12 +1105,14 @@ Example:
>              "type":"unknown"
>           },
>           {
> +            "io-status": "ok",
>              "device":"ide1-cd0",
>              "locked":false,
>              "removable":true,
>              "type":"unknown"
>           },
>           {
> +            "io-status": "ok",
>              "device":"floppy0",
>              "locked":false,
>              "removable":true,

floppy doesn't support I/O status, yet the example shows "io-status":
"ok".  Are you sure it's correct?
Luiz Capitulino July 12, 2011, 2:56 p.m. UTC | #2
On Tue, 12 Jul 2011 09:47:19 +0200
Markus Armbruster <armbru@redhat.com> wrote:

> Luiz Capitulino <lcapitulino@redhat.com> writes:
> 
> > Contains the last I/O status for the given device. Currently this is
> > only supported by ide, scsi and virtio block devices.
> >
> > Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
> > ---
> >  block.c         |   15 ++++++++++++++-
> >  block.h         |    2 +-
> >  qmp-commands.hx |    6 ++++++
> >  3 files changed, 21 insertions(+), 2 deletions(-)
> >
> > diff --git a/block.c b/block.c
> > index cc0a34e..28df3d8 100644
> > --- a/block.c
> > +++ b/block.c
> > @@ -1720,6 +1720,12 @@ void bdrv_info_print(Monitor *mon, const QObject *data)
> >      qlist_iter(qobject_to_qlist(data), bdrv_print_dict, mon);
> >  }
> >  
> > +static const char *const io_status_name[BDRV_IOS_MAX] = {
> > +    [BDRV_IOS_OK] = "ok",
> > +    [BDRV_IOS_FAILED] = "failed",
> > +    [BDRV_IOS_ENOSPC] = "nospace",
> > +};
> > +
> >  void bdrv_info(Monitor *mon, QObject **ret_data)
> >  {
> >      QList *bs_list;
> > @@ -1729,15 +1735,16 @@ void bdrv_info(Monitor *mon, QObject **ret_data)
> >  
> >      QTAILQ_FOREACH(bs, &bdrv_states, list) {
> >          QObject *bs_obj;
> > +        QDict *bs_dict;
> >  
> >          bs_obj = qobject_from_jsonf("{ 'device': %s, 'type': 'unknown', "
> >                                      "'removable': %i, 'locked': %i }",
> >                                      bs->device_name, bs->removable,
> >                                      bs->locked);
> > +        bs_dict = qobject_to_qdict(bs_obj);
> >  
> >          if (bs->drv) {
> >              QObject *obj;
> > -            QDict *bs_dict = qobject_to_qdict(bs_obj);
> >  
> >              obj = qobject_from_jsonf("{ 'file': %s, 'ro': %i, 'drv': %s, "
> >                                       "'encrypted': %i }",
> > @@ -1752,6 +1759,12 @@ void bdrv_info(Monitor *mon, QObject **ret_data)
> >  
> >              qdict_put_obj(bs_dict, "inserted", obj);
> >          }
> > +
> > +        if (bs->iostatus_enabled) {
> > +            qdict_put(bs_dict, "io-status",
> > +                      qstring_from_str(io_status_name[bs->iostatus]));
> > +        }
> > +
> >          qlist_append_obj(bs_list, bs_obj);
> >      }
> >  
> > diff --git a/block.h b/block.h
> > index 0dca1bb..0141fe6 100644
> > --- a/block.h
> > +++ b/block.h
> > @@ -51,7 +51,7 @@ typedef enum {
> >  } BlockMonEventAction;
> >  
> >  typedef enum {
> > -    BDRV_IOS_OK, BDRV_IOS_FAILED, BDRV_IOS_ENOSPC
> > +    BDRV_IOS_OK, BDRV_IOS_FAILED, BDRV_IOS_ENOSPC, BDRV_IOS_MAX
> >  } BlockIOStatus;
> >  
> >  void bdrv_iostatus_update(BlockDriverState *bs, int error);
> > diff --git a/qmp-commands.hx b/qmp-commands.hx
> > index 6b8eb0a..1746b6d 100644
> > --- a/qmp-commands.hx
> > +++ b/qmp-commands.hx
> > @@ -1082,6 +1082,9 @@ Each json-object contain the following:
> >                                  "tftp", "vdi", "vmdk", "vpc", "vvfat"
> >           - "backing_file": backing file name (json-string, optional)
> >           - "encrypted": true if encrypted, false otherwise (json-bool)
> > +- "io-status": last executed I/O operation status, only present if the device
> > +               supports it (json_string, optional)
> > +             - Possible values: "ok", "failed", "nospace"
> >  
> >  Example:
> >  
> > @@ -1089,6 +1092,7 @@ Example:
> >  <- {
> >        "return":[
> >           {
> > +            "io-status": "ok",
> >              "device":"ide0-hd0",
> >              "locked":false,
> >              "removable":false,
> > @@ -1101,12 +1105,14 @@ Example:
> >              "type":"unknown"
> >           },
> >           {
> > +            "io-status": "ok",
> >              "device":"ide1-cd0",
> >              "locked":false,
> >              "removable":true,
> >              "type":"unknown"
> >           },
> >           {
> > +            "io-status": "ok",
> >              "device":"floppy0",
> >              "locked":false,
> >              "removable":true,
> 
> floppy doesn't support I/O status, yet the example shows "io-status":
> "ok".  Are you sure it's correct?

Good catch, I did this by hand :-)
diff mbox

Patch

diff --git a/block.c b/block.c
index cc0a34e..28df3d8 100644
--- a/block.c
+++ b/block.c
@@ -1720,6 +1720,12 @@  void bdrv_info_print(Monitor *mon, const QObject *data)
     qlist_iter(qobject_to_qlist(data), bdrv_print_dict, mon);
 }
 
+static const char *const io_status_name[BDRV_IOS_MAX] = {
+    [BDRV_IOS_OK] = "ok",
+    [BDRV_IOS_FAILED] = "failed",
+    [BDRV_IOS_ENOSPC] = "nospace",
+};
+
 void bdrv_info(Monitor *mon, QObject **ret_data)
 {
     QList *bs_list;
@@ -1729,15 +1735,16 @@  void bdrv_info(Monitor *mon, QObject **ret_data)
 
     QTAILQ_FOREACH(bs, &bdrv_states, list) {
         QObject *bs_obj;
+        QDict *bs_dict;
 
         bs_obj = qobject_from_jsonf("{ 'device': %s, 'type': 'unknown', "
                                     "'removable': %i, 'locked': %i }",
                                     bs->device_name, bs->removable,
                                     bs->locked);
+        bs_dict = qobject_to_qdict(bs_obj);
 
         if (bs->drv) {
             QObject *obj;
-            QDict *bs_dict = qobject_to_qdict(bs_obj);
 
             obj = qobject_from_jsonf("{ 'file': %s, 'ro': %i, 'drv': %s, "
                                      "'encrypted': %i }",
@@ -1752,6 +1759,12 @@  void bdrv_info(Monitor *mon, QObject **ret_data)
 
             qdict_put_obj(bs_dict, "inserted", obj);
         }
+
+        if (bs->iostatus_enabled) {
+            qdict_put(bs_dict, "io-status",
+                      qstring_from_str(io_status_name[bs->iostatus]));
+        }
+
         qlist_append_obj(bs_list, bs_obj);
     }
 
diff --git a/block.h b/block.h
index 0dca1bb..0141fe6 100644
--- a/block.h
+++ b/block.h
@@ -51,7 +51,7 @@  typedef enum {
 } BlockMonEventAction;
 
 typedef enum {
-    BDRV_IOS_OK, BDRV_IOS_FAILED, BDRV_IOS_ENOSPC
+    BDRV_IOS_OK, BDRV_IOS_FAILED, BDRV_IOS_ENOSPC, BDRV_IOS_MAX
 } BlockIOStatus;
 
 void bdrv_iostatus_update(BlockDriverState *bs, int error);
diff --git a/qmp-commands.hx b/qmp-commands.hx
index 6b8eb0a..1746b6d 100644
--- a/qmp-commands.hx
+++ b/qmp-commands.hx
@@ -1082,6 +1082,9 @@  Each json-object contain the following:
                                 "tftp", "vdi", "vmdk", "vpc", "vvfat"
          - "backing_file": backing file name (json-string, optional)
          - "encrypted": true if encrypted, false otherwise (json-bool)
+- "io-status": last executed I/O operation status, only present if the device
+               supports it (json_string, optional)
+             - Possible values: "ok", "failed", "nospace"
 
 Example:
 
@@ -1089,6 +1092,7 @@  Example:
 <- {
       "return":[
          {
+            "io-status": "ok",
             "device":"ide0-hd0",
             "locked":false,
             "removable":false,
@@ -1101,12 +1105,14 @@  Example:
             "type":"unknown"
          },
          {
+            "io-status": "ok",
             "device":"ide1-cd0",
             "locked":false,
             "removable":true,
             "type":"unknown"
          },
          {
+            "io-status": "ok",
             "device":"floppy0",
             "locked":false,
             "removable":true,