All of lore.kernel.org
 help / color / mirror / Atom feed
From: Luiz Capitulino <lcapitulino@redhat.com>
To: qemu-devel@nongnu.org
Cc: kwolf@redhat.com, aliguori@us.ibm.com, armbru@redhat.com
Subject: [Qemu-devel] [PATCH 1/6] block: Keep track of devices' I/O status
Date: Thu,  1 Sep 2011 15:37:50 -0300	[thread overview]
Message-ID: <1314902275-5240-2-git-send-email-lcapitulino@redhat.com> (raw)
In-Reply-To: <1314902275-5240-1-git-send-email-lcapitulino@redhat.com>

This commit adds support to the BlockDriverState type to keep track
of the devices' I/O status.

There are three possible status: BDRV_IOS_OK (no error so far),
BDRV_IOS_ENOSPC (no space error) and BDRV_IOS_FAILED (any other error).
The distinction between no space and other errors is important because
a management application may want to watch for no space in order to
extend the host's underline device and put the VM to run again.

Qemu devices supporting the I/O status feature have to enable it
explicitly by calling bdrv_iostatus_enable() _and_ have to be
configured to stop the VM on errors (ie. werror=stop|enospc or
rerror=stop).

In case of multiple errors being triggered in sequence only the first
one is stored. The I/O status is set back to BDRV_IOS_OK when the
'cont' command is issued.

Next commits will add support to some devices and extend the
query-block/info block commands with the I/O status information.

Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
---
 block.c     |   32 ++++++++++++++++++++++++++++++++
 block.h     |    9 +++++++++
 block_int.h |    1 +
 monitor.c   |    6 ++++++
 4 files changed, 48 insertions(+), 0 deletions(-)

diff --git a/block.c b/block.c
index 03a21d8..c54caf2 100644
--- a/block.c
+++ b/block.c
@@ -220,6 +220,7 @@ BlockDriverState *bdrv_new(const char *device_name)
     if (device_name[0] != '\0') {
         QTAILQ_INSERT_TAIL(&bdrv_states, bs, list);
     }
+    bs->iostatus = BDRV_IOS_INVAL;
     return bs;
 }
 
@@ -3165,6 +3166,37 @@ int bdrv_in_use(BlockDriverState *bs)
     return bs->in_use;
 }
 
+void bdrv_iostatus_enable(BlockDriverState *bs)
+{
+    assert(bs->iostatus == BDRV_IOS_INVAL);
+    bs->iostatus = BDRV_IOS_OK;
+}
+
+/* The I/O status is only enabled if the drive explicitly
+ * enables it _and_ the VM is configured to stop on errors */
+bool bdrv_iostatus_is_enabled(const BlockDriverState *bs)
+{
+    return (bs->iostatus != BDRV_IOS_INVAL &&
+           (bs->on_write_error == BLOCK_ERR_STOP_ENOSPC ||
+            bs->on_write_error == BLOCK_ERR_STOP_ANY    ||
+            bs->on_read_error == BLOCK_ERR_STOP_ANY));
+}
+
+void bdrv_iostatus_reset(BlockDriverState *bs)
+{
+    if (bdrv_iostatus_is_enabled(bs)) {
+        bs->iostatus = BDRV_IOS_OK;
+    }
+}
+
+void bdrv_iostatus_update(BlockDriverState *bs, int error)
+{
+    if (bdrv_iostatus_is_enabled(bs) && bs->iostatus == BDRV_IOS_OK) {
+        bs->iostatus = (abs(error) == ENOSPC) ? BDRV_IOS_ENOSPC :
+                                                BDRV_IOS_FAILED;
+    }
+}
+
 void
 bdrv_acct_start(BlockDriverState *bs, BlockAcctCookie *cookie, int64_t bytes,
         enum BlockAcctType type)
diff --git a/block.h b/block.h
index 3ac0b94..24914e0 100644
--- a/block.h
+++ b/block.h
@@ -51,6 +51,15 @@ typedef enum {
     BDRV_ACTION_REPORT, BDRV_ACTION_IGNORE, BDRV_ACTION_STOP
 } BlockMonEventAction;
 
