diff mbox

[2/4] block: vhdx - update PAYLOAD_BLOCK_UNMAPPED value to match 1.00 spec

Message ID 8a4d2da73a8dbc04cde62bea782fc09ff84b1cf1.1418018421.git.jcody@redhat.com
State New
Headers show

Commit Message

Jeff Cody Dec. 8, 2014, 6:07 a.m. UTC
The 0.95 VHDX spec defined PAYLOAD_BLOCK_UNMAPPED to be 5.  The 1.00
VHDX spec redefines PAYLOAD_BLOCK_UNMAPPED to be 3 instead.

The original value of 5 is now an undefined state in the spec, but it
should be safe to treat it the same and return zeros for data read.
This way, we can maintain compatibility with any images out in the wild
that may have been created in accordance to the 0.95 spec.

Reported-by: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Jeff Cody <jcody@redhat.com>
---
 block/vhdx.c | 3 ++-
 block/vhdx.h | 3 ++-
 2 files changed, 4 insertions(+), 2 deletions(-)

Comments

Max Reitz Dec. 8, 2014, 8:44 a.m. UTC | #1
On 2014-12-08 at 07:07, Jeff Cody wrote:
> The 0.95 VHDX spec defined PAYLOAD_BLOCK_UNMAPPED to be 5.  The 1.00
> VHDX spec redefines PAYLOAD_BLOCK_UNMAPPED to be 3 instead.
>
> The original value of 5 is now an undefined state in the spec, but it
> should be safe to treat it the same and return zeros for data read.
> This way, we can maintain compatibility with any images out in the wild
> that may have been created in accordance to the 0.95 spec.
>
> Reported-by: Kevin Wolf <kwolf@redhat.com>
> Signed-off-by: Jeff Cody <jcody@redhat.com>
> ---
>   block/vhdx.c | 3 ++-
>   block/vhdx.h | 3 ++-
>   2 files changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/block/vhdx.c b/block/vhdx.c
> index f1e1e2e..bec10bd 100644
> --- a/block/vhdx.c
> +++ b/block/vhdx.c
> @@ -1111,6 +1111,7 @@ static coroutine_fn int vhdx_co_readv(BlockDriverState *bs, int64_t sector_num,
>               case PAYLOAD_BLOCK_NOT_PRESENT: /* fall through */
>               case PAYLOAD_BLOCK_UNDEFINED:
>               case PAYLOAD_BLOCK_UNMAPPED:
> +            case PAYLOAD_BLOCK_UNMAPPED_v095:
>               case PAYLOAD_BLOCK_ZERO:
>                   /* return zero */
>                   qemu_iovec_memset(&hd_qiov, 0, 0, sinfo.bytes_avail);
> @@ -1277,10 +1278,10 @@ static coroutine_fn int vhdx_co_writev(BlockDriverState *bs, int64_t sector_num,
>                           sectors_to_write += iov2.iov_len >> BDRV_SECTOR_BITS;
>                       }
>                   }
> -

Was this line removal intended?

Anyway:

Reviewed-by: Max Reitz <mreitz@redhat.com>

>                   /* fall through */
>               case PAYLOAD_BLOCK_NOT_PRESENT: /* fall through */
>               case PAYLOAD_BLOCK_UNMAPPED:
> +            case PAYLOAD_BLOCK_UNMAPPED_v095:
>               case PAYLOAD_BLOCK_UNDEFINED:
>                   bat_prior_offset = sinfo.file_offset;
>                   ret = vhdx_allocate_block(bs, s, &sinfo.file_offset);
> diff --git a/block/vhdx.h b/block/vhdx.h
> index b4a12a0..7003ab7 100644
> --- a/block/vhdx.h
> +++ b/block/vhdx.h
> @@ -226,7 +226,8 @@ typedef struct QEMU_PACKED VHDXLogDataSector {
>   #define PAYLOAD_BLOCK_NOT_PRESENT       0
>   #define PAYLOAD_BLOCK_UNDEFINED         1
>   #define PAYLOAD_BLOCK_ZERO              2
> -#define PAYLOAD_BLOCK_UNMAPPED          5
> +#define PAYLOAD_BLOCK_UNMAPPED          3
> +#define PAYLOAD_BLOCK_UNMAPPED_v095     5
>   #define PAYLOAD_BLOCK_FULLY_PRESENT     6
>   #define PAYLOAD_BLOCK_PARTIALLY_PRESENT 7
diff mbox

Patch

diff --git a/block/vhdx.c b/block/vhdx.c
index f1e1e2e..bec10bd 100644
--- a/block/vhdx.c
+++ b/block/vhdx.c
@@ -1111,6 +1111,7 @@  static coroutine_fn int vhdx_co_readv(BlockDriverState *bs, int64_t sector_num,
             case PAYLOAD_BLOCK_NOT_PRESENT: /* fall through */
             case PAYLOAD_BLOCK_UNDEFINED:
             case PAYLOAD_BLOCK_UNMAPPED:
+            case PAYLOAD_BLOCK_UNMAPPED_v095:
             case PAYLOAD_BLOCK_ZERO:
                 /* return zero */
                 qemu_iovec_memset(&hd_qiov, 0, 0, sinfo.bytes_avail);
@@ -1277,10 +1278,10 @@  static coroutine_fn int vhdx_co_writev(BlockDriverState *bs, int64_t sector_num,
                         sectors_to_write += iov2.iov_len >> BDRV_SECTOR_BITS;
                     }
                 }
-
                 /* fall through */
             case PAYLOAD_BLOCK_NOT_PRESENT: /* fall through */
             case PAYLOAD_BLOCK_UNMAPPED:
+            case PAYLOAD_BLOCK_UNMAPPED_v095:
             case PAYLOAD_BLOCK_UNDEFINED:
                 bat_prior_offset = sinfo.file_offset;
                 ret = vhdx_allocate_block(bs, s, &sinfo.file_offset);
diff --git a/block/vhdx.h b/block/vhdx.h
index b4a12a0..7003ab7 100644
--- a/block/vhdx.h
+++ b/block/vhdx.h
@@ -226,7 +226,8 @@  typedef struct QEMU_PACKED VHDXLogDataSector {
 #define PAYLOAD_BLOCK_NOT_PRESENT       0
 #define PAYLOAD_BLOCK_UNDEFINED         1
 #define PAYLOAD_BLOCK_ZERO              2
-#define PAYLOAD_BLOCK_UNMAPPED          5
+#define PAYLOAD_BLOCK_UNMAPPED          3
+#define PAYLOAD_BLOCK_UNMAPPED_v095     5
 #define PAYLOAD_BLOCK_FULLY_PRESENT     6
 #define PAYLOAD_BLOCK_PARTIALLY_PRESENT 7