qemu_domain.h 26.9 KB
Newer Older
1 2 3
/*
 * qemu_domain.h: QEMU domain private state
 *
4
 * Copyright (C) 2006-2016 Red Hat, Inc.
5 6 7 8 9 10 11 12 13 14 15 16 17
 * 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
18
 * License along with this library.  If not, see
O
Osier Yang 已提交
19
 * <http://www.gnu.org/licenses/>.
20 21 22 23 24 25 26
 *
 * Author: Daniel P. Berrange <berrange@redhat.com>
 */

#ifndef __QEMU_DOMAIN_H__
# define __QEMU_DOMAIN_H__

27
# include "virthread.h"
28
# include "vircgroup.h"
29
# include "virperf.h"
30
# include "domain_addr.h"
31
# include "domain_conf.h"
32
# include "snapshot_conf.h"
33
# include "qemu_monitor.h"
D
Daniel P. Berrange 已提交
34
# include "qemu_agent.h"
35
# include "qemu_conf.h"
36
# include "qemu_capabilities.h"
37
# include "virchrdev.h"
38
# include "virobject.h"
39
# include "logging/log_manager.h"
40

41 42 43 44
# define QEMU_DOMAIN_FORMAT_LIVE_FLAGS      \
    (VIR_DOMAIN_XML_SECURE |                \
     VIR_DOMAIN_XML_UPDATE_CPU)

45 46 47
# if ULONG_MAX == 4294967295
/* Qemu has a 64-bit limit, but we are limited by our historical choice of
 * representing bandwidth in a long instead of a 64-bit int.  */
48
#  define QEMU_DOMAIN_MIG_BANDWIDTH_MAX ULONG_MAX
49
# else
50
#  define QEMU_DOMAIN_MIG_BANDWIDTH_MAX (INT64_MAX / (1024 * 1024))
51
# endif
52

53
# define JOB_MASK(job)                  (1 << (job - 1))
54
# define QEMU_JOB_DEFAULT_MASK          \
55 56 57
    (JOB_MASK(QEMU_JOB_QUERY) |         \
     JOB_MASK(QEMU_JOB_DESTROY) |       \
     JOB_MASK(QEMU_JOB_ABORT))
58

59 60 61 62 63
/* Jobs which have to be tracked in domain state XML. */
# define QEMU_DOMAIN_TRACK_JOBS         \
    (JOB_MASK(QEMU_JOB_DESTROY) |       \
     JOB_MASK(QEMU_JOB_ASYNC))

64 65 66
/* Only 1 job is allowed at any time
 * A job includes *all* monitor commands, even those just querying
 * information, not merely actions */
67
typedef enum {
68
    QEMU_JOB_NONE = 0,  /* Always set to 0 for easy if (jobActive) conditions */
69 70 71 72
    QEMU_JOB_QUERY,         /* Doesn't change any state */
    QEMU_JOB_DESTROY,       /* Destroys the domain (cannot be masked out) */
    QEMU_JOB_SUSPEND,       /* Suspends (stops vCPUs) the domain */
    QEMU_JOB_MODIFY,        /* May change state */
73
    QEMU_JOB_ABORT,         /* Abort current async job */
74
    QEMU_JOB_MIGRATION_OP,  /* Operation influencing outgoing migration */
75

76
    /* The following two items must always be the last items before JOB_LAST */
77 78
    QEMU_JOB_ASYNC,         /* Asynchronous job */
    QEMU_JOB_ASYNC_NESTED,  /* Normal job within an async job */
79 80

    QEMU_JOB_LAST
81
} qemuDomainJob;
82
VIR_ENUM_DECL(qemuDomainJob)
83 84 85 86 87

/* Async job consists of a series of jobs that may change state. Independent
 * jobs that do not change state (and possibly others if explicitly allowed by
 * current async job) are allowed to be run even if async job is active.
 */
88
typedef enum {
89 90 91 92 93
    QEMU_ASYNC_JOB_NONE = 0,
    QEMU_ASYNC_JOB_MIGRATION_OUT,
    QEMU_ASYNC_JOB_MIGRATION_IN,
    QEMU_ASYNC_JOB_SAVE,
    QEMU_ASYNC_JOB_DUMP,
94
    QEMU_ASYNC_JOB_SNAPSHOT,
95
    QEMU_ASYNC_JOB_START,
96 97

    QEMU_ASYNC_JOB_LAST
98
} qemuDomainAsyncJob;
99
VIR_ENUM_DECL(qemuDomainAsyncJob)
100

