[libvirt] [PATCH v2 2/2] storage: btrfs subvolumes for directory pools

Oskari Saarenmaa os at ohmu.fi
Thu Oct 10 16:39:40 UTC 2013


Thanks for the review,

10.10.2013 18:57, Daniel P. Berrange kirjoitti:
> On Thu, Oct 10, 2013 at 05:52:22PM +0300, Oskari Saarenmaa wrote:
>> +if test "$with_storage_btrfs" = "yes" || test "$with_storage_btrfs" = "check"; then
>> +  AC_PATH_PROG([BTRFS], [btrfs], [], [$PATH:/sbin:/usr/sbin])
[...]
>> +AM_CONDITIONAL([WITH_STORAGE_BTRFS], [test "$with_storage_btrfs" = "yes"])
>
> Just use  'WITH_BTRFS' here - the WITH_STORAGE_XXXX is for actual
> storage backends.

Do we actually need a flag for enabling / disabling btrfs usage as it's 
not a separate storage pool?  I'm thinking about just calling 
AC_PATH_PROG(btrfs) if FS pool is enabled, and using #ifdef BTRFS in the 
fs code to use btrfs if available.

>> --- a/src/conf/storage_conf.h
>> +++ b/src/conf/storage_conf.h
>> @@ -90,6 +90,7 @@ struct _virStorageVolTarget {
>>       virStorageEncryptionPtr encryption;
>>       virBitmapPtr features;
>>       char *compat;
>> +    char *uuid;
>>   };
>
> This struct represents the public XML data format - adding random fields
> to it for individual driver use is not allowed.

Ok, I'll put this thing somewhere else.

>> +                if (volv->backingStore.path == NULL) {
>> +                    /* backing store not in the pool, ignore it */
>
> Backing stores for volumes are not required to be in the same pool as
> the source. For example it is valid to have a qcow2 file backed by
> a lvm volume.

In btrfs's case the note about backing store in an existing subvolume is 
informational only; all subvolumes, snapshots or not, are independent 
and in case we can't find a symbolic name for the parent volume I think 
it's safe to just ignore it.  I'll add this note to the comment.

> I'm thinking it would be nice to have a dedicate file with APIs for btrfs
> eg  src/util/virbtrfs.{h,c} and have it contain things like
>
>     virBtrFSCreateVolume(....)
>     virBtrFSCreateVolume(....)
>     virBtrFS...(....)
>
> and so on, so we don't have all these virCommand calls littering this
> file.

I'm not sure it makes sense to do this until there's another user for 
btrfs commands in libvirt, but I can do it if you like.  I think it'd be 
more useful to have a module which implements copy-on-write operations 
for different filesystems (btrfs, zfs, something else?) with a common api.

>> diff --git a/src/util/virstoragefile.h b/src/util/virstoragefile.h
>> index d5effa4..4dc6c81 100644
>> --- a/src/util/virstoragefile.h
>> +++ b/src/util/virstoragefile.h
>> @@ -46,6 +46,7 @@ enum virStorageFileFormat {
>>       VIR_STORAGE_FILE_FAT,
>>       VIR_STORAGE_FILE_VHD,
>>       VIR_STORAGE_FILE_VDI,
>> +    VIR_STORAGE_FILE_VOLUME,
>
> This isn't right - volumes already have a type={file,block,dir,volume}
> and we shouldn't duplicate this in the format attribute too.

Hmm.. I don't see such a field in virStorageVolType - am I looking at a 
wrong enum?

>> diff --git a/tests/storagevolxml2xmlin/vol-btrfs-snapshot.xml b/tests/storagevolxml2xmlin/vol-btrfs-snapshot.xml
>> new file mode 100644
>> index 0000000..5a58b56
>> --- /dev/null
>> +++ b/tests/storagevolxml2xmlin/vol-btrfs-snapshot.xml
>> @@ -0,0 +1,13 @@
>> +<volume>
>> +  <name>clone</name>
>> +  <capacity unit="bytes">0</capacity>
>> +  <allocation unit="bytes">0</allocation>
>> +  <target>
>> +    <path>/lxc/clone</path>
>> +    <format type='volume'/>
>> +  </target>
>> +  <backingStore>
>> +    <path>/lxc/vanilla</path>
>> +    <format type='volume'/>
>> +  </backingStore>
>> +</volume>
>
> Using 'format' in this way is wrong. What we should be doing
> is exposing the volume 'type' as an attribute eg
>
>    <volume type='volume'>
>    ...
>    </volume>

I suppose that makes sense, but it would make this incompatible with 
existing volume creation.  Right now (with the current patch) I can use 
existing virsh tooling to run, for example 'virsh vol-create-as default 
guest-1 0 --format volume --backing-store guest-base'

>> diff --git a/tests/storagevolxml2xmlout/vol-btrfs-snapshot.xml b/tests/storagevolxml2xmlout/vol-btrfs-snapshot.xml
>> new file mode 100644
>> index 0000000..75830d3
>> --- /dev/null
>> +++ b/tests/storagevolxml2xmlout/vol-btrfs-snapshot.xml
>> @@ -0,0 +1,26 @@
>> +<volume>
>> +  <name>clone</name>
>> +  <key>(null)</key>
>
> If you're getting (null) here, then something has gone wrong

I'll look into this.

Thanks,
  Oskari




More information about the libvir-list mailing list