From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:60414) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZpeVl-0001xD-R2 for qemu-devel@nongnu.org; Fri, 23 Oct 2015 11:44:11 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZpeVk-0005aa-J9 for qemu-devel@nongnu.org; Fri, 23 Oct 2015 11:44:09 -0400 Date: Fri, 23 Oct 2015 17:44:00 +0200 From: Kevin Wolf Message-ID: <20151023154400.GN3797@noname.redhat.com> References: <1445270025-22999-1-git-send-email-mreitz@redhat.com> <1445270025-22999-29-git-send-email-mreitz@redhat.com> <20151023132644.GC3797@noname.redhat.com> <562A437A.1040709@redhat.com> <20151023144512.GL3797@noname.redhat.com> <562A516B.5030302@redhat.com> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="PHCdUe6m4AxPMzOu" Content-Disposition: inline In-Reply-To: <562A516B.5030302@redhat.com> Subject: Re: [Qemu-devel] [PATCH v7 28/39] blockdev: Add blockdev-open-tray List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Max Reitz Cc: Alberto Garcia , qemu-block@nongnu.org, John Snow , qemu-devel@nongnu.org, Markus Armbruster , Stefan Hajnoczi --PHCdUe6m4AxPMzOu Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Am 23.10.2015 um 17:25 hat Max Reitz geschrieben: > On 23.10.2015 16:45, Kevin Wolf wrote: > > Am 23.10.2015 um 16:26 hat Max Reitz geschrieben: > >> On 23.10.2015 15:26, Kevin Wolf wrote: > >>> Am 19.10.2015 um 17:53 hat Max Reitz geschrieben: > >>>> Signed-off-by: Max Reitz > >>>> --- > >>>> blockdev.c | 49 +++++++++++++++++++++++++++++++++++++++++= ++++++++ > >>>> qapi/block-core.json | 23 +++++++++++++++++++++++ > >>>> qmp-commands.hx | 39 +++++++++++++++++++++++++++++++++++++++ > >>>> 3 files changed, 111 insertions(+) > >>> > >>>> + bs =3D blk_bs(blk); > >>>> + if (bs) { > >>>> + aio_context =3D bdrv_get_aio_context(bs); > >>>> + aio_context_acquire(aio_context); > >>>> + > >>>> + if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_EJECT, errp)) { > >>>> + goto out; > >>>> + } > >>> > >>> Is this blocker really for protecting against opening the tray? I thi= nk > >>> the BDS shouldn't care about whether the guest can access it. So it's > >>> probably more about preventing a bdrv_close() from happening, i.e. it > >>> would be relevant only for the blockdev-remove-medium command. > >> > >> I don't think so. I intended blockdev-open-tray to be what it is for > >> real hardware: Opening the tray severs all the links between the medium > >> and software trying to access the drive. blockdev-remove-medium should > >> never fail if the tray is already open, since it would never fail in > >> real life. > >=20 > > Comparison with real hardware works only so far. Real hardware doesn't > > have block jobs and will therefore never set the eject blocker. >=20 > It does have software accessing the disk and will therefore lock the tray. That's an entirely different matter and checked by the blk_dev_is_medium_locked() call below. > > As I said, though, it's mostly protecting against bdrv_close(). Now that > > we don't call that any more, we don't strictly need the blocker any > > more in order to keep block jobs happy. > >=20 > > However, we still need to prevent that the connection between BB and BDS > > is severed in case the old BDS was created implicitly and therefore > > would disappear from query-block while the image is still open and in > > use, which we don't want. This touches blockdev-del land more than op > > blockers, though... I think the eject op blocker can go. >=20 > OK, so the thing is that block jobs don't use the BB but generally > access the BDS directly. Therefore, they don't care whether the BDS is > still accessible from some guest device/BB. >=20 > I'm fine with removing the eject op blocker, but I think you'll > understand if I'd rather not make it part of this series. Fine with me. > > With your check, you prevent the user from opening the tray using QMP > > and then they can't get into a bad state with blockdev-remove-medium > > because without an opened tray that would fail. However, they could > > still eject the medium from within the guest and then use > > blockdev-remove-medium, which will get them in the bad state that we > > wanted to prevent. >=20 > Well, the logical conclusion from this and the above simply is "remove > that op blocker". The block job shouldn't care about some guest device > behind some BB opening its tray; so consequently it shouldn't care about > the BDS being removed from that BB either. Yes, the block job shouldn't care. As I said above, though, there's an another principle at danger: That the monitor reference is always the last one that is dropped, so that all open image files have a corresponding query-block entry. > Oh, but there is a case where the block job should care: If you've > specified the name of that BB when creating the block job. To me, that > implies that the job should run through that BB and the related guest > device may not open its tray. I'm not sure about that. I think in most cases the BB name is just used as an alias for its root node. And of course, it has nothing to do with the guest device tray. A block job can go through the BB even though the guest tray is open. The tray isn't a BB concept, but a device emulation one. > Anyway, that's definitely outside of this series's realm. I guess I'll > move the check to qmp_blockdev_remove_medium(), as you suggested. That should solve the problems. > >> By the way, that's the reason why I generally preferred > >> blk_is_available() over blk_is_inserted() in this series. > >=20 > > I actually think this use is too restrictive in many cases (and in this > > patch opening the tray is pointlessly forbidden), but I didn't comment > > on it because we can fix it whenever someone needs more. >=20 > My opinion still is that if you're accessing a BDS tree through a BB > which is attached to a guest device, you should assume the guest > device's view on the BDS tree, that is, if the device's tray is open, > you won't get any data. Currently the check whether the tray is open is done in the device code, not in the BB. In the few cases where the BB needs to know the tray status, it needs to call into the device. And well, in theory I would very much prefer if the (qemu) user didn't create BBs manually, but they would just be created and deleted as part of the (BB) user (i.e. the guest device in this case). But I'm doubtful if such a change can be implemented compatibly. Kevin --PHCdUe6m4AxPMzOu Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQIcBAEBAgAGBQJWKlXAAAoJEH8JsnLIjy/WJdkP/3JXT67imHnvKGDqImz/11dH pAoDvXUMAjJn+gsDUA2fzyCUQeJ/jPwEi74EW0ethGO0413W6sXH1IhrDS/53rMG obRkU8BYOLRrqpGm+WPBJIXTLYxJ2fqpwNp75h5y32p4YFbq+LZmPXmyYiy2DCWS rFAqvKcocEllYCsrMuND4fA4YmC8+5QNvrwGUypReHzhaFuYxFfhGrdNmFnQIqQO yr5Qnkp/UObF741s92jhwUZr2GPixlXv7XKjszcbjiSgVCFmju6O9c4dkG1gIMcI R10eirLjFKpW2zC4aVSL15EnT4nRpx9fwE6clRHMwxNxSQfPyfBFE9PVPR/6MfVT 5ooUzqe0VanO39QGFz0iqPNgsYrWXFRIgASl0OhlSYYO8+aGZCgb2xe33k4Bsm3r QkJxDmxewwuicjScakVObGzaYxlADx6fY700mCamuITZFP73BNNR8f543/3geW0R h6Mx+GjES8XKTf9OZpuxeQFVEAqiZb78OAG/0SwBOyNuHJmcLWgvqcPJFwDY4Wp0 XBx1htV+BGkUm75/mh4y2b5IwjIFGzzTUM5bhzU8k1ELYPJQQ3zYz4C54yHmWE8w buGNIlBwhMdpBu3yRJso4Y1HBlTa+nUsAD1xtuDVTTthu+B1p/wAQaBcIMTHS0Rk YC1gIcXVN/quLpivFPDB =I1l+ -----END PGP SIGNATURE----- --PHCdUe6m4AxPMzOu--