]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
filesystem: adds possibility to use storage pool as fs source
authorOlga Krishtal <okrishtal@virtuozzo.com>
Thu, 14 Jul 2016 13:52:38 +0000 (16:52 +0300)
committerMaxim Nestratov <mnestratov@virtuozzo.com>
Mon, 18 Jul 2016 20:39:56 +0000 (23:39 +0300)
Signed-off-by: Olga Krishtal <okrishtal@virtuozzo.com>
15 files changed:
src/conf/domain_audit.c
src/conf/domain_conf.c
src/conf/domain_conf.h
src/libvirt_private.syms
src/lxc/lxc_cgroup.c
src/lxc/lxc_container.c
src/lxc/lxc_controller.c
src/lxc/lxc_native.c
src/lxc/lxc_process.c
src/openvz/openvz_conf.c
src/openvz/openvz_driver.c
src/qemu/qemu_command.c
src/vbox/vbox_common.c
src/vmx/vmx.c
src/vz/vz_sdk.c

index 6ad0acb744920bcb42153630b26e2ffa368c0167..53a58ac4c88c39ea5318da8d31e00a1ec7c58bc5 100644 (file)
@@ -296,8 +296,8 @@ virDomainAuditFS(virDomainObjPtr vm,
                  const char *reason, bool success)
 {
     virDomainAuditGenericDev(vm, "fs",
-                             oldDef ? oldDef->src : NULL,
-                             newDef ? newDef->src : NULL,
+                             oldDef ? oldDef->src->path : NULL,
+                             newDef ? newDef->src->path : NULL,
                              reason, success);
 }
 
index 82d9d1d9a01b365997b012b9b817812449b17856..1a603157217d73a614d07ee6cce1b27317c57df7 100644 (file)
@@ -1730,12 +1730,31 @@ void virDomainControllerDefFree(virDomainControllerDefPtr def)
     VIR_FREE(def);
 }
 
+virDomainFSDefPtr
+virDomainFSDefNew(void)
+{
+    virDomainFSDefPtr ret;
+
+    if (VIR_ALLOC(ret) < 0)
+        return NULL;
+
+    if (VIR_ALLOC(ret->src) < 0)
+        goto cleanup;
+
+    return ret;
+
+ cleanup:
+    virDomainFSDefFree(ret);
+    return NULL;
+
+}
+
 void virDomainFSDefFree(virDomainFSDefPtr def)
 {
     if (!def)
         return;
 
-    VIR_FREE(def->src);
+    virStorageSourceFree(def->src);
     VIR_FREE(def->dst);
     virDomainDeviceInfoClear(&def->info);
 
@@ -8540,7 +8559,7 @@ virDomainFSDefParseXML(xmlNodePtr node,
 
     ctxt->node = node;
 
-    if (VIR_ALLOC(def) < 0)
+    if (!(def = virDomainFSDefNew()))
         return NULL;
 
     type = virXMLPropString(node, "type");
@@ -8667,7 +8686,7 @@ virDomainFSDefParseXML(xmlNodePtr node,
             goto error;
     }
 
-    def->src = source;
+    def->src->path = source;
     source = NULL;
     def->dst = target;
     target = NULL;
@@ -20227,6 +20246,7 @@ virDomainFSDefFormat(virBufferPtr buf,
     const char *accessmode = virDomainFSAccessModeTypeToString(def->accessmode);
     const char *fsdriver = virDomainFSDriverTypeToString(def->fsdriver);
     const char *wrpolicy = virDomainFSWrpolicyTypeToString(def->wrpolicy);
+    const char *src = def->src->path;
 
     if (!type) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
@@ -20263,22 +20283,22 @@ virDomainFSDefFormat(virBufferPtr buf,
     case VIR_DOMAIN_FS_TYPE_MOUNT:
     case VIR_DOMAIN_FS_TYPE_BIND:
         virBufferEscapeString(buf, "<source dir='%s'/>\n",
-                              def->src);
+                              src);
         break;
 
     case VIR_DOMAIN_FS_TYPE_BLOCK:
         virBufferEscapeString(buf, "<source dev='%s'/>\n",
-                              def->src);
+                              src);
         break;
 
     case VIR_DOMAIN_FS_TYPE_FILE:
         virBufferEscapeString(buf, "<source file='%s'/>\n",
-                              def->src);
+                              src);
         break;
 
     case VIR_DOMAIN_FS_TYPE_TEMPLATE:
         virBufferEscapeString(buf, "<source name='%s'/>\n",
-                              def->src);
+                              src);
         break;
 
     case VIR_DOMAIN_FS_TYPE_RAM:
