Commit 9b3d111a authored by Markus Armbruster's avatar Markus Armbruster Committed by Paolo Bonzini
Browse files

hw: Propagate errors through qdev_prop_set_drive()



Three kinds of callers:

1. On failure, report the error and abort

   Passing &error_abort does the job.  No functional change.

2. On failure, report the error and exit()

   This is qdev_prop_set_drive_nofail().  Error reporting moves from
   qdev_prop_set_drive() to its caller.  Because hiding away the error
   in the monitor right before exit() isn't helpful, replace
   qerror_report_err() by error_report_err().  Shouldn't make a
   difference, because qdev_prop_set_drive_nofail() should never be
   used in QMP context.

3. On failure, report the error and recover

   This is usb_msd_init() and scsi_bus_legacy_add_drive().  Error
   reporting and freeing the error object moves from
   qdev_prop_set_drive() to its callers.

   Because usb_msd_init() can't run in QMP context, replace
   qerror_report_err() by error_report_err() there.

   No functional change.

   scsi_bus_legacy_add_drive() calling qerror_report_err() is of
   course inappropriate, but this commit merely makes it more obvious.
   The next one will clean it up.

Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
Reviewed-by: default avatarPeter Crosthwaite <peter.crosthwaite@xilinx.com>
Message-Id: <1425925048-15482-3-git-send-email-armbru@redhat.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent fa617181
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -515,9 +515,9 @@ static pflash_t *ve_pflash_cfi01_register(hwaddr base, const char *name,
{
    DeviceState *dev = qdev_create(NULL, "cfi.pflash01");

    if (di && qdev_prop_set_drive(dev, "drive",
                                  blk_by_legacy_dinfo(di))) {
        abort();
    if (di) {
        qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(di),
                            &error_abort);
    }

    qdev_prop_set_uint32(dev, "num-blocks",
+3 −3
Original line number Diff line number Diff line
@@ -522,9 +522,9 @@ static void create_one_flash(const char *name, hwaddr flashbase,
    DeviceState *dev = qdev_create(NULL, "cfi.pflash01");
    const uint64_t sectorlength = 256 * 1024;

    if (dinfo && qdev_prop_set_drive(dev, "drive",
                                     blk_by_legacy_dinfo(dinfo))) {
        abort();
    if (dinfo) {
        qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo),
                            &error_abort);
    }

    qdev_prop_set_uint32(dev, "num-blocks", flashsize / sectorlength);
+2 −2
Original line number Diff line number Diff line
@@ -969,8 +969,8 @@ pflash_t *pflash_cfi01_register(hwaddr base,
{
    DeviceState *dev = qdev_create(NULL, TYPE_CFI_PFLASH01);

    if (blk && qdev_prop_set_drive(dev, "drive", blk)) {
        abort();
    if (blk) {
        qdev_prop_set_drive(dev, "drive", blk, &error_abort);
    }
    qdev_prop_set_uint32(dev, "num-blocks", nb_blocs);
    qdev_prop_set_uint64(dev, "sector-length", sector_len);
+2 −2
Original line number Diff line number Diff line
@@ -773,8 +773,8 @@ pflash_t *pflash_cfi02_register(hwaddr base,
{
    DeviceState *dev = qdev_create(NULL, TYPE_CFI_PFLASH02);

    if (blk && qdev_prop_set_drive(dev, "drive", blk)) {
        abort();
    if (blk) {
        qdev_prop_set_drive(dev, "drive", blk, &error_abort);
    }
    qdev_prop_set_uint32(dev, "num-blocks", nb_blocs);
    qdev_prop_set_uint32(dev, "sector-length", sector_len);
+10 −12
Original line number Diff line number Diff line
@@ -341,27 +341,25 @@ PropertyInfo qdev_prop_vlan = {
    .set   = set_vlan,
};

int qdev_prop_set_drive(DeviceState *dev, const char *name,
                        BlockBackend *value)
void qdev_prop_set_drive(DeviceState *dev, const char *name,
                         BlockBackend *value, Error **errp)
{
    Error *err = NULL;
    object_property_set_str(OBJECT(dev),
                            value ? blk_name(value) : "", name, &err);
    if (err) {
        qerror_report_err(err);
        error_free(err);
        return -1;
    }
    return 0;
    object_property_set_str(OBJECT(dev), value ? blk_name(value) : "",
                            name, errp);
}

void qdev_prop_set_drive_nofail(DeviceState *dev, const char *name,
                                BlockBackend *value)
{
    if (qdev_prop_set_drive(dev, name, value) < 0) {
    Error *err = NULL;

    qdev_prop_set_drive(dev, name, value, &err);
    if (err) {
        error_report_err(err);
        exit(1);
    }
}

void qdev_prop_set_chr(DeviceState *dev, const char *name,
                       CharDriverState *value)
{
Loading