[libvirt] [PATCH 2/2] storage: try to perform btrfs COW copy if possible

Chen, Hanxiao chenhanxiao at cn.fujitsu.com
Mon Jan 19 08:20:52 UTC 2015



> -----Original Message-----
> From: Ján Tomko [mailto:jtomko at redhat.com]
> Sent: Friday, January 16, 2015 10:22 PM
> To: Chen, Hanxiao/陈 晗霄; libvir-list at redhat.com
> Subject: Re: [libvirt] [PATCH 2/2] storage: try to perform btrfs COW copy if possible
> 
> On 01/13/2015 09:18 AM, Chen Hanxiao wrote:
> > We don't take advantage of clone of btrfs.
> >
> > So
> > a)try to do a btrfs lightweight copy
> >
> > b)fall back to a standard copy
> >   if COW copy not supported.
> >
> > Signed-off-by: Chen Hanxiao <chenhanxiao at cn.fujitsu.com>
> > ---
> >  include/libvirt/libvirt-storage.h |  1 +
> >  src/storage/storage_backend.c     | 39
> ++++++++++++++++++++++++++++++++-------
> >  src/storage/storage_backend_fs.c  |  8 ++++++--
> >  src/storage/storage_driver.c      |  4 +++-
> >  4 files changed, 42 insertions(+), 10 deletions(-)
> >
> > diff --git a/include/libvirt/libvirt-storage.h
> b/include/libvirt/libvirt-storage.h
> > index 1f3087b..4ae42e1 100644
> > --- a/include/libvirt/libvirt-storage.h
> > +++ b/include/libvirt/libvirt-storage.h
> > @@ -306,6 +306,7 @@ const char*             virStorageVolGetKey
> (virStorageVolPtr vol);
> >
> >  typedef enum {
> >      VIR_STORAGE_VOL_CREATE_PREALLOC_METADATA = 1 << 0,
> > +    VIR_STORAGE_VOL_CREATE_REFLINK = 1 << 1,
> 
> There should be some human-readable commentary after the flag, that will be
> shown on our API reference page:
> http://libvirt.org/html/libvirt-libvirt-storage.html#virStorageVolCreateFlags
> 

Will do.

> >  } virStorageVolCreateFlags;
> >
> >  virStorageVolPtr        virStorageVolCreateXML          (virStoragePoolPtr
> pool,
> > diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c
> > index 5ce3566..838398e 100644
> > --- a/src/storage/storage_backend.c
> > +++ b/src/storage/storage_backend.c
> > @@ -187,7 +187,8 @@ virStorageBackendCopyToFD(virStorageVolDefPtr vol,
> >                            virStorageVolDefPtr inputvol,
> >                            int fd,
> >                            unsigned long long *total,
> > -                          bool want_sparse)
> > +                          bool want_sparse,
> > +                          bool reflink_copy)
> >  {
> >      int inputfd = -1;
> >      int amtread = -1;
> > @@ -226,6 +227,15 @@ virStorageBackendCopyToFD(virStorageVolDefPtr vol,
> >          goto cleanup;
> >      }
> >
> > +    if (reflink_copy) {
> > +        if (btrfsCloneFile(fd, inputfd) == -1) {
> > +            VIR_DEBUG("btrfs clone not supported, try another way.");
> 
> If reflink copy is unsupported, I think we should just error out, as a full
> copy won't be as fast / occupy as little space.
> 
> Also, this would fall back even on other errors.
> 

That's a better solution, will be changed in v2.

Thanks,
- Chen

> The rest looks good to me.
> 
> Jan





More information about the libvir-list mailing list