J
Jiri Denemark 已提交
101 102 103 104 105
typedef struct _qemuDomainJobInfo qemuDomainJobInfo;
typedef qemuDomainJobInfo *qemuDomainJobInfoPtr;
struct _qemuDomainJobInfo {
    virDomainJobType type;
    unsigned long long started; /* When the async job started */
106
    unsigned long long stopped; /* When the domain's CPUs were stopped */
107 108 109 110
    unsigned long long sent; /* When the source sent status info to the
                                destination (only for migrations). */
    unsigned long long received; /* When the destination host received status
                                    info from the source (migrations only). */
J
Jiri Denemark 已提交
111 112 113
    /* Computed values */
    unsigned long long timeElapsed;
    unsigned long long timeRemaining;
J
Jiri Denemark 已提交
114
    long long timeDelta; /* delta = received - sent, i.e., the difference
115 116 117 118 119
                            between the source and the destination time plus
                            the time between the end of Perform phase on the
                            source and the beginning of Finish phase on the
                            destination. */
    bool timeDeltaSet;
J
Jiri Denemark 已提交
120
    /* Raw values from QEMU */
121
    qemuMonitorMigrationStats stats;
J
Jiri Denemark 已提交
122 123
};

124
struct qemuDomainJobObj {
125
    virCond cond;                       /* Use to coordinate jobs */
126
    qemuDomainJob active;               /* Currently running job */
127
    unsigned long long owner;           /* Thread id which set current job */
128
    const char *ownerAPI;               /* The API which owns the job */
J
Jiri Denemark 已提交
129
    unsigned long long started;         /* When the current job started */
130

131
    virCond asyncCond;                  /* Use to coordinate with async jobs */
132
    qemuDomainAsyncJob asyncJob;        /* Currently active async job */
133
    unsigned long long asyncOwner;      /* Thread which set current async job */
134
    const char *asyncOwnerAPI;          /* The API which owns the async job */
J
Jiri Denemark 已提交
135
    unsigned long long asyncStarted;    /* When the current async job started */
J
Jiri Denemark 已提交
136
    int phase;                          /* Job phase (mainly for migrations) */
137
    unsigned long long mask;            /* Jobs allowed during async job */
138
    bool dump_memory_only;              /* use dump-guest-memory to do dump */
J
Jiri Denemark 已提交
139
    qemuDomainJobInfoPtr current;       /* async job progress data */
140
    qemuDomainJobInfoPtr completed;     /* statistics data of a recently completed job */
141
    bool abortJob;                      /* abort of the job requested */
142 143
    bool spiceMigration;                /* we asked for spice migration and we
                                         * should wait for it to finish */
144
    bool spiceMigrated;                 /* spice migration completed */
145
    bool postcopyEnabled;               /* post-copy migration was enabled */
146 147
};

148
typedef void (*qemuDomainCleanupCallback)(virQEMUDriverPtr driver,
149 150
                                          virDomainObjPtr vm);

J
John Ferlan 已提交
151
# define QEMU_DOMAIN_MASTER_KEY_LEN 32  /* 32 bytes for 256 bit random key */
152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167


/* helper data types for async device unplug */
typedef enum {
    QEMU_DOMAIN_UNPLUGGING_DEVICE_STATUS_NONE = 0,
    QEMU_DOMAIN_UNPLUGGING_DEVICE_STATUS_OK,
    QEMU_DOMAIN_UNPLUGGING_DEVICE_STATUS_GUEST_REJECTED,
} qemuDomainUnpluggingDeviceStatus;

typedef struct _qemuDomainUnpluggingDevice qemuDomainUnpluggingDevice;
typedef qemuDomainUnpluggingDevice *qemuDomainUnpluggingDevicePtr;
struct _qemuDomainUnpluggingDevice {
    const char *alias;
    qemuDomainUnpluggingDeviceStatus status;
};

168 169 170
typedef struct _qemuDomainObjPrivate qemuDomainObjPrivate;
typedef qemuDomainObjPrivate *qemuDomainObjPrivatePtr;
struct _qemuDomainObjPrivate {
171
    struct qemuDomainJobObj job;
172 173

