[libvirt] [PATCH 1/2] storage: Fix issue finding LU's when block doesn't exist
Michal Privoznik
mprivozn at redhat.com
Thu Nov 20 14:12:06 UTC 2014
On 19.11.2014 21:52, John Ferlan wrote:
> Fix a problem in the getBlockDevice and processLU where retval initialized
> to zero causing some failures to erroneously continue through to the
> virStorageBackendSCSINewLun with an attempt to find a path for "/dev/(null)".
> This would fail approximately 10 seconds later with debug message:
>
> virStorageBackendSCSINewLun:203 :
> No stable path found for '/dev/(null)' in '/dev/disk/by-path'
>
> The root cause of the issue is for many /sys/bus/scsi/devices/<lun path>
> there is no "block*" device found for the vHBA's, where "<lun path>" are
> the various paths created for the vHBA, such as "17:0:0:0", "17:0:1:0",
> "17:0:2:0", "17:0:3:0", etc. If the block device isn't found, then the
> directory should just be ignored rather than attempting to process it.
>
> The bug was that in getBlockDevice the assumption was "block" would exist
> and either getNewStyleBlockDevice or getOldStyleBlockDevice would fill in
> @block_device. However, if 'block*' doesn't exist, then the code returned
> NULL for block_device *and* a good (zero) retval value. This caused the
> processLU code to attempt the virStorageBackendSCSINewLun which failed
> "at some point in time" in the future.
>
> After this change - on test system the refresh-pool didn't have a noticable
> pause of about 20 seconds - it completed within a second since no longer
> was there an attempt/need to find "/dev/(null)".
>
> Additionally, the virStorageBackendSCSIFindLU's shouldn't be declaring
> found unless the processLU actually returns success. This will be
> important in the followup patch which relies on whether a LU was found.
>
> Signed-off-by: John Ferlan <jferlan at redhat.com>
> ---
> src/storage/storage_backend_scsi.c | 18 +++++++++---------
> 1 file changed, 9 insertions(+), 9 deletions(-)
>
> diff --git a/src/storage/storage_backend_scsi.c b/src/storage/storage_backend_scsi.c
> index c952b71..5e4f36e 100644
> --- a/src/storage/storage_backend_scsi.c
> +++ b/src/storage/storage_backend_scsi.c
> @@ -321,7 +321,7 @@ getBlockDevice(uint32_t host,
> char *lun_path = NULL;
> DIR *lun_dir = NULL;
> struct dirent *lun_dirent = NULL;
> - int retval = 0;
> + int retval = -1;
> int direrr;
>
> if (virAsprintf(&lun_path, "/sys/bus/scsi/devices/%u:%u:%u:%u",
> @@ -333,7 +333,6 @@ getBlockDevice(uint32_t host,
> virReportSystemError(errno,
> _("Failed to opendir sysfs path '%s'"),
> lun_path);
> - retval = -1;
> goto out;
> }
>
> @@ -368,7 +367,7 @@ processLU(virStoragePoolObjPtr pool,
> uint32_t lun)
> {
> char *type_path = NULL;
> - int retval = 0;
> + int retval = -1;
> int device_type;
> char *block_device = NULL;
>
> @@ -379,7 +378,6 @@ processLU(virStoragePoolObjPtr pool,
> virReportError(VIR_ERR_INTERNAL_ERROR,
> _("Failed to determine if %u:%u:%u:%u is a Direct-Access LUN"),
> host, bus, target, lun);
> - retval = -1;
> goto out;
> }
>
> @@ -396,17 +394,19 @@ processLU(virStoragePoolObjPtr pool,
> VIR_DEBUG("%u:%u:%u:%u is a Direct-Access LUN",
> host, bus, target, lun);
>
> - if (getBlockDevice(host, bus, target, lun, &block_device) < 0)
> + if (getBlockDevice(host, bus, target, lun, &block_device) < 0) {
> + VIR_DEBUG("Failed to find block device for this LUN");
> goto out;
> + }
>
> if (virStorageBackendSCSINewLun(pool,
> host, bus, target, lun,
> block_device) < 0) {
> VIR_DEBUG("Failed to create new storage volume for %u:%u:%u:%u",
> host, bus, target, lun);
> - retval = -1;
> goto out;
> }
> + retval = 0;
>
> VIR_DEBUG("Created new storage volume for %u:%u:%u:%u successfully",
> host, bus, target, lun);
> @@ -451,10 +451,10 @@ virStorageBackendSCSIFindLUs(virStoragePoolObjPtr pool,
> continue;
> }
>
> - found = true;
> - VIR_DEBUG("Found LU '%s'", lun_dirent->d_name);
> + VIR_DEBUG("Found possible LU '%s'", lun_dirent->d_name);
>
> - processLU(pool, scanhost, bus, target, lun);
> + if (processLU(pool, scanhost, bus, target, lun) == 0)
> + found = true;
Do we want 'break' here to jump out from the loop too?
> }
>
> if (!found)
>
Either way, that's just an optimization, so ACK.
Michal
More information about the libvir-list
mailing list