diff options
author | Kamala Narasimhan <kamala.narasimhan@citrix.com> | 2011-02-15 20:00:33 +0000 |
---|---|---|
committer | Kamala Narasimhan <kamala.narasimhan@citrix.com> | 2011-02-15 20:00:33 +0000 |
commit | 583d10aea0701501b593710272e97d644089296e (patch) | |
tree | e369cca1bec43513a2dc2569ba07818b18fce04c | |
parent | 546a7640451fc359212ba23bc2d6a9497e1ed6d9 (diff) | |
download | xen-583d10aea0701501b593710272e97d644089296e.tar.gz xen-583d10aea0701501b593710272e97d644089296e.tar.bz2 xen-583d10aea0701501b593710272e97d644089296e.zip |
libxl: disk specification: special case vhd
Special case how we validate vhd image files. Without this patch when
tap:aio:vhd prefixed image files are specified in the config file,
disk validation and thus vm creation will fail.
Signed-off-by: Kamala Narasimhan <kamala.narasimhan@citrix.com>
Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
-rw-r--r-- | tools/libxl/libxl.c | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 9fe713976b..990aa8aa24 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -863,19 +863,30 @@ int libxl_vncviewer_exec(libxl_ctx *ctx, uint32_t domid, int autopass) /******************************************************************************/ -static int validate_virtual_disk(libxl_ctx *ctx, char *file_name, - libxl_disk_backend backend_type, libxl_disk_format format) +static int validate_virtual_disk(libxl_ctx *ctx, char *file_name, + libxl_device_disk *disk) { struct stat stat_buf; + char *delimiter; - if ((file_name[0] == '\0') && (format == DISK_FORMAT_EMPTY)) + if (disk->format == DISK_FORMAT_EMPTY) return 0; + if (disk->format == DISK_FORMAT_RAW) { + delimiter = strchr(file_name, ':'); + if (delimiter) { + if (!strncmp(file_name, "vhd:", sizeof("vhd:")-1)) { + disk->format = DISK_FORMAT_VHD; + file_name = ++delimiter; + } + } + } + if ( stat(file_name, &stat_buf) != 0 ) { LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "failed to stat %s", file_name); return ERROR_INVAL; } - if (backend_type == DISK_BACKEND_PHY) { + if (disk->backend == DISK_BACKEND_PHY) { if ( !(S_ISBLK(stat_buf.st_mode)) ) { LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Virtual disk %s is not a block device!\n", file_name); @@ -899,8 +910,7 @@ int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *dis libxl__device device; int major, minor, rc; - rc = validate_virtual_disk(ctx, disk->pdev_path, disk->backend, - disk->format); + rc = validate_virtual_disk(ctx, disk->pdev_path, disk); if (rc) return rc; |