    qemuMonitorPtr mon;
174
    virDomainChrSourceDefPtr monConfig;
E
Eric Blake 已提交
175
    bool monJSON;
176 177
    bool monError;
    unsigned long long monStart;
D
Daniel P. Berrange 已提交
178 179 180 181 182

    qemuAgentPtr agent;
    bool agentError;
    unsigned long long agentStart;

183
    bool gotShutdown;
184
    bool beingDestroyed;
185
    char *pidfile;
186

187
    virDomainPCIAddressSetPtr pciaddrs;
J
Ján Tomko 已提交
188
    virDomainCCWAddressSetPtr ccwaddrs;
189
    virDomainVirtioSerialAddrSetPtr vioserialaddrs;
190

191
    virQEMUCapsPtr qemuCaps;
192
    char *lockState;
193 194

    bool fakeReboot;
195 196

    int jobs_queued;
197 198

    unsigned long migMaxBandwidth;
J
Jiri Denemark 已提交
199
    char *origname;
200
    int nbdPort; /* Port used for migration with NBD */
201
    unsigned short migrationPort;
202
    int preMigrationState;
203

204
    virChrdevsPtr devs;
205 206 207 208

    qemuDomainCleanupCallback *cleanupCallbacks;
    size_t ncleanupCallbacks;
    size_t ncleanupCallbacks_max;
209 210

    virCgroupPtr cgroup;
211

212 213
    virPerfPtr perf;

214 215
    qemuDomainUnpluggingDevice unplug;

216
    char **qemuDevices; /* NULL-terminated list of devices aliases known to QEMU */
217 218

    bool hookRun;  /* true if there was a hook run over this domain */
219 220

    /* Bitmaps below hold data from the auto NUMA feature */
221
    virBitmapPtr autoNodeset;
222
    virBitmapPtr autoCpuset;
223 224 225

    bool signalIOError; /* true if the domain condition should be signalled on
                           I/O error */
226 227
    bool signalStop; /* true if the domain condition should be signalled on
                        QMP STOP event */
228
    char *machineName;
229 230
    char *libDir;            /* base path for per-domain files */
    char *channelTargetDir;  /* base path for per-domain channel targets */
J
John Ferlan 已提交
231 232 233 234 235

    /* random masterKey and length for encryption (not to be saved in our */
    /* private XML) - need to restore at process reconnect */
    uint8_t *masterKey;
    size_t masterKeyLen;
236 237
};

238 239
/* Type of domain secret */
typedef enum {
240
    VIR_DOMAIN_SECRET_INFO_TYPE_PLAIN = 0,
241
    VIR_DOMAIN_SECRET_INFO_TYPE_AES,  /* utilize GNUTLS_CIPHER_AES_256_CBC */
242

243
    VIR_DOMAIN_SECRET_INFO_TYPE_LAST
244 245 246 247 248 249
} qemuDomainSecretInfoType;

typedef struct _qemuDomainSecretPlain qemuDomainSecretPlain;
typedef struct _qemuDomainSecretPlain *qemuDomainSecretPlainPtr;
struct _qemuDomainSecretPlain {
    char *username;
250 251
    uint8_t *secret;
    size_t secretlen;
252 253
};

254 255
# define QEMU_DOMAIN_AES_IV_LEN 16   /* 16 bytes for 128 bit random */
                                     /*    initialization vector */
256 257 258
typedef struct _qemuDomainSecretAES qemuDomainSecretAES;
typedef struct _qemuDomainSecretAES *qemuDomainSecretAESPtr;
struct _qemuDomainSecretAES {
J
John Ferlan 已提交
259 260 261 262 263 264
    char *username;
    char *alias;      /* generated alias for secret */
    char *iv;         /* base64 encoded initialization vector */
    char *ciphertext; /* encoded/encrypted secret */
};

265 266 267
typedef struct _qemuDomainSecretInfo qemuDomainSecretInfo;
typedef qemuDomainSecretInfo *qemuDomainSecretInfoPtr;
struct _qemuDomainSecretInfo {
268
    qemuDomainSecretInfoType type;
269 270
    union {
        qemuDomainSecretPlain plain;
271
        qemuDomainSecretAES aes;
272 273 274
    } s;
};

275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291
# define QEMU_DOMAIN_DISK_PRIVATE(disk)	\
    ((qemuDomainDiskPrivatePtr) (disk)->privateData)