index db3f9e889a3c0cac25d779f9a0e950fcd8e7666c..5fb28a84fc403584a97dc67d76caca4403bb90b4 100644 (file)
@@ -807,7 +807,7 @@ struct _virDomainFSDef {
     int wrpolicy; /* enum virDomainFSWrpolicy */
     int format; /* virStorageFileFormat */
     unsigned long long usage; /* in bytes */
-    char *src;
+    virStorageSourcePtr src;
     char *dst;
     bool readonly;
     virDomainDeviceInfo info;
@@ -2497,6 +2497,7 @@ virDomainDiskDefPtr virDomainDiskFindByBusAndDst(virDomainDefPtr def,
                                                  int bus,
                                                  char *dst);
 void virDomainControllerDefFree(virDomainControllerDefPtr def);
+virDomainFSDefPtr virDomainFSDefNew(void);
 virDomainControllerDefPtr
 virDomainControllerDefNew(virDomainControllerType type);
 void virDomainFSDefFree(virDomainFSDefPtr def);
index 3580a7286242cbaead1fef1d50a0d31f95f890ee..cc1fa8161114c0e338804ff0264fe74aa0d98305 100644 (file)
@@ -296,6 +296,7 @@ virDomainDiskSetFormat;
 virDomainDiskSetSource;
 virDomainDiskSetType;
 virDomainFSDefFree;
+virDomainFSDefNew;
 virDomainFSIndexByName;
 virDomainFSInsert;
 virDomainFSRemove;
index ea86d3603aefe921e9197232e302f1990b4971a8..1c42ab5cde9d741dac78c8f53019629373bbfff1 100644 (file)
@@ -412,7 +412,7 @@ static int virLXCCgroupSetupDeviceACL(virDomainDefPtr def,
             continue;
 
         if (virCgroupAllowDevicePath(cgroup,
-                                     def->fss[i]->src,
+                                     def->fss[i]->src->path,
                                      def->fss[i]->readonly ?
                                      VIR_CGROUP_DEVICE_READ :
                                      VIR_CGROUP_DEVICE_RW, false) < 0)
index 916a37b68e035278e3ae4055691bb8f08a2ff759..a39e24fc341986ead3200797578b40a1c5590177 100644 (file)
@@ -619,27 +619,27 @@ static int lxcContainerResolveSymlinks(virDomainFSDefPtr fs, bool gentle)
     if (!fs->src || fs->symlinksResolved)
         return 0;
 
-    if (access(fs->src, F_OK)) {
+    if (access(fs->src->path, F_OK)) {
         if (gentle) {
             /* Just ignore the error for the while, we'll try again later */
-            VIR_DEBUG("Skipped unaccessible '%s'", fs->src);
+            VIR_DEBUG("Skipped unaccessible '%s'", fs->src->path);
             return 0;
         } else {
             virReportSystemError(errno,
-                                 _("Failed to access '%s'"), fs->src);
+                                 _("Failed to access '%s'"), fs->src->path);
             return -1;
         }
     }
 
-    VIR_DEBUG("Resolving '%s'", fs->src);
-    if (virFileResolveAllLinks(fs->src, &newroot) < 0) {
+    VIR_DEBUG("Resolving '%s'", fs->src->path);
+    if (virFileResolveAllLinks(fs->src->path, &newroot) < 0) {
         if (gentle) {
-            VIR_DEBUG("Skipped non-resolvable '%s'", fs->src);
+            VIR_DEBUG("Skipped non-resolvable '%s'", fs->src->path);
             return 0;
         } else {
             virReportSystemError(errno,
                                  _("Failed to resolve symlink at %s"),
-                                 fs->src);
+                                 fs->src->path);
         }
         return -1;
     }
@@ -647,10 +647,10 @@ static int lxcContainerResolveSymlinks(virDomainFSDefPtr fs, bool gentle)
     /* Mark it resolved to skip it the next time */
     fs->symlinksResolved = true;
 
-    VIR_DEBUG("Resolved '%s' to %s", fs->src, newroot);
+    VIR_DEBUG("Resolved '%s' to %s", fs->src->path, newroot);
 
-    VIR_FREE(fs->src);
-    fs->src = newroot;
+    VIR_FREE(fs->src->path);
+    fs->src->path = newroot;
 
     return 0;
 }
@@ -698,8 +698,8 @@ static int lxcContainerPrepareRoot(virDomainDefPtr def,
 
     root->dst = tmp;
     root->type = VIR_DOMAIN_FS_TYPE_MOUNT;
-    VIR_FREE(root->src);
-    root->src = dst;
+    VIR_FREE(root->src->path);
+    root->src->path = dst;
 
     return 0;
 }
@@ -711,7 +711,7 @@ static int lxcContainerPivotRoot(virDomainFSDefPtr root)
 
     ret = -1;
 
-    VIR_DEBUG("Pivot via %s", root->src);
+    VIR_DEBUG("Pivot via %s", root->src->path);
 
     /* root->parent must be private, so make / private. */
     if (mount("", "/", NULL, MS_PRIVATE|MS_REC, NULL) < 0) {
@@ -720,7 +720,7 @@ static int lxcContainerPivotRoot(virDomainFSDefPtr root)
         goto err;
     }
 
-    if (virAsprintf(&oldroot, "%s/.oldroot", root->src) < 0)
+    if (virAsprintf(&oldroot, "%s/.oldroot", root->src->path) < 0)
         goto err;
 
     if (virFileMakePath(oldroot) < 0) {
@@ -751,18 +751,18 @@ static int lxcContainerPivotRoot(virDomainFSDefPtr root)
     }
 
     /* ... and mount our root onto it */
-    if (mount(root->src, newroot, NULL, MS_BIND|MS_REC, NULL) < 0) {
+    if (mount(root->src->path, newroot, NULL, MS_BIND|MS_REC, NULL) < 0) {
         virReportSystemError(errno,
                              _("Failed to bind %s to new root %s"),
-                             root->src, newroot);
+                             root->src->path, newroot);
         goto err;
     }
 
     if (root->readonly) {
-        if (mount(root->src, newroot, NULL, MS_BIND|MS_REC|MS_RDONLY|MS_REMOUNT, NULL) < 0) {
+        if (mount(root->src->path, newroot, NULL, MS_BIND|MS_REC|MS_RDONLY|MS_REMOUNT, NULL) < 0) {
             virReportSystemError(errno,
                                  _("Failed to make new root %s readonly"),
-                                 root->src);
+                                 root->src->path);
             goto err;
         }
     }
@@ -1179,9 +1179,9 @@ static int lxcContainerMountFSBind(virDomainFSDefPtr fs,
     int ret = -1;
     struct stat st;
 
-    VIR_DEBUG("src=%s dst=%s", fs->src, fs->dst);
+    VIR_DEBUG("src=%s dst=%s", fs->src->path, fs->dst);
 
-    if (virAsprintf(&src, "%s%s", srcprefix, fs->src) < 0)
+    if (virAsprintf(&src, "%s%s", srcprefix, fs->src->path) < 0)
         goto cleanup;
 
     if (stat(fs->dst, &st) < 0) {
@@ -1514,9 +1514,9 @@ static int lxcContainerMountFSBlock(virDomainFSDefPtr fs,
     char *src = NULL;
     int ret = -1;
 
-    VIR_DEBUG("src=%s dst=%s", fs->src, fs->dst);
+    VIR_DEBUG("src=%s dst=%s", fs->src->path, fs->dst);
 
-    if (virAsprintf(&src, "%s%s", srcprefix, fs->src) < 0)
+    if (virAsprintf(&src, "%s%s", srcprefix, fs->src->path) < 0)
         goto cleanup;
 
     ret = lxcContainerMountFSBlockHelper(fs, src, srcprefix, sec_mount_options);
@@ -1622,14 +1622,14 @@ static int lxcContainerMountAllFS(virDomainDefPtr vmDef,
         if (STREQ(vmDef->fss[i]->dst, "/"))
             continue;
 
-        VIR_DEBUG("Mounting '%s' -> '%s'", vmDef->fss[i]->src, vmDef->fss[i]->dst);
+        VIR_DEBUG("Mounting '%s' -> '%s'", vmDef->fss[i]->src->path, vmDef->fss[i]->dst);
 
         if (lxcContainerResolveSymlinks(vmDef->fss[i], false) < 0)
             return -1;
 
 
         if (!(vmDef->fss[i]->src &&
-              STRPREFIX(vmDef->fss[i]->src, vmDef->fss[i]->dst)) &&
+              STRPREFIX(vmDef->fss[i]->src->path, vmDef->fss[i]->dst)) &&
             lxcContainerUnmountSubtree(vmDef->fss[i]->dst, false) < 0)
             return -1;
 
@@ -1777,7 +1777,7 @@ static int lxcContainerSetupPivotRoot(virDomainDefPtr vmDef,
 
     /* FIXME: we should find a way to unmount these mounts for container
      * even user namespace is enabled. */
-    if (STREQ(root->src, "/") && (!vmDef->idmap.nuidmap) &&
+    if (STREQ(root->src->path, "/") && (!vmDef->idmap.nuidmap) &&
         lxcContainerUnmountForSharedRoot(stateDir, vmDef->name) < 0)
         goto cleanup;
 
index e58ff1b6b0c89b6c08fbf9cd98bb51241695558b..f55aadc7e7d701580a51daa4161d07f94b806bf5 100644 (file)
@@ -424,18 +424,18 @@ static int virLXCControllerSetupLoopDeviceFS(virDomainFSDefPtr fs)
     int lofd;
     char *loname = NULL;
 
-    if ((lofd = virFileLoopDeviceAssociate(fs->src, &loname)) < 0)
+    if ((lofd = virFileLoopDeviceAssociate(fs->src->path, &loname)) < 0)
         return -1;
 
     VIR_DEBUG("Changing fs %s to use type=block for dev %s",
-              fs->src, loname);
+              fs->src->path, loname);
     /*
      * We now change it into a block device type, so that
      * the rest of container setup 'just works'
      */
     fs->type = VIR_DOMAIN_FS_TYPE_BLOCK;
-    VIR_FREE(fs->src);
-    fs->src = loname;
+    VIR_FREE(fs->src->path);
+    fs->src->path = loname;
     loname = NULL;
 
     return lofd;
@@ -485,21 +485,21 @@ static int virLXCControllerSetupNBDDeviceFS(virDomainFSDefPtr fs)
         return -1;
     }
 
-    if (virFileNBDDeviceAssociate(fs->src,
+    if (virFileNBDDeviceAssociate(fs->src->path,
                                   fs->format,
                                   fs->readonly,
                                   &dev) < 0)
         return -1;
 
     VIR_DEBUG("Changing fs %s to use type=block for dev %s",
-              fs->src, dev);
+              fs->src->path, dev);
     /*
      * We now change it into a block device type, so that
      * the rest of container setup 'just works'
      */
     fs->type = VIR_DOMAIN_FS_TYPE_BLOCK;
-    VIR_FREE(fs->src);
-    fs->src = dev;
+    VIR_FREE(fs->src->path);
+    fs->src->path = dev;
 
     return 0;
 }
@@ -635,7 +635,7 @@ static int virLXCControllerSetupLoopDevices(virLXCControllerPtr ctrl)
             /* The NBD device will be cleaned up while the cgroup will end.
              * For this we need to remember the qemu-nbd pid and add it to
              * the cgroup*/
-            if (virLXCControllerAppendNBDPids(ctrl, fs->src) < 0)
+            if (virLXCControllerAppendNBDPids(ctrl, fs->src->path) < 0)
                 goto cleanup;
         } else {
             virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
index a34204e6fbe1b10b73ba0c3bebc4fe93cb3bee3b..4b22e2ab925b703dfc13b60e104e14a114d346d6 100644 (file)
@@ -32,6 +32,7 @@
 #include "util/virlog.h"
 #include "util/virstring.h"
 #include "util/virconf.h"
+#include "conf/domain_conf.h"
 
 #define VIR_FROM_THIS VIR_FROM_LXC
 
@@ -46,12 +47,12 @@ lxcCreateFSDef(int type,
 {
     virDomainFSDefPtr def;
 
-    if (VIR_ALLOC(def) < 0)
+    if (!(def = virDomainFSDefNew()))
         return NULL;
 
     def->type = type;
     def->accessmode = VIR_DOMAIN_FS_ACCESSMODE_PASSTHROUGH;
-    if (src && VIR_STRDUP(def->src, src) < 0)
+    if (src && VIR_STRDUP(def->src->path, src) < 0)
         goto error;
     if (VIR_STRDUP(def->dst, dst) < 0)
         goto error;
index 28313f0f77a90676a6aa1cc647e5c5e261729e8b..67613948e1c0d73d87af3337255d3f6aca6c58d7 100644 (file)
@@ -1153,12 +1153,12 @@ virLXCProcessEnsureRootFS(virDomainObjPtr vm)
     if (root)
         return 0;
 
-    if (VIR_ALLOC(root) < 0)
+    if (!(root = virDomainFSDefNew()) < 0)
         goto error;
 
     root->type = VIR_DOMAIN_FS_TYPE_MOUNT;
 
-    if (VIR_STRDUP(root->src, "/") < 0 ||
+    if (VIR_STRDUP(root->src->path, "/") < 0 ||
         VIR_STRDUP(root->dst, "/") < 0)
         goto error;
 
index 99ce95cc499873434f4e917ec48842acbe39673f..cb30b322203279afed53ec82895e5eea31cc5339 100644 (file)
@@ -351,11 +351,11 @@ openvzReadFSConf(virDomainDefPtr def,
                        veid);
         goto error;
     } else if (ret > 0) {
-        if (VIR_ALLOC(fs) < 0)
+        if (!(fs = virDomainFSDefNew()) < 0)
             goto error;
 
         fs->type = VIR_DOMAIN_FS_TYPE_TEMPLATE;
-        if (VIR_STRDUP(fs->src, temp) < 0)
+        if (VIR_STRDUP(fs->src->path, temp) < 0)
             goto error;
     } else {
         /* OSTEMPLATE was not found, VE was booted from a private dir directly */
@@ -374,7 +374,7 @@ openvzReadFSConf(virDomainDefPtr def,
             goto error;
 
         fs->type = VIR_DOMAIN_FS_TYPE_MOUNT;
-        if (!(fs->src = virStringReplace(temp, "$VEID", veid_str)))
+        if (!(fs->src->path = virStringReplace(temp, "$VEID", veid_str)))
             goto error;
 
         VIR_FREE(veid_str);
index f9a89cf3d42726a4ccd218db6a0d650cd596cbaa..6c3edc9378f444a106bf6e42870d9e2b6c0b6d03 100644 (file)
@@ -207,7 +207,7 @@ static int openvzSetInitialConfig(virDomainDefPtr vmdef)
             goto cleanup;
         }
 
-        if (openvzWriteVPSConfigParam(vpsid, "VE_PRIVATE", vmdef->fss[0]->src) < 0) {
+        if (openvzWriteVPSConfigParam(vpsid, "VE_PRIVATE", vmdef->fss[0]->src->path) < 0) {
             virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                            _("Could not set the source dir for the filesystem"));
             goto cleanup;
@@ -2054,7 +2054,7 @@ openvzUpdateDevice(virDomainDefPtr vmdef,
         cur = vmdef->fss[pos];
 
         /* We only allow updating the quota */
-        if (STRNEQ(cur->src, fs->src)
+        if (STRNEQ(cur->src->path, fs->src->path)
             || cur->type != fs->type
             || cur->accessmode != fs->accessmode
             || cur->wrpolicy != fs->wrpolicy
index 1916590d086d08552d1d0ef35b18e14bc1a14a7b..583dc34f81d617814a04bb7a7f7d2c39dcdea4c0 100644 (file)
@@ -2091,7 +2091,7 @@ qemuBuildFSStr(virDomainFSDefPtr fs,
     }
 
     virBufferAsprintf(&opt, ",id=%s%s", QEMU_FSDEV_HOST_PREFIX, fs->info.alias);
-    virBufferAsprintf(&opt, ",path=%s", fs->src);
+    virBufferAsprintf(&opt, ",path=%s", fs->src->path);
 
     if (fs->readonly) {
         if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_FSDEV_READONLY)) {
index a14ab67f2b853c889b141e7a8de23b47b52d8ae9..3624a5e5f3fac7ef2c481e8a3053aa5b7bd9c749 100644 (file)
@@ -1839,7 +1839,7 @@ vboxAttachSharedFolder(virDomainDefPtr def, vboxGlobalData *data, IMachine *mach
             continue;
 
         VBOX_UTF8_TO_UTF16(def->fss[i]->dst, &nameUtf16);
-        VBOX_UTF8_TO_UTF16(def->fss[i]->src, &hostPathUtf16);
+        VBOX_UTF8_TO_UTF16(def->fss[i]->src->path, &hostPathUtf16);
         writable = !def->fss[i]->readonly;
 
         gVBoxAPI.UIMachine.CreateSharedFolder(machine, nameUtf16, hostPathUtf16,
@@ -3448,7 +3448,7 @@ vboxDumpSharedFolders(virDomainDefPtr def, vboxGlobalData *data, IMachine *machi
 
         gVBoxAPI.UISharedFolder.GetHostPath(sharedFolder, &hostPathUtf16);
         VBOX_UTF16_TO_UTF8(hostPathUtf16, &hostPath);
-        if (VIR_STRDUP(def->fss[i]->src, hostPath) < 0) {
+        if (VIR_STRDUP(def->fss[i]->src->path, hostPath) < 0) {
             VBOX_UTF8_FREE(hostPath);
             VBOX_UTF16_FREE(hostPathUtf16);
             goto sharedFoldersCleanup;
@@ -4159,7 +4159,7 @@ static int vboxDomainAttachDeviceImpl(virDomainPtr dom,
             PRBool writable;
 
             VBOX_UTF8_TO_UTF16(dev->data.fs->dst, &nameUtf16);
-            VBOX_UTF8_TO_UTF16(dev->data.fs->src, &hostPathUtf16);
+            VBOX_UTF8_TO_UTF16(dev->data.fs->src->path, &hostPathUtf16);
             writable = !dev->data.fs->readonly;
 
             rc = gVBoxAPI.UIMachine.CreateSharedFolder(machine, nameUtf16, hostPathUtf16,
index 0f557a8334b75f30413fcb4aa1cce4893b66b7fd..4a08b0ffb84919cefedebfb1661878ac34c516b7 100644 (file)
@@ -2422,7 +2422,7 @@ int virVMXParseFileSystem(virConfPtr conf, int number, virDomainFSDefPtr *def)
         return -1;
     }
 
-    if (VIR_ALLOC(*def) < 0)
+    if (!(*def = virDomainFSDefNew()))
         return -1;
 
     (*def)->type = VIR_DOMAIN_FS_TYPE_MOUNT;
@@ -2450,7 +2450,7 @@ int virVMXParseFileSystem(virConfPtr conf, int number, virDomainFSDefPtr *def)
     if (virVMXGetConfigString(conf, hostPath_name, &hostPath, false) < 0)
         goto cleanup;
 
-    (*def)->src = hostPath;
+    (*def)->src->path = hostPath;
     hostPath = NULL;
 
     /* vmx:guestName */
@@ -3690,7 +3690,7 @@ virVMXFormatFileSystem(virDomainFSDefPtr def, int number, virBufferPtr buffer)
     virBufferAsprintf(buffer, "sharedFolder%d.writeAccess = \"%s\"\n", number,
                       def->readonly ? "false" : "true");
     virBufferAsprintf(buffer, "sharedFolder%d.hostPath = \"%s\"\n", number,
-                      def->src);
+                      def->src->path);
     virBufferAsprintf(buffer, "sharedFolder%d.guestName = \"%s\"\n", number,
                       def->dst);
 
index f361460917c750e8320fcc02dec3515b4e662032..bed5f93a388c761425fed0aefdead030c8fcb3c3 100644 (file)
@@ -673,7 +673,7 @@ prlsdkGetFSInfo(PRL_HANDLE prldisk,
     if (!(buf = prlsdkGetStringParamVar(PrlVmDev_GetImagePath, prldisk)))
         goto cleanup;
 
-    fs->src = buf;
+    fs->src->path = buf;
     buf = NULL;
 
     if (!(buf = prlsdkGetStringParamVar(PrlVmDevHd_GetMountPoint, prldisk)))
@@ -714,7 +714,7 @@ prlsdkAddDomainHardDisksInfo(vzDriverPtr driver, PRL_HANDLE sdkdom, virDomainDef
 
         if (PDT_USE_REAL_DEVICE != emulatedType && IS_CT(def)) {
 
-            if (VIR_ALLOC(fs) < 0)
+            if (!(fs = virDomainFSDefNew()))
                 goto error;
 
             if (prlsdkGetFSInfo(hdd, fs) < 0)
@@ -3544,13 +3544,13 @@ prlsdkAddFS(PRL_HANDLE sdkdom, virDomainFSDefPtr fs)
     pret = PrlVmDev_SetEmulatedType(sdkdisk, PDT_USE_IMAGE_FILE);
     prlsdkCheckRetGoto(pret, cleanup);
 
-    pret = PrlVmDev_SetSysName(sdkdisk, fs->src);
+    pret = PrlVmDev_SetSysName(sdkdisk, fs->src->path);
     prlsdkCheckRetGoto(pret, cleanup);
 
-    pret = PrlVmDev_SetImagePath(sdkdisk, fs->src);
+    pret = PrlVmDev_SetImagePath(sdkdisk, fs->src->path);
     prlsdkCheckRetGoto(pret, cleanup);
 
-    pret = PrlVmDev_SetFriendlyName(sdkdisk, fs->src);
+    pret = PrlVmDev_SetFriendlyName(sdkdisk, fs->src->path);
     prlsdkCheckRetGoto(pret, cleanup);
 
     pret = PrlVmDevHd_SetMountPoint(sdkdisk, fs->dst);
@@ -3903,7 +3903,7 @@ prlsdkCreateCt(vzDriverPtr driver, virDomainDefPtr def)
     prlsdkCheckRetGoto(pret, cleanup);
 
     if (useTemplate) {
-        pret = PrlVmCfg_SetOsTemplate(sdkdom, def->fss[0]->src);
+        pret = PrlVmCfg_SetOsTemplate(sdkdom, def->fss[0]->src->path);
         prlsdkCheckRetGoto(pret, cleanup);
 
     }