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: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
Message-Id: <1425925048-15482-3-git-send-email-armbru@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Markus Armbruster
2015-03-09 19:17:26 +01:00
committed by Paolo Bonzini
parent fa61718183
commit 9b3d111ad9
8 changed files with 32 additions and 27 deletions

View File

@@ -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)
{