typedef struct _qemuDomainDiskPrivate qemuDomainDiskPrivate;
typedef qemuDomainDiskPrivate *qemuDomainDiskPrivatePtr;
struct _qemuDomainDiskPrivate {
    virObject parent;

    /* ideally we want a smarter way to interlock block jobs on single qemu disk
     * in the future, but for now we just disallow any concurrent job on a
     * single disk */
    bool blockjob;

    /* for some synchronous block jobs, we need to notify the owner */
    int blockJobType;   /* type of the block job from the event */
    int blockJobStatus; /* status of the finished block job */
    bool blockJobSync; /* the block job needs synchronized termination */
292 293

    bool migrating; /* the disk is being migrated */
294 295 296 297

    /* for storage devices using auth/secret
     * NB: *not* to be written to qemu domain object XML */
    qemuDomainSecretInfoPtr secinfo;
298

J
John Ferlan 已提交
299 300 301 302 303
    /* for storage devices using encryption/secret
     * Can have both <auth> and <encryption> for some disks
     * NB:*not* to be written to qemu domain object XML */
    qemuDomainSecretInfoPtr encinfo;

304 305 306
    /* information about the device */
    bool tray; /* device has tray */
    bool removable; /* device media can be removed/changed */
307 308
};

309 310 311
# define QEMU_DOMAIN_HOSTDEV_PRIVATE(hostdev)	\
    ((qemuDomainHostdevPrivatePtr) (hostdev)->privateData)

312 313 314 315 316 317

typedef struct _qemuDomainVcpuPrivate qemuDomainVcpuPrivate;
typedef qemuDomainVcpuPrivate *qemuDomainVcpuPrivatePtr;
struct _qemuDomainVcpuPrivate {
    virObject parent;

318
    pid_t tid; /* vcpu thread id */
319 320 321 322 323 324
};

# define QEMU_DOMAIN_VCPU_PRIVATE(vcpu)    \
    ((qemuDomainVcpuPrivatePtr) (vcpu)->privateData)


325 326 327
struct qemuDomainDiskInfo {
    bool removable;
    bool locked;
328
    bool tray;
329
    bool tray_open;
330
    bool empty;
331 332 333
    int io_status;
};

334 335 336 337 338 339 340 341 342 343
typedef struct _qemuDomainHostdevPrivate qemuDomainHostdevPrivate;
typedef qemuDomainHostdevPrivate *qemuDomainHostdevPrivatePtr;
struct _qemuDomainHostdevPrivate {
    virObject parent;

    /* for hostdev storage devices using auth/secret
     * NB: *not* to be written to qemu domain object XML */
    qemuDomainSecretInfoPtr secinfo;
};

C
Chen Fan 已提交
344 345
typedef enum {
    QEMU_PROCESS_EVENT_WATCHDOG = 0,
346
    QEMU_PROCESS_EVENT_GUESTPANIC,
347
    QEMU_PROCESS_EVENT_DEVICE_DELETED,
348
    QEMU_PROCESS_EVENT_NIC_RX_FILTER_CHANGED,
349
    QEMU_PROCESS_EVENT_SERIAL_CHANGED,
350
    QEMU_PROCESS_EVENT_BLOCK_JOB,
351
    QEMU_PROCESS_EVENT_MONITOR_EOF,
C
Chen Fan 已提交
352 353 354 355 356

    QEMU_PROCESS_EVENT_LAST
} qemuProcessEventType;

struct qemuProcessEvent {
357
    virDomainObjPtr vm;
C
Chen Fan 已提交
358
    qemuProcessEventType eventType;
359
    int action;
360
    int status;
361
    void *data;
362 363
};

364 365 366
typedef struct _qemuDomainLogContext qemuDomainLogContext;
typedef qemuDomainLogContext *qemuDomainLogContextPtr;

367
const char *qemuDomainAsyncJobPhaseToString(qemuDomainAsyncJob job,
J
Jiri Denemark 已提交
368
                                            int phase);
369
int qemuDomainAsyncJobPhaseFromString(qemuDomainAsyncJob job,
J
Jiri Denemark 已提交
370 371
                                      const char *phase);

372
void qemuDomainEventFlush(int timer, void *opaque);
373

374
void qemuDomainEventQueue(virQEMUDriverPtr driver,
375
                          virObjectEventPtr event);
376 377
void qemuDomainEventEmitJobCompleted(virQEMUDriverPtr driver,
                                     virDomainObjPtr vm);
