static int virLXCProcessEnsureRootFS(virDomainObjPtr vm) { virDomainFSDefPtr root = virDomainGetFilesystemForTarget(vm->def, "/"); if (root) return 0; if (VIR_ALLOC(root) < 0) goto error; root->type = VIR_DOMAIN_FS_TYPE_MOUNT; if (VIR_STRDUP(root->src, "/") < 0 || VIR_STRDUP(root->dst, "/") < 0) goto error; if (VIR_INSERT_ELEMENT(vm->def->fss, 0, vm->def->nfss, root) < 0) goto error; return 0; error: virDomainFSDefFree(root); return -1; }
static virDomainFSDefPtr lxcCreateFSDef(int type, const char *src, const char* dst, bool readonly, unsigned long long usage) { virDomainFSDefPtr def; if (VIR_ALLOC(def) < 0) return NULL; def->type = type; def->accessmode = VIR_DOMAIN_FS_ACCESSMODE_PASSTHROUGH; if (src && VIR_STRDUP(def->src, src) < 0) goto error; if (VIR_STRDUP(def->dst, dst) < 0) goto error; def->readonly = readonly; def->usage = usage; return def; error: virDomainFSDefFree(def); return NULL; }
static int lxcAddFSDef(virDomainDefPtr def, int type, const char *src, const char *dst, bool readonly, unsigned long long usage) { virDomainFSDefPtr fsDef = NULL; if (!(fsDef = lxcCreateFSDef(type, src, dst, readonly, usage))) goto error; if (VIR_EXPAND_N(def->fss, def->nfss, 1) < 0) goto error; def->fss[def->nfss - 1] = fsDef; return 0; error: virDomainFSDefFree(fsDef); return -1; }
static int openvzReadFSConf(virDomainDefPtr def, int veid) { int ret; virDomainFSDefPtr fs = NULL; char *veid_str = NULL; char *temp = NULL; const char *param; unsigned long long barrier, limit; ret = openvzReadVPSConfigParam(veid, "OSTEMPLATE", &temp); if (ret < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Could not read 'OSTEMPLATE' from config for container %d"), veid); goto error; } else if (ret > 0) { if (VIR_ALLOC(fs) < 0) goto error; fs->type = VIR_DOMAIN_FS_TYPE_TEMPLATE; if (VIR_STRDUP(fs->src, temp) < 0) goto error; } else { /* OSTEMPLATE was not found, VE was booted from a private dir directly */ ret = openvzReadVPSConfigParam(veid, "VE_PRIVATE", &temp); if (ret <= 0) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Could not read 'VE_PRIVATE' from config for container %d"), veid); goto error; } if (VIR_ALLOC(fs) < 0) goto error; if (virAsprintf(&veid_str, "%d", veid) < 0) goto error; fs->type = VIR_DOMAIN_FS_TYPE_MOUNT; if (!(fs->src = virStringReplace(temp, "$VEID", veid_str))) goto error; VIR_FREE(veid_str); } if (VIR_STRDUP(fs->dst, "/") < 0) goto error; param = "DISKSPACE"; ret = openvzReadVPSConfigParam(veid, param, &temp); if (ret > 0) { if (openvzParseBarrierLimit(temp, &barrier, &limit)) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Could not read '%s' from config for container %d"), param, veid); goto error; } else { /* Ensure that we can multiply by 1024 without overflowing. */ if (barrier > ULLONG_MAX / 1024 || limit > ULLONG_MAX / 1024) { virReportError(VIR_ERR_OVERFLOW, "%s", _("Unable to parse quota")); goto error; } fs->space_soft_limit = barrier * 1024; /* unit is bytes */ fs->space_hard_limit = limit * 1024; /* unit is bytes */ } } if (VIR_APPEND_ELEMENT(def->fss, def->nfss, fs) < 0) goto error; VIR_FREE(temp); return 0; error: VIR_FREE(temp); virDomainFSDefFree(fs); return -1; }