• M
    fdc: Reject clash between -drive if=floppy and -global isa-fdc · 6172e067
    Markus Armbruster 提交于
    The floppy controller devices desugar their drive properties into
    floppy devices (since commit a92bd191 "fdc: Move qdev properties to
    FloppyDrive", v2.8.0).  This involves some bad magic in
    fdctrl_connect_drives(), and exists for backward compatibility.
    
    The functions for boards to create floppy controller devices
    fdctrl_init_isa(), fdctrl_init_sysbus(), and sun4m_fdctrl_init()
    desugar -drive if=floppy to these floppy controller drive properties.
    
    If you use both -drive if=floppy (or its -fda / -fdb sugar) and
    -global isa-fdc for the same floppy device, -global silently loses the
    conflict, and both backends involved end up with the floppy device
    frontend attached, as demonstrated by iotest 172 (see commit before
    previous).  This is wrong.
    
    Desugar -drive if=floppy straight to floppy devices instead, with
    helper fdctrl_init_drives().  The conflict now gets rejected cleanly:
    first, fdctrl_connect_drives() creates the floppy for the controller's
    property, then fdctrl_init_drives() attempts to create the floppy for
    -drive if=floppy, but fails because the unit is already in use.
    
    Output of iotest 172 changes in three ways:
    
    1. The clash gets rejected.
    
    2. In one test case, "info qtree" has the floppy devices swapped, and
       "info block" has their QOM paths swapped.  This is because the
       floppy device for -fda now gets created after the one for -global
       isa-fdc.driveB.
    
    3. The error message for -global floppy.drive=floppy0 changes.  Before
       the patch, we set isa-fdc.driveA to -fda's block backend, then
       create the floppy device for it, then move the backend from
       isa-fdc.driveA to floppy.drive.  Floppy creation fails when
       applying -global floppy.drive=floppy0, because floppy0 is still
       attached to isa-fdc.  After the patch, we create the floppy for
       -fda, then set its drive property to floppy0.  Now floppy creation
       succeeds, but setting the drive property fails, because -global
       already set it.  Yes, this is exasperatingly complicated.
    Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
    Message-Id: <20200622094227.1271650-5-armbru@redhat.com>
    6172e067
fdc.c 88.7 KB