goto error;
}
} else if (xmlStrEqual(cur->name, BAD_CAST "readonly")) {
- def->readonly = true;
+ def->src->readonly = true;
} else if (xmlStrEqual(cur->name, BAD_CAST "shareable")) {
- def->shared = true;
+ def->src->shared = true;
} else if (xmlStrEqual(cur->name, BAD_CAST "transient")) {
def->transient = true;
} else if ((flags & VIR_DOMAIN_XML_INTERNAL_STATUS) &&
/* Force CDROM to be listed as read only */
if (def->device == VIR_DOMAIN_DISK_DEVICE_CDROM)
- def->readonly = true;
+ def->src->readonly = true;
if ((def->device == VIR_DOMAIN_DISK_DEVICE_DISK ||
def->device == VIR_DOMAIN_DISK_DEVICE_LUN) &&
snapshot);
goto error;
}
- } else if (def->readonly) {
+ } else if (def->src->readonly) {
def->snapshot = VIR_DOMAIN_SNAPSHOT_LOCATION_NONE;
}
return false;
}
- if (src->readonly != dst->readonly || src->shared != dst->shared) {
+ if (src->src->readonly != dst->src->readonly ||
+ src->src->shared != dst->src->shared) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("Target disk access mode does not match source"));
return false;
virBufferAsprintf(buf, " sgio='%s'", sgio);
if (def->snapshot &&
- !(def->snapshot == VIR_DOMAIN_SNAPSHOT_LOCATION_NONE && def->readonly))
+ !(def->snapshot == VIR_DOMAIN_SNAPSHOT_LOCATION_NONE &&
+ def->src->readonly))
virBufferAsprintf(buf, " snapshot='%s'",
virDomainSnapshotLocationTypeToString(def->snapshot));
virBufferAddLit(buf, ">\n");
virBufferAddLit(buf, "</iotune>\n");
}
- if (def->readonly)
+ if (def->src->readonly)
virBufferAddLit(buf, "<readonly/>\n");
- if (def->shared)
+ if (def->src->shared)
virBufferAddLit(buf, "<shareable/>\n");
if (def->transient)
virBufferAddLit(buf, "<transient/>\n");
int copy_on_read; /* enum virDomainDiskCopyOnRead */
int snapshot; /* virDomainSnapshotLocation, snapshot_conf.h */
int startupPolicy; /* enum virDomainStartupPolicy */
- bool readonly;
- bool shared;
bool transient;
virDomainDeviceInfo info;
bool rawio_specified;
/* XXX is this right? */
x_disk->removable = 1;
- x_disk->readwrite = !l_disk->readonly;
+ x_disk->readwrite = !l_disk->src->readonly;
x_disk->is_cdrom = l_disk->device == VIR_DOMAIN_DISK_DEVICE_CDROM ? 1 : 0;
/* An empty CDROM must have the empty format, otherwise libxl fails. */
if (x_disk->is_cdrom && !x_disk->pdev_path)
type == VIR_STORAGE_TYPE_DIR))
return 0;
- if (disk->readonly)
+ if (disk->src->readonly)
diskFlags |= VIR_LOCK_MANAGER_RESOURCE_READONLY;
- if (disk->shared)
+ if (disk->src->shared)
diskFlags |= VIR_LOCK_MANAGER_RESOURCE_SHARED;
VIR_DEBUG("Add disk %s", src);
if (virCgroupAllowDevicePath(cgroup,
virDomainDiskGetSource(def->disks[i]),
- (def->disks[i]->readonly ?
+ (def->disks[i]->src->readonly ?
VIR_CGROUP_DEVICE_READ :
VIR_CGROUP_DEVICE_RW) |
VIR_CGROUP_DEVICE_MKNOD) < 0)
if (virFileNBDDeviceAssociate(src,
format,
- disk->readonly,
+ disk->src->readonly,
&dev) < 0)
return -1;
goto cleanup;
}
- perms = (def->readonly ?
+ perms = (def->src->readonly ?
VIR_CGROUP_DEVICE_READ :
VIR_CGROUP_DEVICE_RW) |
VIR_CGROUP_DEVICE_MKNOD;
VIR_DEBUG("Process path %s for disk", path);
ret = virCgroupAllowDevicePath(priv->cgroup, path,
- (disk->readonly ? VIR_CGROUP_DEVICE_READ
+ (disk->src->readonly ? VIR_CGROUP_DEVICE_READ
: VIR_CGROUP_DEVICE_RW));
virDomainAuditCgroupPath(vm, priv->cgroup, "allow", path,
- disk->readonly ? "r" : "rw", ret == 0);
+ disk->src->readonly ? "r" : "rw", ret == 0);
/* Get this for root squash NFS */
if (ret < 0 &&
goto error;
}
- if (!disk->readonly) {
+ if (!disk->src->readonly) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("cannot create virtual FAT disks in read-write mode"));
goto error;
disk->device == VIR_DOMAIN_DISK_DEVICE_LUN) &&
disk->bus != VIR_DOMAIN_DISK_BUS_IDE)
virBufferAddLit(&opt, ",boot=on");
- if (disk->readonly &&
+ if (disk->src->readonly &&
virQEMUCapsGet(qemuCaps, QEMU_CAPS_DRIVE_READONLY)) {
if (disk->bus == VIR_DOMAIN_DISK_BUS_IDE &&
disk->device == VIR_DOMAIN_DISK_DEVICE_DISK) {
}
virBufferAsprintf(&opt, ",cache=%s", mode);
- } else if (disk->shared && !disk->readonly) {
+ } else if (disk->src->shared && !disk->src->readonly) {
virBufferAddLit(&opt, ",cache=off");
}
virStorageFileFormatTypeToString(disk->src->format));
goto error;
}
- if (!disk->readonly) {
+ if (!disk->src->readonly) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("cannot create virtual FAT disks in read-write mode"));
goto error;
} else if (STREQ(keywords[i], "media")) {
if (STREQ(values[i], "cdrom")) {
def->device = VIR_DOMAIN_DISK_DEVICE_CDROM;
- def->readonly = true;
+ def->src->readonly = true;
} else if (STREQ(values[i], "floppy"))
def->device = VIR_DOMAIN_DISK_DEVICE_FLOPPY;
} else if (STREQ(keywords[i], "format")) {
}
} else if (STREQ(keywords[i], "readonly")) {
if ((values[i] == NULL) || STREQ(values[i], "on"))
- def->readonly = true;
+ def->src->readonly = true;
} else if (STREQ(keywords[i], "aio")) {
if ((def->iomode = virDomainDiskIoTypeFromString(values[i])) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
disk->bus = VIR_DOMAIN_DISK_BUS_SCSI;
if (VIR_STRDUP(disk->dst, "hdc") < 0)
goto error;
- disk->readonly = true;
+ disk->src->readonly = true;
} else {
if (STRPREFIX(arg, "-fd")) {
disk->device = VIR_DOMAIN_DISK_DEVICE_FLOPPY;
if (dev->type == VIR_DOMAIN_DEVICE_DISK) {
disk = dev->data.disk;
- if (!disk->shared || !virDomainDiskSourceIsBlockType(disk))
+ if (!disk->src->shared || !virDomainDiskSourceIsBlockType(disk))
return 0;
} else if (dev->type == VIR_DOMAIN_DEVICE_HOSTDEV) {
hostdev = dev->data.hostdev;
if (dev->type == VIR_DOMAIN_DEVICE_DISK) {
disk = dev->data.disk;
- if (!disk->shared || !virDomainDiskSourceIsBlockType(disk))
+ if (!disk->src->shared || !virDomainDiskSourceIsBlockType(disk))
return 0;
} else if (dev->type == VIR_DOMAIN_DEVICE_HOSTDEV) {
hostdev = dev->data.hostdev;
* permissions it would have as if part of the disk chain is to
* temporarily modify the disk in place. */
virStorageSource origdisk;
- bool origreadonly = disk->readonly;
+ bool origreadonly = disk->src->readonly;
virQEMUDriverConfigPtr cfg = NULL;
int ret = -1;
* than a full virDomainDiskDef. */
memcpy(&origdisk, disk->src, sizeof(origdisk));
memcpy(disk->src, elem, sizeof(*elem));
- disk->readonly = mode == VIR_DISK_CHAIN_READ_ONLY;
+ disk->src->readonly = mode == VIR_DISK_CHAIN_READ_ONLY;
if (mode == VIR_DISK_CHAIN_NO_ACCESS) {
if (virSecurityManagerRestoreDiskLabel(driver->securityManager,
cleanup:
memcpy(disk->src, &origdisk, sizeof(origdisk));
- disk->readonly = origreadonly;
+ disk->src->readonly = origreadonly;
virObjectUnref(cfg);
return ret;
}
case VIR_DOMAIN_SNAPSHOT_LOCATION_NONE:
/* Remember seeing a disk that has snapshot disabled */
- if (!dom_disk->readonly)
+ if (!dom_disk->src->readonly)
forbid_internal = true;
break;
virDomainDiskDefPtr disk = vm->def->disks[i];
/* skip shared, RO and source-less disks */
- if (disk->shared || disk->readonly || !virDomainDiskGetSource(disk))
+ if (disk->src->shared || disk->src->readonly ||
+ !virDomainDiskGetSource(disk))
continue;
VIR_FREE(diskAlias);
virDomainBlockJobInfo info;
/* skip shared, RO and source-less disks */
- if (disk->shared || disk->readonly || !virDomainDiskGetSource(disk))
+ if (disk->src->shared || disk->src->readonly ||
+ !virDomainDiskGetSource(disk))
continue;
VIR_FREE(diskAlias);
virDomainDiskDefPtr disk = vm->def->disks[--lastGood];
/* skip shared, RO disks */
- if (disk->shared || disk->readonly || !virDomainDiskGetSource(disk))
+ if (disk->src->shared || disk->src->readonly ||
+ !virDomainDiskGetSource(disk))
continue;
VIR_FREE(diskAlias);
virDomainDiskDefPtr disk = vm->def->disks[i];
/* skip shared, RO and source-less disks */
- if (disk->shared || disk->readonly || !virDomainDiskGetSource(disk))
+ if (disk->src->shared || disk->src->readonly ||
+ !virDomainDiskGetSource(disk))
continue;
VIR_FREE(diskAlias);
/* Our code elsewhere guarantees shared disks are either readonly (in
* which case cache mode doesn't matter) or used with cache=none */
if (src &&
- !disk->shared &&
- !disk->readonly &&
+ !disk->src->shared &&
+ !disk->src->readonly &&
disk->cachemode != VIR_DOMAIN_DISK_CACHE_DISABLE) {
int rc;
* we can't see running VMs using the file on other nodes
* Safest bet is thus to skip the restore step.
*/
- if (disk->readonly || disk->shared)
+ if (disk->src->readonly || disk->src->shared)
return 0;
if (!src)
* we can't see running VMs using the file on other nodes
* Safest bet is thus to skip the restore step.
*/
- if (disk->readonly || disk->shared)
+ if (disk->src->readonly || disk->src->shared)
return 0;
if (!src || virDomainDiskGetType(disk) == VIR_STORAGE_TYPE_NETWORK)
ret = virSecuritySELinuxSetFilecon(path, disk_seclabel->label);
} else if (depth == 0) {
- if (disk->shared) {
+ if (disk->src->shared) {
ret = virSecuritySELinuxSetFileconOptional(path, data->file_context);
- } else if (disk->readonly) {
+ } else if (disk->src->readonly) {
ret = virSecuritySELinuxSetFileconOptional(path, data->content_context);
} else if (secdef->imagelabel) {
ret = virSecuritySELinuxSetFileconOptional(path, secdef->imagelabel);
int ret;
if (depth == 0) {
- if (disk->readonly)
+ if (disk->src->readonly)
ret = vah_add_file(buf, path, "r");
else
ret = vah_add_file(buf, path, "rw");
size_t nseclabels;
virSecurityDeviceLabelDefPtr *seclabels;
+ /* Don't ever write to the image */
+ bool readonly;
+
+ /* image is shared across hosts */
+ bool shared;
+
/* backing chain of the storage source */
virStorageSourcePtr backingStore;
hardDiskPM->vtbl->GetType(hardDiskPM, &hddType);
if (hddType == HardDiskType_Immutable)
- def->disks[hddNum]->readonly = true;
+ def->disks[hddNum]->src->readonly = true;
ignore_value(virDomainDiskSetSource(def->disks[hddNum],
hddlocation));
ignore_value(VIR_STRDUP(def->disks[hddNum]->dst, "hda"));
hardDiskPS->vtbl->GetType(hardDiskPS, &hddType);
if (hddType == HardDiskType_Immutable)
- def->disks[hddNum]->readonly = true;
+ def->disks[hddNum]->src->readonly = true;
ignore_value(virDomainDiskSetSource(def->disks[hddNum],
hddlocation));
ignore_value(VIR_STRDUP(def->disks[hddNum]->dst, "hdb"));
hardDiskSS->vtbl->GetType(hardDiskSS, &hddType);
if (hddType == HardDiskType_Immutable)
- def->disks[hddNum]->readonly = true;
+ def->disks[hddNum]->src->readonly = true;
ignore_value(virDomainDiskSetSource(def->disks[hddNum],
hddlocation));
ignore_value(VIR_STRDUP(def->disks[hddNum]->dst, "hdd"));
medium->vtbl->GetReadOnly(medium, &readOnly);
if (readOnly == PR_TRUE)
- def->disks[diskCount]->readonly = true;
+ def->disks[diskCount]->src->readonly = true;
virDomainDiskSetType(def->disks[diskCount],
VIR_STORAGE_TYPE_FILE);
def->disks[def->ndisks - 1]->bus = VIR_DOMAIN_DISK_BUS_IDE;
virDomainDiskSetType(def->disks[def->ndisks - 1],
VIR_STORAGE_TYPE_FILE);
- def->disks[def->ndisks - 1]->readonly = true;
+ def->disks[def->ndisks - 1]->src->readonly = true;
ignore_value(virDomainDiskSetSource(def->disks[def->ndisks - 1], location));
ignore_value(VIR_STRDUP(def->disks[def->ndisks - 1]->dst, "hdc"));
def->ndisks--;
def->disks[def->ndisks - 1]->bus = VIR_DOMAIN_DISK_BUS_FDC;
virDomainDiskSetType(def->disks[def->ndisks - 1],
VIR_STORAGE_TYPE_FILE);
- def->disks[def->ndisks - 1]->readonly = false;
+ def->disks[def->ndisks - 1]->src->readonly = false;
ignore_value(virDomainDiskSetSource(def->disks[def->ndisks - 1], location));
ignore_value(VIR_STRDUP(def->disks[def->ndisks - 1]->dst, "fda"));
def->ndisks--;
VIR_DEBUG("disk(%zu) driverType: %s", i,
virStorageFileFormatTypeToString(format));
VIR_DEBUG("disk(%zu) cachemode: %d", i, def->disks[i]->cachemode);
- VIR_DEBUG("disk(%zu) readonly: %s", i, (def->disks[i]->readonly
+ VIR_DEBUG("disk(%zu) readonly: %s", i, (def->disks[i]->src->readonly
? "True" : "False"));
- VIR_DEBUG("disk(%zu) shared: %s", i, (def->disks[i]->shared
+ VIR_DEBUG("disk(%zu) shared: %s", i, (def->disks[i]->src->shared
? "True" : "False"));
if (def->disks[i]->device == VIR_DOMAIN_DISK_DEVICE_CDROM) {
"attached as harddisk: %s, rc=%08x"),
src, (unsigned)rc);
} else {
- if (def->disks[i]->readonly) {
+ if (def->disks[i]->src->readonly) {
hardDisk->vtbl->SetType(hardDisk,
HardDiskType_Immutable);
VIR_DEBUG("setting harddisk to readonly");
- } else if (!def->disks[i]->readonly) {
+ } else if (!def->disks[i]->src->readonly) {
hardDisk->vtbl->SetType(hardDisk,
HardDiskType_Normal);
VIR_DEBUG("setting harddisk type to normal");
VIR_DEBUG("disk(%zu) driverType: %s", i,
virStorageFileFormatTypeToString(format));
VIR_DEBUG("disk(%zu) cachemode: %d", i, def->disks[i]->cachemode);
- VIR_DEBUG("disk(%zu) readonly: %s", i, (def->disks[i]->readonly
+ VIR_DEBUG("disk(%zu) readonly: %s", i, (def->disks[i]->src->readonly
? "True" : "False"));
- VIR_DEBUG("disk(%zu) shared: %s", i, (def->disks[i]->shared
+ VIR_DEBUG("disk(%zu) shared: %s", i, (def->disks[i]->src->shared
? "True" : "False"));
if (type == VIR_STORAGE_TYPE_FILE && src) {
}
if (def->disks[i]->device == VIR_DOMAIN_DISK_DEVICE_DISK) {
- if (def->disks[i]->readonly) {
+ if (def->disks[i]->src->readonly) {
medium->vtbl->SetType(medium, MediumType_Immutable);
VIR_DEBUG("setting harddisk to immutable");
- } else if (!def->disks[i]->readonly) {
+ } else if (!def->disks[i]->src->readonly) {
medium->vtbl->SetType(medium, MediumType_Normal);
VIR_DEBUG("setting harddisk type to normal");
}
goto cleanup;
}
if (readOnly == PR_TRUE)
- def->dom->disks[diskCount]->readonly = true;
+ def->dom->disks[diskCount]->src->readonly = true;
def->dom->disks[diskCount]->src->type = VIR_STORAGE_TYPE_FILE;
def->dom->disks[diskCount]->dst = vboxGenerateMediumName(storageBus,
deviceInst,
if (mode &&
strchr(mode, 'r'))
- disk->readonly = true;
+ disk->src->readonly = true;
if (mode &&
strchr(mode, '!'))
- disk->shared = true;
+ disk->src->shared = true;
if (VIR_REALLOC_N(def->disks, def->ndisks+1) < 0)
goto error;
goto error;
}
disk->bus = VIR_DOMAIN_DISK_BUS_IDE;
- disk->readonly = true;
+ disk->src->readonly = true;
if (VIR_APPEND_ELEMENT(def->disks, def->ndisks, disk) < 0) {
virDomainDiskDefFree(disk);
}
}
- if (def->readonly)
+ if (def->src->readonly)
virBufferAddLit(buf, "(mode 'r')");
- else if (def->shared)
+ else if (def->src->shared)
virBufferAddLit(buf, "(mode 'w!')");
else
virBufferAddLit(buf, "(mode 'w')");
if (STREQ(head, "r") ||
STREQ(head, "ro"))
- disk->readonly = true;
+ disk->src->readonly = true;
else if ((STREQ(head, "w!")) ||
(STREQ(head, "!")))
- disk->shared = true;
+ disk->src->shared = true;
/* Maintain list in sorted order according to target device name */
if (VIR_APPEND_ELEMENT(def->disks, def->ndisks, disk) < 0)
if (VIR_STRDUP(disk->dst, "hdc") < 0)
goto cleanup;
disk->bus = VIR_DOMAIN_DISK_BUS_IDE;
- disk->readonly = true;
+ disk->src->readonly = true;
if (VIR_APPEND_ELEMENT(def->disks, def->ndisks, disk) < 0)
goto cleanup;
if (disk->device == VIR_DOMAIN_DISK_DEVICE_CDROM)
virBufferAddLit(&buf, ":cdrom");
- if (disk->readonly)
+ if (disk->src->readonly)
virBufferAddLit(&buf, ",r");
- else if (disk->shared)
+ else if (disk->src->shared)
virBufferAddLit(&buf, ",!");
else
virBufferAddLit(&buf, ",w");