378

379
int qemuDomainObjBeginJob(virQEMUDriverPtr driver,
380
                          virDomainObjPtr obj,
381
                          qemuDomainJob job)
382
    ATTRIBUTE_RETURN_CHECK;
383
int qemuDomainObjBeginAsyncJob(virQEMUDriverPtr driver,
384
                               virDomainObjPtr obj,
385
                               qemuDomainAsyncJob asyncJob)
386
    ATTRIBUTE_RETURN_CHECK;
387 388 389 390
int qemuDomainObjBeginNestedJob(virQEMUDriverPtr driver,
                                virDomainObjPtr obj,
                                qemuDomainAsyncJob asyncJob)
    ATTRIBUTE_RETURN_CHECK;
391

392 393 394 395
void qemuDomainObjEndJob(virQEMUDriverPtr driver,
                         virDomainObjPtr obj);
void qemuDomainObjEndAsyncJob(virQEMUDriverPtr driver,
                              virDomainObjPtr obj);
396
void qemuDomainObjAbortAsyncJob(virDomainObjPtr obj);
397
void qemuDomainObjSetJobPhase(virQEMUDriverPtr driver,
J
Jiri Denemark 已提交
398 399
                              virDomainObjPtr obj,
                              int phase);
400 401
void qemuDomainObjSetAsyncJobMask(virDomainObjPtr obj,
                                  unsigned long long allowedJobs);
402 403
void qemuDomainObjRestoreJob(virDomainObjPtr obj,
                             struct qemuDomainJobObj *job);
404
void qemuDomainObjDiscardAsyncJob(virQEMUDriverPtr driver,
405
                                  virDomainObjPtr obj);
406
void qemuDomainObjReleaseAsyncJob(virDomainObjPtr obj);
407

408 409
qemuMonitorPtr qemuDomainGetMonitor(virDomainObjPtr vm)
    ATTRIBUTE_NONNULL(1);
410
void qemuDomainObjEnterMonitor(virQEMUDriverPtr driver,
411 412
                               virDomainObjPtr obj)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
413 414
int qemuDomainObjExitMonitor(virQEMUDriverPtr driver,
                             virDomainObjPtr obj)
415 416
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2)
    ATTRIBUTE_RETURN_CHECK;
417
int qemuDomainObjEnterMonitorAsync(virQEMUDriverPtr driver,
418
                                   virDomainObjPtr obj,
419
                                   qemuDomainAsyncJob asyncJob)
420
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
D
Daniel P. Berrange 已提交
421 422


423
qemuAgentPtr qemuDomainGetAgent(virDomainObjPtr vm);
424 425 426 427
void qemuDomainObjEnterAgent(virDomainObjPtr obj)
    ATTRIBUTE_NONNULL(1);
void qemuDomainObjExitAgent(virDomainObjPtr obj)
    ATTRIBUTE_NONNULL(1);
D
Daniel P. Berrange 已提交
428 429


430 431 432 433
void qemuDomainObjEnterRemote(virDomainObjPtr obj)
    ATTRIBUTE_NONNULL(1);
void qemuDomainObjExitRemote(virDomainObjPtr obj)
    ATTRIBUTE_NONNULL(1);
434

435 436 437 438
virDomainDefPtr qemuDomainDefCopy(virQEMUDriverPtr driver,
                                  virDomainDefPtr src,
                                  unsigned int flags);

439
int qemuDomainDefFormatBuf(virQEMUDriverPtr driver,
440 441 442 443
                           virDomainDefPtr vm,
                           unsigned int flags,
                           virBuffer *buf);

444
char *qemuDomainDefFormatXML(virQEMUDriverPtr driver,
445
                             virDomainDefPtr vm,
446
                             unsigned int flags);
447

448
char *qemuDomainFormatXML(virQEMUDriverPtr driver,
449
                          virDomainObjPtr vm,
450
                          unsigned int flags);
451

452
char *qemuDomainDefFormatLive(virQEMUDriverPtr driver,
453
                              virDomainDefPtr def,
454 455
                              bool inactive,
                              bool compatible);
456

457
void qemuDomainObjTaint(virQEMUDriverPtr driver,
458
                        virDomainObjPtr obj,
459
                        virDomainTaintFlags taint,
460
                        qemuDomainLogContextPtr logCtxt);
461

