[libvirt] [PATCH 1/1] Add SCSI pool support.
Dave Allan
dallan at redhat.com
Tue Mar 31 21:49:47 UTC 2009
Dave Allan wrote:
> Daniel P. Berrange wrote:
>> On Mon, Mar 30, 2009 at 05:50:38PM -0400, Dave Allan wrote:
>>> Daniel P. Berrange wrote:
>>>> This works now on RHEL-5, F9 and F10.
>>>>
>>>> I still had to disable this code
>>>>
>>>> if (STREQLEN(devpath, vol->target.path, PATH_MAX)) {
>>>> VIR_DEBUG(_("No stable path found for '%s' in '%s'"),
>>>> devpath, pool->def->target.path);
>>>> retval = -1;
>>>> goto free_vol;
>>>> }
>>>>
>>>> because it breaks pools configured with a target dir of /dev/
>>> That's a good point. Let's allow people to use non-stable paths by
>>> specifying a target path of /dev. That preserves the behavior I
>>> want, which is to prevent people from accidentally using non-stable
>>> paths when they asked for by-id, etc, but lets them use unstable
>>> paths if they want to. That's a one-line change that I have
>>> implemented in the attached patch.
>>>
>>>> And add device_type == 5 to allow CDROMs to work
>>>>
>>>> if (device_type != 0 &&
>>>> device_type != 5) {
>>>> retval = 0;
>>>> goto out;
>>>> }
>>> The more I think about this question, the more I think we need to
>>> ensure that within a particular pool there is only one device type,
>>> also implemented in the attached patch. The problem with mixing
>>> device types within the pool is that it forces the consumer
>>> application to do device type checking every time it uses a volume
>>> from the pool, because the different device types cannot be used
>>> identically in all cases. I'm not entirely in agreement that we
>>> should allow device types other than disk in this API, but if we
>>> ensure that each pool contains only devices of a particular type, I
>>> don't see any harm in it.
>>
>> I don't think it makes sense to restrict a pool to only contain devices
>> of a single type. It is perfectly reasonable for an IDE controller to
>> have a disk and a CDROM device on it, and restricting this would mean
>> users needing to create 2 separate pools for the same controller just
>> to be able to see all the devices.
>
> Having the consumer create a pool for each device type is the way I was
> envisioning its being used.
>
>> Other pool types are quite happy to mix volume types, eg raw, qcow2,
>> vmdk files in filesystem based pool, and I see no reason not to allow
>> this for HBA based pools.
>
> That is true. My assumption was that they were all being used by the
> VMs as disks. Is that not the case, i.e, are people using storage
> pools to back virtual MMC devices as well? If people are already mixing
> device types (from the guest's perspective) within pools, then making a
> distinction here is less important. It still does weird things to pool
> capacity, and volume creation fails unless there's media in the drive.
>
> I guess what it comes down to is I disagree with allowing anything not a
> disk in the pool, but if people are already doing it, then I don't
> disagree enough to continue to argue about it.
>
>>> diff --git a/src/storage_backend_scsi.c b/src/storage_backend_scsi.c
>>> index 2c5168a..9f6a085 100644
>>> --- a/src/storage_backend_scsi.c
>>> +++ b/src/storage_backend_scsi.c
>>> @@ -149,8 +149,11 @@ virStorageBackendSCSINewLun(virConnectPtr conn,
>>> goto free_vol;
>>> }
>>>
>>> - if (STREQLEN(devpath, vol->target.path, PATH_MAX)) {
>>> - VIR_DEBUG(_("No stable path found for '%s' in '%s'"),
>>> + if (STREQLEN(devpath, vol->target.path, PATH_MAX) &&
>>> + !(STREQ(pool->def->target.path, "/dev") ||
>>> + STREQ(pool->def->target.path, "/dev/"))) {
>>> +
>>> + VIR_DEBUG(_("No stable path found for '%s' in '%s'"),
>>> devpath, pool->def->target.path);
>>> retval = -1;
>>> goto free_vol;
>>
>> ACK to this chunk.
>
> Cool. Thanks.
>
>>> @@ -343,16 +346,19 @@ processLU(virConnectPtr conn,
>>>
>>> if (getDeviceType(conn, host, bus, target, lun, &device_type) <
>>> 0) {
>>> virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
>>> - _("Failed to determine if %u:%u:%u:%u
>>> is a Direct-Access LUN"),
>>> + _("Failed to determine if %u:%u:%u:%u "
>>> + "is a Direct-Access LUN"),
>>> host, bus, target, lun);
>>> retval = -1;
>>> goto out;
>>> }
>>>
>>> - /* We don't use anything except Direct-Access devices, but finding
>>> - * one isn't an error, either. */
>>> - if (device_type != 0) {
>>> + /* Check to see if the discovered device is the correct type for
>>> + * the pool. */
>>> + if (device_type != pool->def->deviceType) {
>>> retval = 0;
>>> + VIR_DEBUG(_("Found a device of type %d but pool device type
>>> is %d"),
>>> + device_type, pool->def->deviceType);
>>> goto out;
>>> }
>>>
>>
>> IMHo we should just be allowing types 0 & 5 directly here, with no
>> other restriction.
Attached is what I think is a final version of the scsi host pool code.
It's the set of patches we've been discussing rolled up into a single
patch, so it should look ok, but let me know if you have additional
comments. I allowed both disk and rom and took out the XML enhancement
for device type.
Dave
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: 0001-Add-SCSI-pool-support.patch
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20090331/2944f59f/attachment-0001.ksh>
More information about the libvir-list
mailing list