qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH for 1.4] block/vpc: Fix size calculation


From: Kevin Wolf
Subject: Re: [Qemu-devel] [PATCH for 1.4] block/vpc: Fix size calculation
Date: Mon, 11 Feb 2013 09:54:56 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:13.0) Gecko/20120605 Thunderbird/13.0

Am 08.02.2013 18:43, schrieb Stefan Weil:
> Am 08.02.2013 13:14, schrieb Jeff Cody:
>> On Fri, Feb 08, 2013 at 09:38:47AM +0100, Kevin Wolf wrote:
>>> Am 07.02.2013 20:26, schrieb Stefan Weil:
>>>> From: Stefan Weil <address@hidden(none)>
>>>>
>>>> The size calculated from the CHS values is not the real image (disk) size,
>>>> but usually a smaller value. This is caused by rounding effects.
>>>>
>>>> Only older operating systems use CHS. Such guests won't be able to use
>>>> the whole disk. All modern operating systems use the real size.
>>>>
>>>> This patch fixes https://bugs.launchpad.net/qemu/+bug/1105670/.
>>>>
>>>> Signed-off-by: Stefan Weil <address@hidden>
>>>> ---
>>>>
>>>> This is a rebased extract from my patch series for block/vpc.c.
>>>> It's the minimum needed to fix the open bug for QEMU 1.4.
>>>>
>>>> The rest of the series can be discussed and applied after 1.4.
>>>>
>>>> Regards
>>>>
>>>> Stefan W.
>>>>
>>>> PS. Please excuse a previous personal mail which I had sent
>>>> with a wrong signature and without addressing qemu-devel.
>>>>
>>>>  block/vpc.c |   14 +++++++++-----
>>>>  1 file changed, 9 insertions(+), 5 deletions(-)
>>>>
>>>> diff --git a/block/vpc.c b/block/vpc.c
>>>> index 82229ef..b4ff564 100644
>>>> --- a/block/vpc.c
>>>> +++ b/block/vpc.c
>>>> @@ -34,6 +34,8 @@
>>>>  
>>>>  #define HEADER_SIZE 512
>>>>  
>>>> +#define VHD_SECTOR_SIZE 512
>>>> +
>>>>  //#define CACHE
>>>>  
>>>>  enum vhd_type {
>>>> @@ -204,11 +206,13 @@ static int vpc_open(BlockDriverState *bs, int flags)
>>>>      /* Write 'checksum' back to footer, or else will leave it with zero. 
>>>> */
>>>>      footer->checksum = be32_to_cpu(checksum);
>>>>  
>>>> -    // The visible size of a image in Virtual PC depends on the geometry
>>>> -    // rather than on the size stored in the footer (the size in the 
>>>> footer
>>>> -    // is too large usually)
>>>> -    bs->total_sectors = (int64_t)
>>>> -        be16_to_cpu(footer->cyls) * footer->heads * footer->secs_per_cyl;
>>>> +    /* The visible size of a image in Virtual PC depends on the guest:
>>>> +     * QEMU and other emulators report the real size (here in sectors).
>>>> +     * All modern operating systems use this real size.
>>>> +     * Very old operating systems use CHS values to calculate the total 
>>>> size.
>>>> +     * This calculated size is usually smaller than the real size.
>>>> +     */
>>>> +    bs->total_sectors = be64_to_cpu(footer->size) / VHD_SECTOR_SIZE;
>>> It's unfortunate that I don't have my old Virtual PC installation around
>>> any more so I could prove that you're wrong for at least some versions.
>>> Or does a Linux of 2009 already count as "very old"?
> 
> Linux is a modern OS per definition :-)
> 
> I made an additional test with Knoppix (from December 2006),
> and it worked as expected.

So I'm afraid that the reason isn't the guest OS but the Virtual PC
version. I guess supporting newer versions of it is more important, so
if Jeff's testing passes, I'm not against taking the patch, even though
I don't feel completely comfortable about it. But I don't see how we
could support both ways at the same time.

Kevin



reply via email to

[Prev in Thread] Current Thread [Next in Thread]