Skip to content
  • Eric Blake's avatar
    0c1bd469
    qcow2: Discard unaligned tail when wiping image · 0c1bd469
    Eric Blake authored
    
    
    There is a subtle difference between the fast (qcow2v3 with no
    extra data) and slow path (qcow2v2 format [aka 0.10], or when a
    snapshot is present) of qcow2_make_empty().  The slow path fails
    to discard the final (partial) cluster of an unaligned image.
    
    The problem stems from the fact that qcow2_discard_clusters() was
    silently ignoring sub-cluster head and tail on unaligned requests.
    A quick audit of all callers shows that qcow2_snapshot_create() has
    always passed a cluster-aligned request since the call was added
    in commit 1ebf561c; qcow2_co_pdiscard() has passed a cluster-aligned
    request since commit ecdbead6 taught the block layer about preferred
    discard alignment; and qcow2_make_empty() was fixed to pass an
    aligned start (but not necessarily end) in commit a3e1505d.
    
    Asserting that the start is always aligned also points out that we
    now have a dead check: rounding the end offset down can never result
    in a value less than the aligned start offset (the check was rendered
    dead with commit ecdbead6).  Meanwhile, we do not want to round the
    end cluster down in the one case of the end offset matching the
    (unaligned) file size - that final partial cluster should still be
    discarded.
    
    With those fixes in place, the fast and slow paths are back in sync
    at discarding an entire image; the next patch will update
    qemu-iotests to ensure we don't regress.
    
    Note that bdrv_co_pdiscard ignores ALL partial cluster requests,
    including the partial cluster at the end of an image; it can be
    argued that the partial cluster at the end should be special-cased
    so that a guest issuing discard requests at proper alignments
    everywhere else can likewise empty the entire image.  But that
    optimization is left for another day.
    
    Signed-off-by: default avatarEric Blake <eblake@redhat.com>
    Message-id: 20170331185356.2479-3-eblake@redhat.com
    Reviewed-by: default avatarMax Reitz <mreitz@redhat.com>
    Signed-off-by: default avatarMax Reitz <mreitz@redhat.com>
    0c1bd469
    qcow2: Discard unaligned tail when wiping image
    Eric Blake authored
    
    
    There is a subtle difference between the fast (qcow2v3 with no
    extra data) and slow path (qcow2v2 format [aka 0.10], or when a
    snapshot is present) of qcow2_make_empty().  The slow path fails
    to discard the final (partial) cluster of an unaligned image.
    
    The problem stems from the fact that qcow2_discard_clusters() was
    silently ignoring sub-cluster head and tail on unaligned requests.
    A quick audit of all callers shows that qcow2_snapshot_create() has
    always passed a cluster-aligned request since the call was added
    in commit 1ebf561c; qcow2_co_pdiscard() has passed a cluster-aligned
    request since commit ecdbead6 taught the block layer about preferred
    discard alignment; and qcow2_make_empty() was fixed to pass an
    aligned start (but not necessarily end) in commit a3e1505d.
    
    Asserting that the start is always aligned also points out that we
    now have a dead check: rounding the end offset down can never result
    in a value less than the aligned start offset (the check was rendered
    dead with commit ecdbead6).  Meanwhile, we do not want to round the
    end cluster down in the one case of the end offset matching the
    (unaligned) file size - that final partial cluster should still be
    discarded.
    
    With those fixes in place, the fast and slow paths are back in sync
    at discarding an entire image; the next patch will update
    qemu-iotests to ensure we don't regress.
    
    Note that bdrv_co_pdiscard ignores ALL partial cluster requests,
    including the partial cluster at the end of an image; it can be
    argued that the partial cluster at the end should be special-cased
    so that a guest issuing discard requests at proper alignments
    everywhere else can likewise empty the entire image.  But that
    optimization is left for another day.
    
    Signed-off-by: default avatarEric Blake <eblake@redhat.com>
    Message-id: 20170331185356.2479-3-eblake@redhat.com
    Reviewed-by: default avatarMax Reitz <mreitz@redhat.com>
    Signed-off-by: default avatarMax Reitz <mreitz@redhat.com>
Loading