qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Kevin Wolf <kwolf@redhat.com>
To: anthony@codemonkey.ws
Cc: kwolf@redhat.com, qemu-devel@nongnu.org
Subject: [Qemu-devel] [PATCH 5/6] block: Change bdrv_eject() not to drop the image
Date: Tue,  3 Aug 2010 16:44:29 +0200	[thread overview]
Message-ID: <1280846670-27063-6-git-send-email-kwolf@redhat.com> (raw)
In-Reply-To: <1280846670-27063-1-git-send-email-kwolf@redhat.com>

From: Markus Armbruster <armbru@redhat.com>

bdrv_eject() gets called when a device model opens or closes the tray.

If the block driver implements method bdrv_eject(), that method gets
called.  Drivers host_cdrom implements it, and it opens and closes the
physical tray, and nothing else.  When a device model opens, then
closes the tray, media changes only if the user actively changes the
physical media while the tray is open.  This is matches how physical
hardware behaves.

If the block driver doesn't implement method bdrv_eject(), we do
something quite different: opening the tray severs the connection to
the image by calling bdrv_close(), and closing the tray does nothing.
When the device model opens, then closes the tray, media is gone,
unless the user actively inserts another one while the tray is open,
with a suitable change command in the monitor.  This isn't how
physical hardware behaves.  Rather inconvenient when programs
"helpfully" eject media to give you a chance to change it.  The way
bdrv_eject() behaves here turns that chance into a must, which is not
what these programs or their users expect.

Change the default action not to call bdrv_close().  Instead, note the
tray status in new BlockDriverState member tray_open.  Use it in
bdrv_is_inserted().

Arguably, the device models should keep track of tray status
themselves.  But this is less invasive.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
 block.c     |    7 ++++---
 block_int.h |    1 +
 2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/block.c b/block.c
index a12be0b..da70f29 100644
--- a/block.c
+++ b/block.c
@@ -2517,7 +2517,7 @@ int bdrv_is_inserted(BlockDriverState *bs)
     if (!drv)
         return 0;
     if (!drv->bdrv_is_inserted)
-        return 1;
+        return !bs->tray_open;
     ret = drv->bdrv_is_inserted(bs);
     return ret;
 }
@@ -2559,10 +2559,11 @@ int bdrv_eject(BlockDriverState *bs, int eject_flag)
         ret = drv->bdrv_eject(bs, eject_flag);
     }
     if (ret == -ENOTSUP) {
-        if (eject_flag)
-            bdrv_close(bs);
         ret = 0;
     }
+    if (ret >= 0) {
+        bs->tray_open = eject_flag;
+    }
 
     return ret;
 }
diff --git a/block_int.h b/block_int.h
index 7d5e751..b863451 100644
--- a/block_int.h
+++ b/block_int.h
@@ -144,6 +144,7 @@ struct BlockDriverState {
     int open_flags; /* flags used to open the file, re-used for re-open */
     int removable; /* if true, the media can be removed */
     int locked;    /* if true, the media cannot temporarily be ejected */
+    int tray_open; /* if true, the virtual tray is open */
     int encrypted; /* if true, the media is encrypted */
     int valid_key; /* if true, a valid encryption key has been set */
     int sg;        /* if true, the device is a /dev/sg* */
-- 
1.7.2

  parent reply	other threads:[~2010-08-03 14:44 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-08-03 14:44 [Qemu-devel] [PULL 0/6] Block patches Kevin Wolf
2010-08-03 14:44 ` [Qemu-devel] [PATCH 1/6] block: Change bdrv_commit to handle multiple sectors at once Kevin Wolf
2010-08-03 14:44 ` [Qemu-devel] [PATCH 2/6] loadvm: improve tests before bdrv_snapshot_goto() Kevin Wolf
2011-04-14  9:10   ` [Qemu-devel] [BUG] Re: [2/6] " Philipp Hahn
2011-04-14  9:29     ` Kevin Wolf
2011-08-09 22:35       ` [Qemu-devel] [libvirt] " Eric Blake
2010-08-03 14:44 ` [Qemu-devel] [PATCH 3/6] block migration: replace tabs by spaces Kevin Wolf
2010-08-03 14:44 ` [Qemu-devel] [PATCH 4/6] block: Fix bdrv_has_zero_init Kevin Wolf
2010-08-03 14:44 ` Kevin Wolf [this message]
2010-08-03 14:44 ` [Qemu-devel] [PATCH 6/6] ide: Avoid canceling IDE DMA Kevin Wolf
2011-03-18 11:19   ` Christoph Hellwig
2011-03-18 11:34     ` Kevin Wolf
2011-03-18 14:10       ` Christoph Hellwig
2010-08-09 13:41 ` [Qemu-devel] [PULL 0/6] Block patches Anthony Liguori

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=1280846670-27063-6-git-send-email-kwolf@redhat.com \
    --to=kwolf@redhat.com \
    --cc=anthony@codemonkey.ws \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).