Commit cd4520ad authored by Gonglei's avatar Gonglei Committed by Andreas Färber
Browse files

qdev: Use NULL instead of local_err for qbus_child unrealize



Forcefully unrealize all children regardless of errors in earlier
iterations (if any). We should keep going with cleanup operation
rather than report an error immediately. Therefore store the first
child unrealization failure and propagate it at the end. We also
forcefully unregister vmsd and unrealize actual object, too.

Signed-off-by: default avatarGonglei <arei.gonglei@huawei.com>
Reviewed-by: default avatarPeter Crosthwaite <peter.crosthwaite@xilinx.com>
Cc: qemu-stable@nongnu.org
Signed-off-by: default avatarAndreas Färber <afaerber@suse.de>
parent d578029e
Loading
Loading
Loading
Loading
+7 −7
Original line number Diff line number Diff line
@@ -871,18 +871,18 @@ static void device_set_realized(Object *obj, bool value, Error **errp)
        }
        dev->pending_deleted_event = false;
    } else if (!value && dev->realized) {
        Error **local_errp = NULL;
        QLIST_FOREACH(bus, &dev->child_bus, sibling) {
            local_errp = local_err ? NULL : &local_err;
            object_property_set_bool(OBJECT(bus), false, "realized",
                                     &local_err);
            if (local_err != NULL) {
                break;
                                     local_errp);
        }
        }
        if (qdev_get_vmsd(dev) && local_err == NULL) {
        if (qdev_get_vmsd(dev)) {
            vmstate_unregister(dev, qdev_get_vmsd(dev), dev);
        }
        if (dc->unrealize && local_err == NULL) {
            dc->unrealize(dev, &local_err);
        if (dc->unrealize) {
            local_errp = local_err ? NULL : &local_err;
            dc->unrealize(dev, local_errp);
        }
        dev->pending_deleted_event = true;
    }