462
void qemuDomainObjCheckTaint(virQEMUDriverPtr driver,
463
                             virDomainObjPtr obj,
464
                             qemuDomainLogContextPtr logCtxt);
465
void qemuDomainObjCheckDiskTaint(virQEMUDriverPtr driver,
466
                                 virDomainObjPtr obj,
467
                                 virDomainDiskDefPtr disk,
468
                                 qemuDomainLogContextPtr logCtxt);
469 470 471
void qemuDomainObjCheckHostdevTaint(virQEMUDriverPtr driver,
                                    virDomainObjPtr obj,
                                    virDomainHostdevDefPtr disk,
472
                                    qemuDomainLogContextPtr logCtxt);
473
void qemuDomainObjCheckNetTaint(virQEMUDriverPtr driver,
474
                                virDomainObjPtr obj,
475
                                virDomainNetDefPtr net,
476
                                qemuDomainLogContextPtr logCtxt);
477

478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494
typedef enum {
    QEMU_DOMAIN_LOG_CONTEXT_MODE_START,
    QEMU_DOMAIN_LOG_CONTEXT_MODE_ATTACH,
    QEMU_DOMAIN_LOG_CONTEXT_MODE_STOP,
} qemuDomainLogContextMode;

qemuDomainLogContextPtr qemuDomainLogContextNew(virQEMUDriverPtr driver,
                                                virDomainObjPtr vm,
                                                qemuDomainLogContextMode mode);
int qemuDomainLogContextWrite(qemuDomainLogContextPtr ctxt,
                              const char *fmt, ...) ATTRIBUTE_FMT_PRINTF(2, 3);
ssize_t qemuDomainLogContextRead(qemuDomainLogContextPtr ctxt,
                                 char **msg);
int qemuDomainLogContextGetWriteFD(qemuDomainLogContextPtr ctxt);
void qemuDomainLogContextMarkPosition(qemuDomainLogContextPtr ctxt);
void qemuDomainLogContextRef(qemuDomainLogContextPtr ctxt);
void qemuDomainLogContextFree(qemuDomainLogContextPtr ctxt);
495

496 497
virLogManagerPtr qemuDomainLogContextGetManager(qemuDomainLogContextPtr ctxt);

498 499 500 501 502
int qemuDomainLogAppendMessage(virQEMUDriverPtr driver,
                               virDomainObjPtr vm,
                               const char *fmt,
                               ...) ATTRIBUTE_FMT_PRINTF(3, 4);

503
const char *qemuFindQemuImgBinary(virQEMUDriverPtr driver);
504 505 506

int qemuDomainSnapshotWriteMetadata(virDomainObjPtr vm,
                                    virDomainSnapshotObjPtr snapshot,
507
                                    virCapsPtr caps,
508 509
                                    char *snapshotDir);

510
int qemuDomainSnapshotForEachQcow2(virQEMUDriverPtr driver,
511 512 513 514 515
                                   virDomainObjPtr vm,
                                   virDomainSnapshotObjPtr snap,
                                   const char *op,
                                   bool try_all);

516
int qemuDomainSnapshotDiscard(virQEMUDriverPtr driver,
517 518 519 520 521
                              virDomainObjPtr vm,
                              virDomainSnapshotObjPtr snap,
                              bool update_current,
                              bool metadata_only);

522 523 524
typedef struct _virQEMUSnapRemove virQEMUSnapRemove;
typedef virQEMUSnapRemove *virQEMUSnapRemovePtr;
struct _virQEMUSnapRemove {
525
    virQEMUDriverPtr driver;
526 527 528 529 530 531
    virDomainObjPtr vm;
    int err;
    bool metadata_only;
    bool current;
};

532 533 534
int qemuDomainSnapshotDiscardAll(void *payload,
                                 const void *name,
                                 void *data);
535

536
int qemuDomainSnapshotDiscardAllMetadata(virQEMUDriverPtr driver,
537 538
                                         virDomainObjPtr vm);

539
void qemuDomainRemoveInactive(virQEMUDriverPtr driver,
540 541
                              virDomainObjPtr vm);

542
void qemuDomainSetFakeReboot(virQEMUDriverPtr driver,
543 544 545
                             virDomainObjPtr vm,
                             bool value);

546
bool qemuDomainJobAllowed(qemuDomainObjPrivatePtr priv,
547
                          qemuDomainJob job);
M
Michal Privoznik 已提交
548

