From: "Denis V. Lunev" <den@openvz.org>
Cc: Kevin Wolf <kwolf@redhat.com>, "Denis V. Lunev" <den@openvz.org>,
qemu-devel@nongnu.org, Stefan Hajnoczi <stefanha@redhat.com>
Subject: [Qemu-devel] [PATCH 5/7] block/parallels: support padded Parallels images
Date: Thu, 6 Nov 2014 15:54:36 +0300 [thread overview]
Message-ID: <1415278478-19384-6-git-send-email-den@openvz.org> (raw)
In-Reply-To: <1415278478-19384-1-git-send-email-den@openvz.org>
Unfortunately, old guest OSes do not align partitions to page size by
default. This is true for Windows 2003 and Windows XP.
For the time being Parallels was created an optimization for such OSes
in its desktop product. Desktop users are not qualified enough to create
properly aligned installations. Thus Parallels makes a blind guess
on a customer behalf and creates so-called "padded" images if guest
OS type is specified as WinXP, Win2k and Win2k3.
"Padding" is a value which should be added to guest LBA to obtain
sector number inside the image. This results in a shifted images.
0123 offset inside image (in 512 byte sectors)
+-------
+.012 guest data (512 byte sectors)
+-------
The information about this is available in DiskDescriptor.xml ONLY. There
is no such data in the image header.
There share of such images could be evaluated as 6-8% according to the
statistics in my hands.
This patch obtains proper value from XML and applies it on reading.
Signed-off-by: Denis V. Lunev <den@openvz.org>
Acked-by: Roman Kagan <rkagan@parallels.com>
Reviewed-by: Jeff Cody <jcody@redhat.com>
CC: Kevin Wolf <kwolf@redhat.com>
CC: Stefan Hajnoczi <stefanha@redhat.com>
---
block/parallels.c | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/block/parallels.c b/block/parallels.c
index 4a8240d..b27d1ea 100644
--- a/block/parallels.c
+++ b/block/parallels.c
@@ -63,6 +63,7 @@ typedef struct BDRVParallelsState {
unsigned int tracks;
unsigned int off_multiplier;
+ unsigned int padding;
} BDRVParallelsState;
@@ -245,6 +246,7 @@ static int parallels_open_xml(BlockDriverState *bs, int flags, Error **errp)
const char *data;
char image_path[PATH_MAX];
Error *local_err = NULL;
+ BDRVParallelsState *s = bs->opaque;
ret = size = bdrv_getlength(bs->file);
if (ret < 0) {
@@ -274,6 +276,19 @@ static int parallels_open_xml(BlockDriverState *bs, int flags, Error **errp)
if (root == NULL) {
goto fail;
}
+
+ data = xml_get_text(root, "Disk_Parameters", "Padding", NULL);
+ if (data != NULL) {
+ char *endptr;
+ unsigned long pad;
+
+ pad = strtoul(data, &endptr, 0);
+ if ((endptr != NULL && *endptr != '\0') || pad > UINT_MAX) {
+ goto fail;
+ }
+ s->padding = (uint32_t)pad;
+ }
+
image = xml_seek(root, "StorageData", "Storage", "Image", NULL);
data = ""; /* make gcc happy */
for (size = 0; image != NULL; image = image->next) {
@@ -375,6 +390,10 @@ static int64_t seek_to_sector(BlockDriverState *bs, int64_t sector_num)
static int parallels_read(BlockDriverState *bs, int64_t sector_num,
uint8_t *buf, int nb_sectors)
{
+ BDRVParallelsState *s = bs->opaque;
+
+ sector_num += s->padding;
+
while (nb_sectors > 0) {
int64_t position = seek_to_sector(bs, sector_num);
if (position >= 0) {
--
1.9.1
next prev parent reply other threads:[~2014-11-06 12:53 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-11-06 12:54 [Qemu-devel] [PATCH v3 0/7] parallels format support improvements Denis V. Lunev
2014-11-06 12:54 ` [Qemu-devel] [PATCH 1/7] configure: add dependency from libxml2 Denis V. Lunev
2014-11-06 12:54 ` [Qemu-devel] [PATCH 2/7] block/parallels: allow to specify DiskDescriptor.xml instead of image file Denis V. Lunev
2014-11-06 12:54 ` [Qemu-devel] [PATCH 3/7] iotests, parallels: quote TEST_IMG in 076 test to be path-safe Denis V. Lunev
2014-11-06 12:54 ` [Qemu-devel] [PATCH 4/7] iotests: simple parallels XML disk descriptor file test added Denis V. Lunev
2014-11-06 12:54 ` Denis V. Lunev [this message]
2014-11-06 12:54 ` [Qemu-devel] [PATCH 6/7] iotests: padded parallels image test Denis V. Lunev
2014-11-06 12:54 ` [Qemu-devel] [PATCH 7/7] parallels: change copyright information in the image header Denis V. Lunev
2014-12-02 10:33 ` [Qemu-devel] [PATCH v3 0/7] parallels format support improvements Denis V. Lunev
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1415278478-19384-6-git-send-email-den@openvz.org \
--to=den@openvz.org \
--cc=kwolf@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).