On Thu, Jun 23, 2016 at 08:26:30AM -0400, John Ferlan wrote:
On 06/21/2016 12:05 PM, Ján Tomko wrote:
> Switch from opendir to virDirOpen everywhere we need to report an error.
> ---
> src/storage/storage_backend_fs.c | 6 +-----
> src/storage/storage_backend_iscsi.c | 7 +------
> src/storage/storage_backend_scsi.c | 19 +++----------------
> src/util/vircgroup.c | 5 +----
> src/util/virfile.c | 16 +++-------------
> src/util/virhostcpu.c | 4 +---
> src/util/virnetdev.c | 6 +-----
> src/util/virnetdevtap.c | 7 +------
> src/util/virpci.c | 13 +++----------
> src/util/virprocess.c | 2 +-
> src/util/virscsi.c | 10 ++--------
> src/util/virusb.c | 7 +------
> src/util/virutil.c | 18 +++---------------
> src/xen/xen_inotify.c | 7 ++-----
> src/xen/xm_internal.c | 6 +-----
> tests/virschematest.c | 6 +-----
> tools/nss/libvirt_nss.c | 4 +---
> 17 files changed, 27 insertions(+), 116 deletions(-)
>
There were 4 in this pile which it's not 100% clear if they should
actually be using the event virDirOpenQuiet...
[...]
> diff --git a/src/util/virpci.c b/src/util/virpci.c
> index 5cb5d3a..77ae9b4 100644
> --- a/src/util/virpci.c
> +++ b/src/util/virpci.c
> @@ -460,11 +460,8 @@ virPCIDeviceIterDevices(virPCIDeviceIterPredicate predicate,
>
> VIR_DEBUG("%s %s: iterating over " PCI_SYSFS "devices",
dev->id, dev->name);
>
> - dir = opendir(PCI_SYSFS "devices");
> - if (!dir) {
> - VIR_WARN("Failed to open " PCI_SYSFS "devices");
> + if (virDirOpen(&dir, PCI_SYSFS "devices") < 0)
> return -1;
> - }
This one it seems eventually would cause an error (although on opendir
failure, the failure to open message could be issued twice...).
Both of the other error paths (virDirRead and virPCIDeviceNew) report an
error, so opendir should be noisy too.
Also, failing to open /sys/bus/pci/devices is unlikely.
It seems
virPCIDeviceBusContainsActiveDevices may not want the error since it's
caller virPCIDeviceTrySecondaryBusReset on failure will call
virPCIDeviceGetParent which would seem to want the error.
If virPCIDeviceBusContainsActiveDevices fails and returns -1 (which is
unlikely - either we failed to opendir /sys/bus/pci/devices, or we got
EBADF from readdir on that same DIR*, or OOM), then
if ((conflict = virPCIDeviceBusContainsActiveDevices(dev,
inactiveDevs))) {
is true and it exits early. I do not see the virPCIDeviceGetParent call.
In this
situation, I believe we'll see two failure to open errors.
>
> while ((ret = virDirRead(dir, &entry, PCI_SYSFS "devices")) >
0) {
> unsigned int domain, bus, slot, function;
> @@ -1962,11 +1959,8 @@ int virPCIDeviceFileIterate(virPCIDevicePtr dev,
> dev->address.slot, dev->address.function) < 0)
> goto cleanup;
>
> - if (!(dir = opendir(pcidir))) {
> - virReportSystemError(errno,
> - _("cannot open %s"), pcidir);
> + if (virDirOpen(&dir, pcidir) < 0)
> goto cleanup;
> - }
>
> while ((direrr = virDirRead(dir, &ent, pcidir)) > 0) {
> /* Device assignment requires:
> @@ -2696,8 +2690,7 @@ virPCIGetNetName(char *device_link_sysfs_path, char **netname)
> return -1;
> }
>
> - dir = opendir(pcidev_sysfs_net_path);
> - if (dir == NULL)
> + if (virDirOpen(&dir, pcidev_sysfs_net_path) < 0)
> goto out;
Quite a few callers - I didn't chase them all, but it's whether they all
expect to have an error is a matter of interpretation. The callers (PF
and VF searches) seem to have varying opinions on whether a < 0 return
is really an error.
I'll change this one to use the Quiet version.
>
> while (virDirRead(dir, &entry, pcidev_sysfs_net_path) > 0) {
> diff --git a/src/util/virprocess.c b/src/util/virprocess.c
> index b0ca1ce..a3e7f4e 100644
> --- a/src/util/virprocess.c
> +++ b/src/util/virprocess.c
> @@ -612,7 +612,7 @@ int virProcessGetPids(pid_t pid, size_t *npids, pid_t **pids)
> (unsigned long long)pid) < 0)
> goto cleanup;
>
> - if (!(dir = opendir(taskPath)))
> + if (virDirOpen(&dir, taskPath) < 0)
> goto cleanup;
Another, although perhaps it's good in this case.
>
> while ((value = virDirRead(dir, &ent, taskPath)) > 0) {
[...]
> diff --git a/tools/nss/libvirt_nss.c b/tools/nss/libvirt_nss.c
> index d179514..724cb06 100644
> --- a/tools/nss/libvirt_nss.c
> +++ b/tools/nss/libvirt_nss.c
> @@ -125,10 +125,8 @@ findLease(const char *name,
> }
>
>
> - if (!(dir = opendir(leaseDir))) {
> - ERROR("Failed to open dir '%s'", leaseDir);
> + if (virDirOpen(&dir, leaseDir) < 0)
> goto cleanup;
> - }
For this one ERROR is eaten by the # define; however, if ERROR was
defined, then I don't believe ERROR would process things properly.
The error handling is a bit strange in that file, but it also uses
VIR_REALLOC_QUIET, so I'll change this one too.
Jan
Conditional ACK - I would think virOpenDirQuiet could be the better
choice for these though
John
>
> if (!(leases_array = virJSONValueNewArray())) {
> ERROR("Failed to create json array");
>