549
int qemuDomainCheckDiskPresence(virQEMUDriverPtr driver,
M
Michal Privoznik 已提交
550 551
                                virDomainObjPtr vm,
                                bool start_with_state);
552

553
int qemuDomainDetermineDiskChain(virQEMUDriverPtr driver,
554
                                 virDomainObjPtr vm,
555
                                 virDomainDiskDefPtr disk,
556 557
                                 bool force_probe,
                                 bool report_broken);
558

559
bool qemuDomainDiskSourceDiffers(virDomainDiskDefPtr disk,
560 561
                                 virDomainDiskDefPtr origDisk);

562 563 564
bool qemuDomainDiskChangeSupported(virDomainDiskDefPtr disk,
                                   virDomainDiskDefPtr orig_disk);

565 566 567
int qemuDomainStorageFileInit(virQEMUDriverPtr driver,
                              virDomainObjPtr vm,
                              virStorageSourcePtr src);
568
char *qemuDomainStorageAlias(const char *device, int depth);
569

570 571 572 573 574 575 576 577
void qemuDomainDiskChainElementRevoke(virQEMUDriverPtr driver,
                                      virDomainObjPtr vm,
                                      virStorageSourcePtr elem);
int qemuDomainDiskChainElementPrepare(virQEMUDriverPtr driver,
                                      virDomainObjPtr vm,
                                      virStorageSourcePtr elem,
                                      bool readonly);

578 579 580 581
int qemuDomainCleanupAdd(virDomainObjPtr vm,
                         qemuDomainCleanupCallback cb);
void qemuDomainCleanupRemove(virDomainObjPtr vm,
                             qemuDomainCleanupCallback cb);
582
void qemuDomainCleanupRun(virQEMUDriverPtr driver,
583 584
                          virDomainObjPtr vm);

585 586
extern virDomainXMLPrivateDataCallbacks virQEMUDriverPrivateDataCallbacks;
extern virDomainXMLNamespace virQEMUDriverDomainXMLNamespace;
587
extern virDomainDefParserConfig virQEMUDriverDomainDefParserConfig;
588

589
int qemuDomainUpdateDeviceList(virQEMUDriverPtr driver,
590
                               virDomainObjPtr vm, int asyncJob);
591

592 593 594 595
int qemuDomainUpdateMemoryDeviceInfo(virQEMUDriverPtr driver,
                                     virDomainObjPtr vm,
                                     int asyncJob);

596 597 598
bool qemuDomainDefCheckABIStability(virQEMUDriverPtr driver,
                                    virDomainDefPtr src,
                                    virDomainDefPtr dst);
599

600
bool qemuDomainAgentAvailable(virDomainObjPtr vm,
601 602
                              bool reportError);

J
Jiri Denemark 已提交
603 604
int qemuDomainJobInfoUpdateTime(qemuDomainJobInfoPtr jobInfo)
    ATTRIBUTE_NONNULL(1);
605 606
int qemuDomainJobInfoUpdateDowntime(qemuDomainJobInfoPtr jobInfo)
    ATTRIBUTE_NONNULL(1);
J
Jiri Denemark 已提交
607 608 609 610 611 612 613 614 615 616
int qemuDomainJobInfoToInfo(qemuDomainJobInfoPtr jobInfo,
                            virDomainJobInfoPtr info)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
int qemuDomainJobInfoToParams(qemuDomainJobInfoPtr jobInfo,
                              int *type,
                              virTypedParameterPtr *params,
                              int *nparams)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2)
    ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(4);

617 618
int qemuDomainSupportsBlockJobs(virDomainObjPtr vm, bool *modern)
    ATTRIBUTE_NONNULL(1);
619
bool qemuDomainDiskBlockJobIsActive(virDomainDiskDefPtr disk);
620 621
bool qemuDomainHasBlockjob(virDomainObjPtr vm, bool copy_only)
    ATTRIBUTE_NONNULL(1);
622

623
int qemuDomainAlignMemorySizes(virDomainDefPtr def);
624 625
void qemuDomainMemoryDeviceAlignSize(virDomainDefPtr def,
                                     virDomainMemoryDefPtr mem);
626

627
virDomainChrDefPtr qemuFindAgentConfig(virDomainDefPtr def);
628

