mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-11 07:17:44 +00:00
scsi: Adjust return values from processLU
https://bugzilla.redhat.com/show_bug.cgi?id=1171933 Adjust the processLU error returns to be a bit more logical. Currently, the calling code cannot determine the difference between a non disk/lun volume and a processed/found disk/lun. It can also not differentiate between perhaps real/fatal error and one that won't necessarily stop the code from finding other volumes. After this patch virStorageBackendSCSIFindLUsInternal will stop processing as soon as a "fatal" message occurs rather than continuting processing for no apparent reason. It will also only set the *found value when at least one of the processLU's was successful. With the failed return, if the reason for the stop was that the pool target path did not exist, was /dev, was /dev/, or did not start with /dev, then iSCSI pool startup and refresh will fail.
This commit is contained in:
parent
1e13eff435
commit
9832205263
@ -377,6 +377,15 @@ getBlockDevice(uint32_t host,
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Process a Logical Unit entry from the scsi host device directory
|
||||
*
|
||||
* Returns:
|
||||
*
|
||||
* 0 => Found a valid entry
|
||||
* -1 => Some sort of fatal error
|
||||
* -2 => non-fatal error or a non-disk entry
|
||||
*/
|
||||
static int
|
||||
processLU(virStoragePoolObjPtr pool,
|
||||
uint32_t host,
|
||||
@ -395,7 +404,7 @@ 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);
|
||||
goto out;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* We don't create volumes for devices other than disk and cdrom
|
||||
@ -403,32 +412,28 @@ processLU(virStoragePoolObjPtr pool,
|
||||
* isn't an error, either. */
|
||||
if (!(device_type == VIR_STORAGE_DEVICE_TYPE_DISK ||
|
||||
device_type == VIR_STORAGE_DEVICE_TYPE_ROM))
|
||||
{
|
||||
retval = 0;
|
||||
goto out;
|
||||
}
|
||||
return -2;
|
||||
|
||||
VIR_DEBUG("%u:%u:%u:%u is a Direct-Access LUN",
|
||||
host, bus, target, lun);
|
||||
|
||||
if (getBlockDevice(host, bus, target, lun, &block_device) < 0) {
|
||||
VIR_DEBUG("Failed to find block device for this LUN");
|
||||
goto out;
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (virStorageBackendSCSINewLun(pool,
|
||||
host, bus, target, lun,
|
||||
block_device) < 0) {
|
||||
retval = virStorageBackendSCSINewLun(pool, host, bus, target, lun,
|
||||
block_device);
|
||||
if (retval < 0) {
|
||||
VIR_DEBUG("Failed to create new storage volume for %u:%u:%u:%u",
|
||||
host, bus, target, lun);
|
||||
goto out;
|
||||
goto cleanup;
|
||||
}
|
||||
retval = 0;
|
||||
|
||||
VIR_DEBUG("Created new storage volume for %u:%u:%u:%u successfully",
|
||||
host, bus, target, lun);
|
||||
|
||||
out:
|
||||
cleanup:
|
||||
VIR_FREE(block_device);
|
||||
return retval;
|
||||
}
|
||||
@ -461,6 +466,8 @@ virStorageBackendSCSIFindLUs(virStoragePoolObjPtr pool,
|
||||
snprintf(devicepattern, sizeof(devicepattern), "%u:%%u:%%u:%%u\n", scanhost);
|
||||
|
||||
while ((retval = virDirRead(devicedir, &lun_dirent, device_path)) > 0) {
|
||||
int rc;
|
||||
|
||||
if (sscanf(lun_dirent->d_name, devicepattern,
|
||||
&bus, &target, &lun) != 3) {
|
||||
continue;
|
||||
@ -468,7 +475,12 @@ virStorageBackendSCSIFindLUs(virStoragePoolObjPtr pool,
|
||||
|
||||
VIR_DEBUG("Found possible LU '%s'", lun_dirent->d_name);
|
||||
|
||||
if (processLU(pool, scanhost, bus, target, lun) == 0)
|
||||
rc = processLU(pool, scanhost, bus, target, lun);
|
||||
if (rc == -1) {
|
||||
retval = -1;
|
||||
break;
|
||||
}
|
||||
if (rc == 0)
|
||||
found++;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user