On Fri 20 Mar 2020 08:35:44 PM CET, Eric Blake <[email protected]> wrote:
>> This flag is however only supported when qcow_version >= 3. In older
>> images the cluster is simply deallocated, exposing any possible
>> previous data from the backing file.
>
> Discard is advisory, and has no requirements that discarded data read
> back as zero. However, if write zeroes uses discard under the hood,
> then THAT usage must guarantee reading back as zero.
write_zeroes doesn't seem to use discard in any case, so no problem
there.
>> @@ -3763,6 +3763,10 @@ static coroutine_fn int
>> qcow2_co_pdiscard(BlockDriverState *bs,
>> int ret;
>> BDRVQcow2State *s = bs->opaque;
>>
>> + if (s->qcow_version < 3) {
>> + return -ENOTSUP;
>> + }
>> +
>
> This changes it so you no longer see stale data, but doesn't change
> the fact that you don't read zeroes (just that your stale data is now
> from the current layer instead of the backing layer, since we did
> nothing at all).
discard can already fail if the request is not aligned, in this case you
get -ENOTSUP and stay with the same data as before.
What's different in this case is that you can actually get stale data,
that doesn't seem like a desirable outcome.
Berto