From: Peter Krempa Date: Wed, 25 Jun 2014 16:48:27 +0000 (+0200) Subject: util: storage: Add function to transfer config parts to new chain element X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=3bd69ab94080bcae0dc2820c9c64037c09a3cf09;p=people%2Fliuw%2Flibxenctrl-split%2Flibvirt.git util: storage: Add function to transfer config parts to new chain element We are going to modify storage source chains in place. Add a helper that will copy relevant information such as security labels to the new element if that doesn't contain it. --- diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 3a0f3fb67..22dde5a60 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1925,6 +1925,7 @@ virStorageSourceCopy; virStorageSourceFree; virStorageSourceGetActualType; virStorageSourceGetSecurityLabelDef; +virStorageSourceInitChainElement; virStorageSourceIsLocalStorage; virStorageSourceNewFromBacking; virStorageSourcePoolDefFree; diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c index 1deb7df10..b97fd56bc 100644 --- a/src/util/virstoragefile.c +++ b/src/util/virstoragefile.c @@ -1885,6 +1885,46 @@ virStorageSourceCopy(const virStorageSource *src, } +/** + * virStorageSourceInitChainElement: + * @newelem: New backing chain element disk source + * @old: Existing top level disk source + * @force: Force-copy the information + * + * Transfers relevant information from the existing disk source to the new + * backing chain element if they weren't supplied so that labelling info + * and possibly other stuff is correct. + * + * If @force is true, user-supplied information for the new backing store + * element is overwritten from @old instead of keeping it. + * + * Returns 0 on success, -1 on error. + */ +int +virStorageSourceInitChainElement(virStorageSourcePtr newelem, + virStorageSourcePtr old, + bool force) +{ + int ret = -1; + + if (force) { + virStorageSourceSeclabelsClear(newelem); + } + + if (!newelem->seclabels && + virStorageSourceSeclabelsCopy(newelem, old) < 0) + goto cleanup; + + newelem->shared = old->shared; + newelem->readonly = old->readonly; + + ret = 0; + + cleanup: + return ret; +} + + void virStorageSourcePoolDefFree(virStorageSourcePoolDefPtr def) { diff --git a/src/util/virstoragefile.h b/src/util/virstoragefile.h index 86dca3c67..744a6bacc 100644 --- a/src/util/virstoragefile.h +++ b/src/util/virstoragefile.h @@ -345,6 +345,9 @@ void virStorageNetHostDefFree(size_t nhosts, virStorageNetHostDefPtr hosts); virStorageNetHostDefPtr virStorageNetHostDefCopy(size_t nhosts, virStorageNetHostDefPtr hosts); +int virStorageSourceInitChainElement(virStorageSourcePtr newelem, + virStorageSourcePtr old, + bool force); void virStorageSourcePoolDefFree(virStorageSourcePoolDefPtr def); void virStorageSourceClear(virStorageSourcePtr def); int virStorageSourceGetActualType(virStorageSourcePtr def);