[libvirt] [PATCH 02/18] Fix error detection in virStorageBackendISCSIGetHostNumber
John Ferlan
jferlan at redhat.com
Thu Jun 23 12:26:06 UTC 2016
On 06/21/2016 12:05 PM, Ján Tomko wrote:
> In the unlikely case the iSCSI session path exists, but does not
> contain an entry starting with "target", we would silently use
> an initialized value.
>
> Rewrite the function to correctly report errors.
> ---
> src/storage/storage_backend_iscsi.c | 38 +++++++++++++++++++------------------
> 1 file changed, 20 insertions(+), 18 deletions(-)
>
> diff --git a/src/storage/storage_backend_iscsi.c b/src/storage/storage_backend_iscsi.c
> index bccfba3..876c14c 100644
> --- a/src/storage/storage_backend_iscsi.c
> +++ b/src/storage/storage_backend_iscsi.c
> @@ -90,7 +90,7 @@ static int
> virStorageBackendISCSIGetHostNumber(const char *sysfs_path,
> uint32_t *host)
> {
> - int retval = 0;
> + int ret = -1;
> DIR *sysdir = NULL;
> struct dirent *dirent = NULL;
> int direrr;
> @@ -104,26 +104,33 @@ virStorageBackendISCSIGetHostNumber(const char *sysfs_path,
> if (sysdir == NULL) {
> virReportSystemError(errno,
> _("Failed to opendir path '%s'"), sysfs_path);
> - retval = -1;
> - goto out;
> + goto cleanup;
> }
>
> while ((direrr = virDirRead(sysdir, &dirent, sysfs_path)) > 0) {
> if (STREQLEN(dirent->d_name, "target", strlen("target"))) {
While we're here and changing, could use STRPREFIX
> - if (sscanf(dirent->d_name,
> - "target%u:", host) != 1) {
> - VIR_DEBUG("Failed to parse target '%s'", dirent->d_name);
> - retval = -1;
> - break;
> + if (sscanf(dirent->d_name, "target%u:", host) == 1) {
> + ret = 0;
> + goto cleanup;
> + } else {
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("Failed to parse target '%s'"), dirent->d_name);
> + goto cleanup;
> }
> }
> }
> - if (direrr < 0)
> - retval = -1;
>
> + if (direrr == 0) {
Should this be <= ?
If virDirRead() returns -1, then we don't return with an error...
If virDirRead() returns 0, then we've gone through the entire directory
without finding an entry that starts with target - seems that would be a
system configuration error and I assume errno would be ENOENT
ACK with obvious adjustments -
John
> + virReportSystemError(errno,
> + _("Failed to get host number for iSCSI session "
> + "with path '%s'"),
> + sysfs_path);
> + goto cleanup;
> + }
> +
> + cleanup:
> closedir(sysdir);
> - out:
> - return retval;
> + return ret;
> }
>
> static int
> @@ -138,13 +145,8 @@ virStorageBackendISCSIFindLUs(virStoragePoolObjPtr pool,
> "/sys/class/iscsi_session/session%s/device", session) < 0)
> goto cleanup;
>
> - if (virStorageBackendISCSIGetHostNumber(sysfs_path, &host) < 0) {
> - virReportSystemError(errno,
> - _("Failed to get host number for iSCSI session "
> - "with path '%s'"),
> - sysfs_path);
> + if (virStorageBackendISCSIGetHostNumber(sysfs_path, &host) < 0)
> goto cleanup;
> - }
>
> if (virStorageBackendSCSIFindLUs(pool, host) < 0)
> goto cleanup;
>
More information about the libvir-list
mailing list