On 06/15/2015 07:24 AM, Michal Privoznik wrote: > From: John Ferlan <jferlan@xxxxxxxxxx> > > https://bugzilla.redhat.com/show_bug.cgi?id=1224233 > > Currently it's not possible to determine the difference between a > fatal memory allocation or failure to open/read the directory error > with a perhaps less fatal, I didn't find the "block" device in the > directory (which may be a disk entry without a block device). > > In the case of the latter, we shouldn't cause failure to continue > searching in the caller (virStorageBackendSCSIFindLUs), rather we > should allow trying reading the next directory entry. > > Signed-off-by: John Ferlan <jferlan@xxxxxxxxxx> > Signed-off-by: Michal Privoznik <mprivozn@xxxxxxxxxx> > --- > src/storage/storage_backend_scsi.c | 48 +++++++++++++++++++++++++++----------- > 1 file changed, 34 insertions(+), 14 deletions(-) > ACK - I had assumed only 1 & 2 were adjustments and felt odd acking my own change, but now I see that there were more changes here as well... John > diff --git a/src/storage/storage_backend_scsi.c b/src/storage/storage_backend_scsi.c > index ddfbade..b426145 100644 > --- a/src/storage/storage_backend_scsi.c > +++ b/src/storage/storage_backend_scsi.c > @@ -324,6 +324,15 @@ getOldStyleBlockDevice(const char *lun_path ATTRIBUTE_UNUSED, > } > > > +/* > + * Search a device entry for the "block" file > + * > + * Returns > + * > + * 0 => Found it > + * -1 => Fatal error > + * -2 => Didn't find in lun_path directory > + */ > static int > getBlockDevice(uint32_t host, > uint32_t bus, > @@ -337,36 +346,47 @@ getBlockDevice(uint32_t host, > int retval = -1; > int direrr; > > + *block_device = NULL; > + > if (virAsprintf(&lun_path, "/sys/bus/scsi/devices/%u:%u:%u:%u", > host, bus, target, lun) < 0) > - goto out; > + goto cleanup; > > - lun_dir = opendir(lun_path); > - if (lun_dir == NULL) { > + if (!(lun_dir = opendir(lun_path))) { > virReportSystemError(errno, > _("Failed to opendir sysfs path '%s'"), > lun_path); > - goto out; > + goto cleanup; > } > > while ((direrr = virDirRead(lun_dir, &lun_dirent, lun_path)) > 0) { > if (STREQLEN(lun_dirent->d_name, "block", 5)) { > if (strlen(lun_dirent->d_name) == 5) { > - retval = getNewStyleBlockDevice(lun_path, > - lun_dirent->d_name, > - block_device); > + if (getNewStyleBlockDevice(lun_path, > + lun_dirent->d_name, > + block_device) < 0) > + goto cleanup; > } else { > - retval = getOldStyleBlockDevice(lun_path, > - lun_dirent->d_name, > - block_device); > + if (getOldStyleBlockDevice(lun_path, > + lun_dirent->d_name, > + block_device) < 0) > + goto cleanup; > } > break; > } > } > + if (direrr < 0) > + goto cleanup; > + if (!*block_device) { > + retval = -2; > + goto cleanup; > + } > > - closedir(lun_dir); > + retval = 0; > > - out: > + cleanup: > + if (lun_dir) > + closedir(lun_dir); > VIR_FREE(lun_path); > return retval; > } > @@ -412,9 +432,9 @@ 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 ((retval = getBlockDevice(host, bus, target, lun, &block_device)) < 0) { > VIR_DEBUG("Failed to find block device for this LUN"); > - return -1; > + return retval; > } > > retval = virStorageBackendSCSINewLun(pool, host, bus, target, lun, > -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list