mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-10-13 17:49:16 +00:00
ffc6249c79
Preservation of the relative relationship requires us to load the backing store strings from the disk images. With blockdev we stopped detecting the backing chain if it's specified in the XML so the relative links were not loaded at that point. To preserve the functionality from the pre-blockdev without accessing the backing chain unnecessarily during VM startup we must refresh the relative links when relative block commit or block pull is requested. https://bugzilla.redhat.com/show_bug.cgi?id=1818655 Signed-off-by: Peter Krempa <pkrempa@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com>
269 lines
9.2 KiB
C
269 lines
9.2 KiB
C
/*
|
|
* qemu_block.h: helper functions for QEMU block subsystem
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library. If not, see
|
|
* <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "internal.h"
|
|
|
|
#include "qemu_conf.h"
|
|
#include "qemu_domain.h"
|
|
|
|
#include "virhash.h"
|
|
#include "virjson.h"
|
|
#include "viruri.h"
|
|
|
|
typedef struct qemuBlockNodeNameBackingChainData qemuBlockNodeNameBackingChainData;
|
|
typedef qemuBlockNodeNameBackingChainData *qemuBlockNodeNameBackingChainDataPtr;
|
|
struct qemuBlockNodeNameBackingChainData {
|
|
char *qemufilename; /* name of the image from qemu */
|
|
char *nodeformat; /* node name of the format layer */
|
|
char *nodestorage; /* node name of the storage backing the format node */
|
|
|
|
qemuBlockNodeNameBackingChainDataPtr backing;
|
|
|
|
/* for testing purposes */
|
|
char *drvformat;
|
|
char *drvstorage;
|
|
};
|
|
|
|
virHashTablePtr
|
|
qemuBlockNodeNameGetBackingChain(virJSONValuePtr namednodesdata,
|
|
virJSONValuePtr blockstats);
|
|
|
|
int
|
|
qemuBlockNodeNamesDetect(virQEMUDriverPtr driver,
|
|
virDomainObjPtr vm,
|
|
qemuDomainAsyncJob asyncJob);
|
|
|
|
virHashTablePtr
|
|
qemuBlockGetNodeData(virJSONValuePtr data);
|
|
|
|
bool
|
|
qemuBlockStorageSourceSupportsConcurrentAccess(virStorageSourcePtr src);
|
|
|
|
virJSONValuePtr
|
|
qemuBlockStorageSourceGetBackendProps(virStorageSourcePtr src,
|
|
bool legacy,
|
|
bool onlytarget,
|
|
bool autoreadonly);
|
|
|
|
virURIPtr
|
|
qemuBlockStorageSourceGetURI(virStorageSourcePtr src);
|
|
|
|
virJSONValuePtr
|
|
qemuBlockStorageSourceGetBlockdevProps(virStorageSourcePtr src,
|
|
virStorageSourcePtr backingStore);
|
|
|
|
virJSONValuePtr
|
|
qemuBlockStorageGetCopyOnReadProps(virDomainDiskDefPtr disk);
|
|
|
|
typedef struct qemuBlockStorageSourceAttachData qemuBlockStorageSourceAttachData;
|
|
typedef qemuBlockStorageSourceAttachData *qemuBlockStorageSourceAttachDataPtr;
|
|
struct qemuBlockStorageSourceAttachData {
|
|
virJSONValuePtr prmgrProps;
|
|
char *prmgrAlias;
|
|
|
|
virJSONValuePtr storageProps;
|
|
const char *storageNodeName;
|
|
bool storageAttached;
|
|
|
|
virJSONValuePtr storageSliceProps;
|
|
const char *storageSliceNodeName;
|
|
bool storageSliceAttached;
|
|
|
|
virJSONValuePtr formatProps;
|
|
const char *formatNodeName;
|
|
bool formatAttached;
|
|
|
|
char *driveCmd;
|
|
char *driveAlias;
|
|
bool driveAdded;
|
|
|
|
virJSONValuePtr authsecretProps;
|
|
char *authsecretAlias;
|
|
|
|
virJSONValuePtr encryptsecretProps;
|
|
char *encryptsecretAlias;
|
|
|
|
virJSONValuePtr httpcookiesecretProps;
|
|
char *httpcookiesecretAlias;
|
|
|
|
virJSONValuePtr tlsProps;
|
|
char *tlsAlias;
|
|
};
|
|
|
|
|
|
void
|
|
qemuBlockStorageSourceAttachDataFree(qemuBlockStorageSourceAttachDataPtr data);
|
|
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(qemuBlockStorageSourceAttachData,
|
|
qemuBlockStorageSourceAttachDataFree);
|
|
|
|
qemuBlockStorageSourceAttachDataPtr
|
|
qemuBlockStorageSourceAttachPrepareBlockdev(virStorageSourcePtr src,
|
|
virStorageSourcePtr backingStore,
|
|
bool autoreadonly);
|
|
|
|
qemuBlockStorageSourceAttachDataPtr
|
|
qemuBlockStorageSourceDetachPrepare(virStorageSourcePtr src,
|
|
char *driveAlias);
|
|
|
|
int
|
|
qemuBlockStorageSourceAttachApply(qemuMonitorPtr mon,
|
|
qemuBlockStorageSourceAttachDataPtr data);
|
|
|
|
void
|
|
qemuBlockStorageSourceAttachRollback(qemuMonitorPtr mon,
|
|
qemuBlockStorageSourceAttachDataPtr data);
|
|
|
|
int
|
|
qemuBlockStorageSourceDetachOneBlockdev(virQEMUDriverPtr driver,
|
|
virDomainObjPtr vm,
|
|
qemuDomainAsyncJob asyncJob,
|
|
virStorageSourcePtr src);
|
|
|
|
struct _qemuBlockStorageSourceChainData {
|
|
qemuBlockStorageSourceAttachDataPtr *srcdata;
|
|
size_t nsrcdata;
|
|
};
|
|
|
|
typedef struct _qemuBlockStorageSourceChainData qemuBlockStorageSourceChainData;
|
|
typedef qemuBlockStorageSourceChainData *qemuBlockStorageSourceChainDataPtr;
|
|
|
|
void
|
|
qemuBlockStorageSourceChainDataFree(qemuBlockStorageSourceChainDataPtr data);
|
|
|
|
qemuBlockStorageSourceChainDataPtr
|
|
qemuBlockStorageSourceChainDetachPrepareBlockdev(virStorageSourcePtr src);
|
|
qemuBlockStorageSourceChainDataPtr
|
|
qemuBlockStorageSourceChainDetachPrepareDrive(virStorageSourcePtr src,
|
|
char *driveAlias);
|
|
|
|
int
|
|
qemuBlockStorageSourceChainAttach(qemuMonitorPtr mon,
|
|
qemuBlockStorageSourceChainDataPtr data);
|
|
|
|
void
|
|
qemuBlockStorageSourceChainDetach(qemuMonitorPtr mon,
|
|
qemuBlockStorageSourceChainDataPtr data);
|
|
|
|
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(qemuBlockStorageSourceChainData,
|
|
qemuBlockStorageSourceChainDataFree);
|
|
|
|
int
|
|
qemuBlockSnapshotAddLegacy(virJSONValuePtr actions,
|
|
virDomainDiskDefPtr disk,
|
|
virStorageSourcePtr newsrc,
|
|
bool reuse);
|
|
|
|
int
|
|
qemuBlockSnapshotAddBlockdev(virJSONValuePtr actions,
|
|
virDomainDiskDefPtr disk,
|
|
virStorageSourcePtr newsrc);
|
|
|
|
char *
|
|
qemuBlockGetBackingStoreString(virStorageSourcePtr src,
|
|
bool pretty)
|
|
ATTRIBUTE_NONNULL(1);
|
|
|
|
int
|
|
qemuBlockStorageSourceCreateGetFormatProps(virStorageSourcePtr src,
|
|
virStorageSourcePtr backing,
|
|
virJSONValuePtr *props)
|
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3) G_GNUC_WARN_UNUSED_RESULT;
|
|
|
|
int
|
|
qemuBlockStorageSourceCreateGetStorageProps(virStorageSourcePtr src,
|
|
virJSONValuePtr *props)
|
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) G_GNUC_WARN_UNUSED_RESULT;
|
|
|
|
int
|
|
qemuBlockStorageSourceCreate(virDomainObjPtr vm,
|
|
virStorageSourcePtr src,
|
|
virStorageSourcePtr backingStore,
|
|
virStorageSourcePtr chain,
|
|
qemuBlockStorageSourceAttachDataPtr data,
|
|
qemuDomainAsyncJob asyncJob);
|
|
|
|
int
|
|
qemuBlockStorageSourceCreateDetectSize(virHashTablePtr blockNamedNodeData,
|
|
virStorageSourcePtr src,
|
|
virStorageSourcePtr templ);
|
|
|
|
int
|
|
qemuBlockRemoveImageMetadata(virQEMUDriverPtr driver,
|
|
virDomainObjPtr vm,
|
|
const char *diskTarget,
|
|
virStorageSourcePtr src);
|
|
|
|
qemuBlockNamedNodeDataBitmapPtr
|
|
qemuBlockNamedNodeDataGetBitmapByName(virHashTablePtr blockNamedNodeData,
|
|
virStorageSourcePtr src,
|
|
const char *bitmap);
|
|
|
|
virHashTablePtr
|
|
qemuBlockGetNamedNodeData(virDomainObjPtr vm,
|
|
qemuDomainAsyncJob asyncJob);
|
|
|
|
bool
|
|
qemuBlockBitmapChainIsValid(virStorageSourcePtr src,
|
|
const char *bitmapname,
|
|
virHashTablePtr blockNamedNodeData);
|
|
|
|
int
|
|
qemuBlockBitmapsHandleBlockcopy(virStorageSourcePtr src,
|
|
virStorageSourcePtr mirror,
|
|
virHashTablePtr blockNamedNodeData,
|
|
bool shallow,
|
|
virJSONValuePtr *actions);
|
|
|
|
int
|
|
qemuBlockBitmapsHandleCommitStart(virStorageSourcePtr topsrc,
|
|
virStorageSourcePtr basesrc,
|
|
virHashTablePtr blockNamedNodeData,
|
|
virJSONValuePtr *actions,
|
|
char ***disabledBitmapsBase);
|
|
|
|
int
|
|
qemuBlockBitmapsHandleCommitFinish(virStorageSourcePtr topsrc,
|
|
virStorageSourcePtr basesrc,
|
|
virHashTablePtr blockNamedNodeData,
|
|
virJSONValuePtr *actions,
|
|
char **disabledBitmapsBase);
|
|
|
|
int
|
|
qemuBlockReopenReadWrite(virDomainObjPtr vm,
|
|
virStorageSourcePtr src,
|
|
qemuDomainAsyncJob asyncJob);
|
|
int
|
|
qemuBlockReopenReadOnly(virDomainObjPtr vm,
|
|
virStorageSourcePtr src,
|
|
qemuDomainAsyncJob asyncJob);
|
|
|
|
bool
|
|
qemuBlockStorageSourceNeedsStorageSliceLayer(const virStorageSource *src);
|
|
|
|
char *
|
|
qemuBlockStorageSourceGetCookieString(virStorageSourcePtr src);
|
|
|
|
int
|
|
qemuBlockUpdateRelativeBacking(virDomainObjPtr vm,
|
|
virStorageSourcePtr src,
|
|
virStorageSourcePtr topsrc);
|