mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-10-13 17:49:16 +00:00
ddce75fac0
No callers use it any more. Additionally if qemuBlockJobUpdate was called with the last reference of the job e.g. in qemuBlockJobRefreshJobs, the reading of the job state would happen from freed memory. Reported-by: Pavel Mores <pmores@redhat.com> Signed-off-by: Peter Krempa <pkrempa@redhat.com> Reviewed-by: Pavel Mores <pmores@redhat.com> Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
251 lines
8.1 KiB
C
251 lines
8.1 KiB
C
/*
|
|
* qemu_blockjob.h: helper functions for QEMU block jobs
|
|
*
|
|
* Copyright (C) 2006-2015 Red Hat, Inc.
|
|
* Copyright (C) 2006 Daniel P. Berrange
|
|
*
|
|
* 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"
|
|
|
|
/**
|
|
* This enum has to map all known block job states from enum virDomainBlockJobType
|
|
* to the same values. All internal blockjobs can be mapped after and don't
|
|
* need to have stable values.
|
|
*/
|
|
typedef enum {
|
|
/* Mapped to public enum */
|
|
QEMU_BLOCKJOB_STATE_COMPLETED = VIR_DOMAIN_BLOCK_JOB_COMPLETED,
|
|
QEMU_BLOCKJOB_STATE_FAILED = VIR_DOMAIN_BLOCK_JOB_FAILED,
|
|
QEMU_BLOCKJOB_STATE_CANCELLED = VIR_DOMAIN_BLOCK_JOB_CANCELED,
|
|
QEMU_BLOCKJOB_STATE_READY = VIR_DOMAIN_BLOCK_JOB_READY,
|
|
/* Additional enum values local to qemu */
|
|
QEMU_BLOCKJOB_STATE_NEW,
|
|
QEMU_BLOCKJOB_STATE_RUNNING,
|
|
QEMU_BLOCKJOB_STATE_CONCLUDED, /* job has finished, but it's unknown
|
|
whether it has failed or not */
|
|
QEMU_BLOCKJOB_STATE_ABORTING,
|
|
QEMU_BLOCKJOB_STATE_PIVOTING,
|
|
QEMU_BLOCKJOB_STATE_LAST
|
|
} qemuBlockjobState;
|
|
G_STATIC_ASSERT((int)QEMU_BLOCKJOB_STATE_NEW == VIR_DOMAIN_BLOCK_JOB_LAST);
|
|
|
|
VIR_ENUM_DECL(qemuBlockjobState);
|
|
|
|
/**
|
|
* This enum has to map all known block job types from enum virDomainBlockJobType
|
|
* to the same values. All internal blockjobs can be mapped after and don't
|
|
* need to have stable values.
|
|
*/
|
|
typedef enum {
|
|
/* Mapped to public enum */
|
|
QEMU_BLOCKJOB_TYPE_NONE = VIR_DOMAIN_BLOCK_JOB_TYPE_UNKNOWN,
|
|
QEMU_BLOCKJOB_TYPE_PULL = VIR_DOMAIN_BLOCK_JOB_TYPE_PULL,
|
|
QEMU_BLOCKJOB_TYPE_COPY = VIR_DOMAIN_BLOCK_JOB_TYPE_COPY,
|
|
QEMU_BLOCKJOB_TYPE_COMMIT = VIR_DOMAIN_BLOCK_JOB_TYPE_COMMIT,
|
|
QEMU_BLOCKJOB_TYPE_ACTIVE_COMMIT = VIR_DOMAIN_BLOCK_JOB_TYPE_ACTIVE_COMMIT,
|
|
QEMU_BLOCKJOB_TYPE_BACKUP = VIR_DOMAIN_BLOCK_JOB_TYPE_BACKUP,
|
|
/* Additional enum values local to qemu */
|
|
QEMU_BLOCKJOB_TYPE_INTERNAL,
|
|
QEMU_BLOCKJOB_TYPE_CREATE,
|
|
QEMU_BLOCKJOB_TYPE_BROKEN,
|
|
QEMU_BLOCKJOB_TYPE_LAST
|
|
} qemuBlockJobType;
|
|
G_STATIC_ASSERT((int)QEMU_BLOCKJOB_TYPE_INTERNAL == VIR_DOMAIN_BLOCK_JOB_TYPE_LAST);
|
|
|
|
VIR_ENUM_DECL(qemuBlockjob);
|
|
|
|
|
|
typedef struct _qemuBlockJobPullData qemuBlockJobPullData;
|
|
typedef qemuBlockJobPullData *qemuBlockJobDataPullPtr;
|
|
|
|
struct _qemuBlockJobPullData {
|
|
virStorageSourcePtr base;
|
|
};
|
|
|
|
|
|
typedef struct _qemuBlockJobCommitData qemuBlockJobCommitData;
|
|
typedef qemuBlockJobCommitData *qemuBlockJobDataCommitPtr;
|
|
|
|
struct _qemuBlockJobCommitData {
|
|
virStorageSourcePtr topparent;
|
|
virStorageSourcePtr top;
|
|
virStorageSourcePtr base;
|
|
bool deleteCommittedImages;
|
|
char **disabledBitmapsBase; /* a NULL-terminated list of bitmap names which
|
|
were disabled in @base for the commit job */
|
|
};
|
|
|
|
|
|
typedef struct _qemuBlockJobCreateData qemuBlockJobCreateData;
|
|
typedef qemuBlockJobCreateData *qemuBlockJobDataCreatePtr;
|
|
|
|
struct _qemuBlockJobCreateData {
|
|
bool storage;
|
|
virStorageSourcePtr src;
|
|
};
|
|
|
|
|
|
typedef struct _qemuBlockJobCopyData qemuBlockJobCopyData;
|
|
typedef qemuBlockJobCopyData *qemuBlockJobDataCopyPtr;
|
|
|
|
struct _qemuBlockJobCopyData {
|
|
bool shallownew;
|
|
};
|
|
|
|
|
|
typedef struct _qemuBlockJobBackupData qemuBlockJobBackupData;
|
|
typedef qemuBlockJobBackupData *qemuBlockJobDataBackupPtr;
|
|
|
|
struct _qemuBlockJobBackupData {
|
|
virStorageSourcePtr store;
|
|
char *bitmap;
|
|
};
|
|
|
|
|
|
typedef struct _qemuBlockJobData qemuBlockJobData;
|
|
typedef qemuBlockJobData *qemuBlockJobDataPtr;
|
|
|
|
struct _qemuBlockJobData {
|
|
virObject parent;
|
|
|
|
char *name;
|
|
|
|
virDomainDiskDefPtr disk; /* may be NULL, if blockjob does not correspond to any disk */
|
|
virStorageSourcePtr chain; /* Reference to the chain the job operates on. */
|
|
virStorageSourcePtr mirrorChain; /* reference to 'mirror' part of the job */
|
|
|
|
unsigned int jobflags; /* per job flags */
|
|
bool jobflagsmissing; /* job flags were not stored */
|
|
|
|
union {
|
|
qemuBlockJobPullData pull;
|
|
qemuBlockJobCommitData commit;
|
|
qemuBlockJobCreateData create;
|
|
qemuBlockJobCopyData copy;
|
|
qemuBlockJobBackupData backup;
|
|
} data;
|
|
|
|
int type; /* qemuBlockJobType */
|
|
int state; /* qemuBlockjobState */
|
|
char *errmsg;
|
|
bool synchronous; /* API call is waiting for this job */
|
|
|
|
int newstate; /* qemuBlockjobState, subset of events emitted by qemu */
|
|
|
|
int brokentype; /* the previous type of a broken blockjob qemuBlockJobType */
|
|
|
|
bool invalidData; /* the job data (except name) is not valid */
|
|
bool reconnected; /* internal field for tracking whether job is live after reconnect to qemu */
|
|
};
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(qemuBlockJobData, virObjectUnref);
|
|
|
|
int
|
|
qemuBlockJobRegister(qemuBlockJobDataPtr job,
|
|
virDomainObjPtr vm,
|
|
virDomainDiskDefPtr disk,
|
|
bool savestatus)
|
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
|
|
|
|
qemuBlockJobDataPtr
|
|
qemuBlockJobDataNew(qemuBlockJobType type,
|
|
const char *name)
|
|
ATTRIBUTE_NONNULL(2);
|
|
|
|
qemuBlockJobDataPtr
|
|
qemuBlockJobDiskNew(virDomainObjPtr vm,
|
|
virDomainDiskDefPtr disk,
|
|
qemuBlockJobType type,
|
|
const char *jobname)
|
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(4);
|
|
|
|
qemuBlockJobDataPtr
|
|
qemuBlockJobDiskNewPull(virDomainObjPtr vm,
|
|
virDomainDiskDefPtr disk,
|
|
virStorageSourcePtr base,
|
|
unsigned int jobflags);
|
|
|
|
qemuBlockJobDataPtr
|
|
qemuBlockJobDiskNewCommit(virDomainObjPtr vm,
|
|
virDomainDiskDefPtr disk,
|
|
virStorageSourcePtr topparent,
|
|
virStorageSourcePtr top,
|
|
virStorageSourcePtr base,
|
|
char ***disabledBitmapsBase,
|
|
bool delete_imgs,
|
|
unsigned int jobflags);
|
|
|
|
qemuBlockJobDataPtr
|
|
qemuBlockJobNewCreate(virDomainObjPtr vm,
|
|
virStorageSourcePtr src,
|
|
virStorageSourcePtr chain,
|
|
bool storage);
|
|
|
|
qemuBlockJobDataPtr
|
|
qemuBlockJobDiskNewCopy(virDomainObjPtr vm,
|
|
virDomainDiskDefPtr disk,
|
|
virStorageSourcePtr mirror,
|
|
bool shallow,
|
|
bool reuse,
|
|
unsigned int jobflags);
|
|
|
|
qemuBlockJobDataPtr
|
|
qemuBlockJobDiskNewBackup(virDomainObjPtr vm,
|
|
virDomainDiskDefPtr disk,
|
|
virStorageSourcePtr store,
|
|
const char *bitmap);
|
|
|
|
qemuBlockJobDataPtr
|
|
qemuBlockJobDiskGetJob(virDomainDiskDefPtr disk)
|
|
ATTRIBUTE_NONNULL(1);
|
|
|
|
void
|
|
qemuBlockJobStarted(qemuBlockJobDataPtr job,
|
|
virDomainObjPtr vm)
|
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
|
|
|
|
bool
|
|
qemuBlockJobIsRunning(qemuBlockJobDataPtr job)
|
|
ATTRIBUTE_NONNULL(1);
|
|
|
|
void
|
|
qemuBlockJobStartupFinalize(virDomainObjPtr vm,
|
|
qemuBlockJobDataPtr job);
|
|
|
|
int
|
|
qemuBlockJobRefreshJobs(virQEMUDriverPtr driver,
|
|
virDomainObjPtr vm);
|
|
|
|
void
|
|
qemuBlockJobUpdate(virDomainObjPtr vm,
|
|
qemuBlockJobDataPtr job,
|
|
int asyncJob);
|
|
|
|
void qemuBlockJobSyncBegin(qemuBlockJobDataPtr job);
|
|
void qemuBlockJobSyncEnd(virDomainObjPtr vm,
|
|
qemuBlockJobDataPtr job,
|
|
int asyncJob);
|
|
|
|
qemuBlockJobDataPtr
|
|
qemuBlockJobGetByDisk(virDomainDiskDefPtr disk)
|
|
ATTRIBUTE_NONNULL(1) G_GNUC_WARN_UNUSED_RESULT;
|
|
|
|
qemuBlockjobState
|
|
qemuBlockjobConvertMonitorStatus(int monitorstatus);
|