+typedef enum {
+    BDRV_IOS_INVAL, BDRV_IOS_OK, BDRV_IOS_FAILED, BDRV_IOS_ENOSPC,
+    BDRV_IOS_MAX
+} BlockIOStatus;
+
+void bdrv_iostatus_enable(BlockDriverState *bs);
+void bdrv_iostatus_reset(BlockDriverState *bs);
+bool bdrv_iostatus_is_enabled(const BlockDriverState *bs);
+void bdrv_iostatus_update(BlockDriverState *bs, int error);
 void bdrv_mon_event(const BlockDriverState *bdrv,
                     BlockMonEventAction action, int is_read);
 void bdrv_info_print(Monitor *mon, const QObject *data);
diff --git a/block_int.h b/block_int.h
index 8a72b80..600801d 100644
--- a/block_int.h
+++ b/block_int.h
@@ -203,6 +203,7 @@ struct BlockDriverState {
        drivers. They are not used by the block driver */
     int cyls, heads, secs, translation;
     BlockErrorAction on_read_error, on_write_error;
+    BlockIOStatus iostatus;
     char device_name[32];
     unsigned long *dirty_bitmap;
     int64_t dirty_count;
diff --git a/monitor.c b/monitor.c
index 9807005..69f1b3c 100644
--- a/monitor.c
+++ b/monitor.c
@@ -1302,6 +1302,11 @@ struct bdrv_iterate_context {
     int err;
 };
 
+static void iostatus_bdrv_it(void *opaque, BlockDriverState *bs)
+{
+    bdrv_iostatus_reset(bs);
+}
+
 /**
  * do_cont(): Resume emulation.
  */
@@ -1318,6 +1323,7 @@ static int do_cont(Monitor *mon, const QDict *qdict, QObject **ret_data)
         return -1;
     }
 
+    bdrv_iterate(iostatus_bdrv_it, NULL);
     bdrv_iterate(encrypted_bdrv_it, &context);
     /* only resume the vm if all keys are set and valid */
     if (!context.err) {
-- 
1.7.7.rc0.72.g4b5ea

  reply	other threads:[~2011-09-01 18:38 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-09-01 18:37 [Qemu-devel] [PATCH v1 0/6]: block: Add I/O status support Luiz Capitulino
2011-09-01 18:37 ` Luiz Capitulino [this message]
2011-09-01 18:37 ` [Qemu-devel] [PATCH 2/6] virtio: Support I/O status Luiz Capitulino
2011-09-01 18:37 ` [Qemu-devel] [PATCH 3/6] ide: " Luiz Capitulino
2011-09-01 18:37 ` [Qemu-devel] [PATCH 4/6] scsi: " Luiz Capitulino
2011-09-01 18:37 ` [Qemu-devel] [PATCH 5/6] QMP: query-status: Add 'io-status' key Luiz Capitulino
2011-09-01 18:37 ` [Qemu-devel] [PATCH 6/6] HMP: Print 'io-status' information Luiz Capitulino
2011-09-09 13:07 ` [Qemu-devel] [PATCH v1 0/6]: block: Add I/O status support Luiz Capitulino
2011-09-19 13:40 ` Kevin Wolf
2011-09-19 14:09   ` Luiz Capitulino
2011-09-19 14:29     ` Kevin Wolf
2011-09-23  8:55       ` Markus Armbruster
2011-09-23  9:29         ` Kevin Wolf
2011-09-23 10:13           ` Markus Armbruster
2011-09-23 13:48         ` Luiz Capitulino
2011-09-23 14:05           ` Markus Armbruster
2011-09-22 18:19 [Qemu-devel] [PATCH v2 " Luiz Capitulino
2011-09-22 18:19 ` [Qemu-devel] [PATCH 1/6] block: Keep track of devices' I/O status Luiz Capitulino
2011-09-23  7:06   ` Zhi Yong Wu
2011-09-23  7:51   ` Markus Armbruster
2011-09-23  7:53     ` Markus Armbruster
2011-09-23 14:01     ` Luiz Capitulino
2011-09-23 15:36       ` Markus Armbruster
2011-09-23 19:41         ` Luiz Capitulino
2011-09-26  9:34           ` Markus Armbruster
2011-09-26 12:49             ` Luiz Capitulino
2011-09-26 13:41               ` Markus Armbruster
2011-09-26 20:43 [Qemu-devel] [PATCH v3 0/6]: block: Add I/O status support Luiz Capitulino
2011-09-26 20:43 ` [Qemu-devel] [PATCH 1/6] block: Keep track of devices' I/O status Luiz Capitulino

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1314902275-5240-2-git-send-email-lcapitulino@redhat.com \
    --to=lcapitulino@redhat.com \
    --cc=aliguori@us.ibm.com \
    --cc=armbru@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.