• M
    block: Clean up remaining users of "removable" · 2c6942fa
    Markus Armbruster 提交于
    BlockDriverState member removable is a confused mess.  It is true when
    an ide-cd, scsi-cd or floppy qdev is attached, or when the
    BlockDriverState was created with -drive if={floppy,sd} or -drive
    if={ide,scsi,xen,none},media=cdrom ("created removable"), except when
    an ide-hd, scsi-hd, scsi-generic or virtio-blk qdev is attached.
    
    Three users remain:
    
    1. eject_device(), via bdrv_is_removable() uses it to determine
       whether a block device can eject media.
    
    2. bdrv_info() is monitor command "info block".  QMP documentation
       says "true if the device is removable, false otherwise".  From the
       monitor user's point of view, the only sensible interpretation of
       "is removable" is "can eject media with monitor commands eject and
       change".
    
    A block device can eject media unless a device is attached that
    doesn't support it.  Switch the two users over to new
    bdrv_dev_has_removable_media() that returns exactly that.
    
    3. bdrv_getlength() uses to suppress its length cache when media can
       change (see commit 46a4e4e6).  Media change is either monitor
       command change (updates the length cache), monitor command eject
       (doesn't update the length cache, easily fixable), or physical
       media change (invalidates length cache, not so easily fixable).
    
    I'm refraining from improving anything here, because this series is
    long enough already.  Instead, I simply switch it over to
    bdrv_dev_has_removable_media() as well.
    
    This changes the behavior of the length cache and of monitor commands
    eject and change in two cases:
    
    a. drive not created removable, no device attached
    
       The commit makes the drive removable, and defeats the length cache.
    
       Example: -drive if=none
    
    b. drive created removable, but the attached drive is non-removable,
       and doesn't call bdrv_set_removable(..., 0) (most devices don't)
    
       The commit makes the drive non-removable, and enables the length
       cache.
    
       Example: -drive if=xen,media=cdrom -M xenpv
    
       The other non-removable devices that don't call
       bdrv_set_removable() can't currently use a drive created removable,
       either because they aren't qdevified, or because they lack a drive
       property.  Won't stay that way.
    Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
    Signed-off-by: NKevin Wolf <kwolf@redhat.com>
    2c6942fa
block.c 90.7 KB