diff options
| author | Peter Maydell <peter.maydell@linaro.org> | 2020-11-02 16:05:47 +0000 |
|---|---|---|
| committer | Peter Maydell <peter.maydell@linaro.org> | 2020-11-02 16:05:47 +0000 |
| commit | b139d11ae198aba0e009daddf7a3370ce84b2d09 (patch) | |
| tree | 869b60a90606eb24c3d46ae700ba940c6fea18d8 /hw | |
| parent | b149dea55cce97cb226683d06af61984a1c11e96 (diff) | |
| parent | 045b1d4dbb44da67f1f86efa75b02843c0e951ef (diff) | |
| download | focaccia-qemu-b139d11ae198aba0e009daddf7a3370ce84b2d09.tar.gz focaccia-qemu-b139d11ae198aba0e009daddf7a3370ce84b2d09.zip | |
Merge remote-tracking branch 'remotes/aperard/tags/pull-xen-20201102' into staging
xen patch - Rework Xen disk unplug to work with newer command line options. # gpg: Signature made Mon 02 Nov 2020 14:42:37 GMT # gpg: using RSA key F80C006308E22CFD8A92E7980CF5572FD7FB55AF # gpg: issuer "anthony.perard@citrix.com" # gpg: Good signature from "Anthony PERARD <anthony.perard@gmail.com>" [marginal] # gpg: aka "Anthony PERARD <anthony.perard@citrix.com>" [marginal] # gpg: WARNING: This key is not certified with sufficiently trusted signatures! # gpg: It is not certain that the signature belongs to the owner. # Primary key fingerprint: 5379 2F71 024C 600F 778A 7161 D8D5 7199 DF83 42C8 # Subkey fingerprint: F80C 0063 08E2 2CFD 8A92 E798 0CF5 572F D7FB 55AF * remotes/aperard/tags/pull-xen-20201102: xen: rework pci_piix3_xen_ide_unplug Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'hw')
| -rw-r--r-- | hw/ide/piix.c | 27 |
1 files changed, 13 insertions, 14 deletions
diff --git a/hw/ide/piix.c b/hw/ide/piix.c index b402a93636..b9860e35a5 100644 --- a/hw/ide/piix.c +++ b/hw/ide/piix.c @@ -164,30 +164,29 @@ static void pci_piix_ide_realize(PCIDevice *dev, Error **errp) int pci_piix3_xen_ide_unplug(DeviceState *dev, bool aux) { PCIIDEState *pci_ide; - DriveInfo *di; int i; IDEDevice *idedev; + IDEBus *idebus; + BlockBackend *blk; pci_ide = PCI_IDE(dev); for (i = aux ? 1 : 0; i < 4; i++) { - di = drive_get_by_index(IF_IDE, i); - if (di != NULL && !di->media_cd) { - BlockBackend *blk = blk_by_legacy_dinfo(di); - DeviceState *ds = blk_get_attached_dev(blk); + idebus = &pci_ide->bus[i / 2]; + blk = idebus->ifs[i % 2].blk; - blk_drain(blk); - blk_flush(blk); - - if (ds) { - blk_detach_dev(blk, ds); - } - pci_ide->bus[di->bus].ifs[di->unit].blk = NULL; + if (blk && idebus->ifs[i % 2].drive_kind != IDE_CD) { if (!(i % 2)) { - idedev = pci_ide->bus[di->bus].master; + idedev = idebus->master; } else { - idedev = pci_ide->bus[di->bus].slave; + idedev = idebus->slave; } + + blk_drain(blk); + blk_flush(blk); + + blk_detach_dev(blk, DEVICE(idedev)); + idebus->ifs[i % 2].blk = NULL; idedev->conf.blk = NULL; monitor_remove_blk(blk); blk_unref(blk); |