629 630
bool qemuDomainMachineIsQ35(const virDomainDef *def);
bool qemuDomainMachineIsI440FX(const virDomainDef *def);
631
bool qemuDomainMachineNeedsFDC(const virDomainDef *def);
632
bool qemuDomainMachineIsS390CCW(const virDomainDef *def);
J
Ján Tomko 已提交
633
bool qemuDomainMachineIsVirt(const virDomainDef *def);
634
bool qemuDomainMachineIsPSeries(const virDomainDef *def);
635
bool qemuDomainMachineHasBuiltinIDE(const virDomainDef *def);
636

637 638 639
int qemuDomainUpdateCurrentMemorySize(virQEMUDriverPtr driver,
                                      virDomainObjPtr vm);

640 641
unsigned long long qemuDomainGetMemLockLimitBytes(virDomainDefPtr def);
bool qemuDomainRequiresMemLock(virDomainDefPtr def);
642
int qemuDomainAdjustMaxMemLock(virDomainObjPtr vm);
643

644 645 646 647
int qemuDomainDefValidateMemoryHotplug(const virDomainDef *def,
                                       virQEMUCapsPtr qemuCaps,
                                       const virDomainMemoryDef *mem);

648
bool qemuDomainHasVcpuPids(virDomainObjPtr vm);
649
pid_t qemuDomainGetVcpuPid(virDomainObjPtr vm, unsigned int vcpuid);
650 651
int qemuDomainDetectVcpuPids(virQEMUDriverPtr driver, virDomainObjPtr vm,
                             int asyncJob);
652

653 654 655 656 657 658 659
bool qemuDomainSupportsNicdev(virDomainDefPtr def,
                              virDomainNetDefPtr net);

bool qemuDomainSupportsNetdev(virDomainDefPtr def,
                              virQEMUCapsPtr qemuCaps,
                              virDomainNetDefPtr net);

J
John Ferlan 已提交
660
int qemuDomainNetVLAN(virDomainNetDefPtr def);
661

662 663 664
int qemuDomainSetPrivatePaths(virQEMUDriverPtr driver,
                              virDomainObjPtr vm);

665
void qemuDomainClearPrivatePaths(virDomainObjPtr vm);
P
Peter Krempa 已提交
666 667 668

virDomainDiskDefPtr qemuDomainDiskByName(virDomainDefPtr def, const char *name);

J
John Ferlan 已提交
669 670 671 672
char *qemuDomainGetMasterKeyFilePath(const char *libDir);

int qemuDomainMasterKeyReadFile(qemuDomainObjPrivatePtr priv);

673 674 675 676
int qemuDomainWriteMasterKeyFile(virQEMUDriverPtr driver,
                                 virDomainObjPtr vm);

int qemuDomainMasterKeyCreate(virDomainObjPtr vm);
J
John Ferlan 已提交
677 678 679

void qemuDomainMasterKeyRemove(qemuDomainObjPrivatePtr priv);

680 681 682
void qemuDomainSecretDiskDestroy(virDomainDiskDefPtr disk)
    ATTRIBUTE_NONNULL(1);

683 684 685
bool qemuDomainSecretDiskCapable(virStorageSourcePtr src)
    ATTRIBUTE_NONNULL(1);

J
John Ferlan 已提交
686 687 688 689
int qemuDomainSecretDiskPrepare(virConnectPtr conn,
                                qemuDomainObjPrivatePtr priv,
                                virDomainDiskDefPtr disk)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
690

691 692 693 694
void qemuDomainSecretHostdevDestroy(virDomainHostdevDefPtr disk)
    ATTRIBUTE_NONNULL(1);

int qemuDomainSecretHostdevPrepare(virConnectPtr conn,
J
John Ferlan 已提交
695
                                   qemuDomainObjPrivatePtr priv,
696
                                   virDomainHostdevDefPtr hostdev)
J
John Ferlan 已提交
697
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
698

699 700 701 702 703 704
void qemuDomainSecretDestroy(virDomainObjPtr vm)
    ATTRIBUTE_NONNULL(1);

int qemuDomainSecretPrepare(virConnectPtr conn, virDomainObjPtr vm)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);

705 706 707
int qemuDomainDefValidateDiskLunSource(const virStorageSource *src)
    ATTRIBUTE_NONNULL(1);

708 709 710 711
int qemuDomainPrepareChannel(virDomainChrDefPtr chr,
                             const char *domainChannelTargetDir)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);

712
#endif /* __QEMU_DOMAIN_H__ */