On 01/05/2016 07:39 PM, Cao jin wrote:
To catch the error msg. Also modify the caller
Signed-off-by: Cao jin <address@hidden>
---
hw/xen/xen-host-pci-device.c | 106 +++++++++++++++++++++++++------------------
hw/xen/xen-host-pci-device.h | 5 +-
hw/xen/xen_pt.c | 12 +++--
3 files changed, 71 insertions(+), 52 deletions(-)
diff --git a/hw/xen/xen-host-pci-device.c b/hw/xen/xen-host-pci-device.c
index 7d8a023..952cae0 100644
--- a/hw/xen/xen-host-pci-device.c
+++ b/hw/xen/xen-host-pci-device.c
@@ -49,7 +49,7 @@ static int xen_host_pci_sysfs_path(const XenHostPCIDevice *d,
/* This size should be enough to read the first 7 lines of a resource file */
#define XEN_HOST_PCI_RESOURCE_BUFFER_SIZE 400
-static int xen_host_pci_get_resource(XenHostPCIDevice *d)
+static void xen_host_pci_get_resource(XenHostPCIDevice *d, Error **errp)
{
int i, rc, fd;
char path[PATH_MAX];
@@ -60,23 +60,24 @@ static int xen_host_pci_get_resource(XenHostPCIDevice *d)
rc = xen_host_pci_sysfs_path(d, "resource", path, sizeof (path));
if (rc) {
- return rc;
+ error_setg_errno(errp, errno, "snprintf err");
Are you sure that errno is relevant? And "snprintf err" doesn't seem to
be the correct message, as there is no snprintf in the line above.
+ return;
}
+
fd = open(path, O_RDONLY);
if (fd == -1) {
- XEN_HOST_PCI_LOG("Error: Can't open %s: %s\n", path, strerror(errno));
- return -errno;
+ error_setg_errno(errp, errno, "open %s err", path);
Please use error_setg_file_open() for reporting open() failures.
@@ -129,20 +130,20 @@ static int xen_host_pci_get_resource(XenHostPCIDevice *d)
d->rom.bus_flags = flags & IORESOURCE_BITS;
}
}
+
if (i != PCI_NUM_REGIONS) {
/* Invalid format or input to short */
- rc = -ENODEV;
+ error_setg(errp, "Invalid format or input to short: %s", buf);
s/to/too/ (and might as well fix the same typo in the comment while at it)
@@ -152,47 +153,52 @@ static int xen_host_pci_get_value(XenHostPCIDevice *d,
const char *name,
rc = xen_host_pci_sysfs_path(d, name, path, sizeof (path));
if (rc) {
- return rc;
+ error_setg_errno(errp, errno, "snprintf err");
+ return;
}
+
fd = open(path, O_RDONLY);
if (fd == -1) {
- XEN_HOST_PCI_LOG("Error: Can't open %s: %s\n", path, strerror(errno));
- return -errno;
+ error_setg_errno(errp, errno, "open %s err", path);
Same comments as above.
+ return;
}
+
do {
rc = read(fd, &buf, sizeof (buf) - 1);
if (rc < 0 && errno != EINTR) {
- rc = -errno;
+ error_setg_errno(errp, errno, "read err");
goto out;
}
} while (rc < 0);
+
buf[rc] = 0;
value = strtol(buf, &endptr, base);
if (endptr == buf || *endptr != '\n') {
- rc = -1;
+ error_setg(errp, "format invalid: %s", buf);
} else if ((value == LONG_MIN || value == LONG_MAX) && errno == ERANGE) {
- rc = -errno;
+ error_setg_errno(errp, errno, "strtol err");
This is pre-existing invalid use of strtol (the value of errno is not
guaranteed to be ERANGE on overflow; and the only correct way to safely
check errno after strtol() is to first prime it to 0 prior to calling
strtol). Better would be to use qemu_strtol() (preferably as a separate
patch), so that you don't even have to worry about using strtol()
incorrectly.
+static void xen_host_pci_config_open(XenHostPCIDevice *d, Error **errp)
{
char path[PATH_MAX];
int rc;
rc = xen_host_pci_sysfs_path(d, "config", path, sizeof (path));
May want to delete the space before ( while touching the code in this
vicinity.
if (rc) {
- return rc;
+ error_setg_errno(errp, errno, "snprintf err");
Another suspect message.
+void xen_host_pci_device_get(XenHostPCIDevice *d, uint16_t domain,
+ uint8_t bus, uint8_t dev, uint8_t func,
+ Error **errp)
{
unsigned int v;
- int rc = 0;
+ Error *local_err = NULL;
These days, naming the local variable 'err' is more common than 'local_err'.
@@ -774,11 +775,12 @@ static int xen_pt_initfn(PCIDevice *d)
s->hostaddr.bus, s->hostaddr.slot, s->hostaddr.function,
s->dev.devfn);
- rc = xen_host_pci_device_get(&s->real_device,
- s->hostaddr.domain, s->hostaddr.bus,
- s->hostaddr.slot, s->hostaddr.function);
- if (rc) {
- XEN_PT_ERR(d, "Failed to \"open\" the real pci device. rc: %i\n", rc);
+ xen_host_pci_device_get(&s->real_device,
+ s->hostaddr.domain, s->hostaddr.bus,
+ s->hostaddr.slot, s->hostaddr.function,
+ &local_err);
+ if (local_err) {
+ XEN_PT_ERR(d, "Failed to \"open\" the real pci device.\n");
Leaks local_err.