[libvirt] [PATCH 4/8] storage: lvm: Separate creating of the volume from building
Ján Tomko
jtomko at redhat.com
Wed Feb 12 10:43:01 UTC 2014
On 02/12/2014 07:29 AM, Michael Chapman wrote:
> On Thu, 16 Jan 2014, Peter Krempa wrote:
>> On 01/09/14 23:40, Eric Blake wrote:
>>> On 01/06/2014 09:44 AM, Peter Krempa wrote:
>>>> Separate the steps to create libvirt's volume metadata from the actual
>>>> volume building process. This is already done for regular file based
>>>> pools to allow job support for storage APIs.
>>>> ---
>>>> src/storage/storage_backend_logical.c | 60
>>>> +++++++++++++++++++++--------------
>>>> 1 file changed, 37 insertions(+), 23 deletions(-)
>>>>
>>>
>>> ACK; I'm borderline whether this should wait for the release, though.
>>>
>>
>> Now that 1.2.2 is out I've pushed this one and the rest with the same
>> complaint.
>
> Hi Peter,
>
> This breaks volume creation in an LVM pool:
>
> # cat volume.xml
> <volume type='block'>
> <name>test</name>
> <capacity unit='bytes'>10737418240</capacity>
> <allocation unit='bytes'>10737418240</allocation>
> </volume>
> # virsh vol-create vg volume.xml
> error: Failed to create vol from volume.xml
> error: key in virGetStorageVol must not be NULL
>
> The problem is a storage backend's createVol function is expected to set an
> appropriate key, but for an LVM volume this isn't done now until buildVol is
> called. The LV's UUID is used as the volume's key.
For the disk backend, volume keys are also generated in buildVol after the
volume is created.
IMO we should revert commits:
commit af1fb38f55d4fb87e0fcaee1e973fa9c6713b1e6
storage: lvm: Separate creating of the volume from building
commit 67ccf91bf29488783bd1fda46b362450f71a2078
storage: disk: Separate creating of the volume from building
unless we have a really good reason not to.
>
> vol-clone and vol-create-from are even worse: libvirtd crashes since the NULL
> return from virGetStorageVol isn't handled in storageVolCreateXMLFrom. We
> probably need:
>
> --- a/src/storage/storage_driver.c
> +++ b/src/storage/storage_driver.c
> @@ -1828,6 +1828,10 @@ storageVolCreateXMLFrom(virStoragePoolPtr obj,
> pool->volumes.objs[pool->volumes.count++] = newvol;
> volobj = virGetStorageVol(obj->conn, pool->def->name, newvol->name,
> newvol->key, NULL, NULL);
> + if (!volobj) {
> + pool->volumes.count--;
> + goto cleanup;
> + }
>
> /* Drop the pool lock during volume allocation */
> pool->asyncjobs++;
ACK to this patch. No matter what way we fix the actual bug, virGetStorageVol
can still return NULL when we're out of memory. Would you like to write a
commit message and send it as a formal patch, or shall I do it?
Jan
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20140212/690c75dc/attachment-0001.sig>
More information about the libvir-list
mailing list