• Markus Armbruster's avatar
    blockdev: Refuse to drive_del something added with blockdev-add · 48f364dd
    Markus Armbruster authored
    For some device models, the guest can prevent unplug.  Some users need a
    way to forcibly revoke device model access to the block backend then, so
    the underlying images can be safely used for something else.
    drive_del lets you do that.  Unfortunately, it conflates revoking access
    with destroying the backend.
    Commit 9063f814 made drive_del immediately destroy the root BDS.  Nice:
    the device name becomes available for reuse immediately.  Not so nice:
    the device model's pointer to the root BDS dangles, and we're prone to
    crash when the memory gets reused.
    Commit d22b2f41 fixed that by hiding the root BDS instead of destroying
    it.  Destruction only happens on unplug.  "Hiding" means removing it
    from bdrv_states and graph_bdrv_states; see bdrv_make_anon().
    This "destroy on revoke" is a misfeature we don't want to carry
    forward to blockdev-add, just like "destroy on unplug" (commit
    2d246f01).  So make drive_del fail on anything added with blockdev-add.
    We'll add separate QMP commands to revoke device model access and to
    destroy backends.
    Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
    Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
blockdev.c 77.4 KB