On 13.01.2015 12:27, Dmitry Guryanov wrote: > It's possible to create a container with existing > disk image as root filesystem. You need to remove > existing disks from PCS VM config and then add a new > one, pointing to your image. And then call PrlVm_RegEx > with PRNVM_PRESERVE_DISK flag. > > With this patch you can create such container with > something like this for new domain XML config: > > <filesystem type='file' accessmode='passthrough'> > <driver type='ploop' format='ploop'/> > <source file='/path-to-image'/> > <target dir='/'/> > </filesystem> > > Signed-off-by: Dmitry Guryanov <dguryanov@xxxxxxxxxxxxx> > --- > > Changes in v2: > * use type size_t for 'i' > > src/parallels/parallels_sdk.c | 33 +++++++++++++++++++++++---------- > 1 file changed, 23 insertions(+), 10 deletions(-) > > diff --git a/src/parallels/parallels_sdk.c b/src/parallels/parallels_sdk.c > index 51e4bbe..57c65d7 100644 > --- a/src/parallels/parallels_sdk.c > +++ b/src/parallels/parallels_sdk.c > @@ -2892,14 +2892,26 @@ prlsdkCreateCt(virConnectPtr conn, virDomainDefPtr def) > PRL_HANDLE result = PRL_INVALID_HANDLE; > PRL_RESULT pret; > int ret = -1; > + int useTemplate = 0; > + size_t i; > > - if (def->nfss && (def->nfss > 1 || > - def->fss[0]->type != VIR_DOMAIN_FS_TYPE_TEMPLATE)) { > - > - virReportError(VIR_ERR_INVALID_ARG, "%s", > - _("There must be no more than 1 template FS for " > - "container creation")); > - return -1; > + if (def->nfss > 1) { > + /* Check all filesystems */ > + for (i = 0; i < def->nfss; i++) { > + if (def->fss[i]->type != VIR_DOMAIN_FS_TYPE_FILE) { > + virReportError(VIR_ERR_INVALID_ARG, "%s", > + _("Unsupported filesystem type.")); > + return -1; > + } > + } > + } else if (def->nfss == 1) { > + if (def->fss[0]->type == VIR_DOMAIN_FS_TYPE_TEMPLATE) { > + useTemplate = 1; > + } else if (def->fss[0]->type != VIR_DOMAIN_FS_TYPE_FILE) { > + virReportError(VIR_ERR_INVALID_ARG, "%s", > + _("Unsupported filesystem type.")); > + return -1; > + } > } > > confParam.nVmType = PVT_CT; > @@ -2913,22 +2925,23 @@ prlsdkCreateCt(virConnectPtr conn, virDomainDefPtr def) > pret = PrlResult_GetParamByIndex(result, 0, &sdkdom); > prlsdkCheckRetGoto(pret, cleanup); > > - if (def->nfss == 1) { > + if (useTemplate) { > pret = PrlVmCfg_SetOsTemplate(sdkdom, def->fss[0]->src); > prlsdkCheckRetGoto(pret, cleanup); > + > } > > ret = prlsdkDoApplyConfig(sdkdom, def); > if (ret) > goto cleanup; > > - job = PrlVm_RegEx(sdkdom, "", PACF_NON_INTERACTIVE_MODE); > + job = PrlVm_RegEx(sdkdom, "", PACF_NON_INTERACTIVE_MODE|PRNVM_PRESERVE_DISK); s/|/ | / > if (PRL_FAILED(waitJob(job, privconn->jobTimeout))) > ret = -1; > > cleanup: > PrlHandle_Free(sdkdom); > - return -1; > + return ret; > } > > int > Michal -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list