Am 07.10.2013 um 10:29 schrieb Stefan Hajnoczi <stefa...@gmail.com>:

> On Tue, Sep 24, 2013 at 03:35:02PM +0200, Peter Lieven wrote:
>> @@ -4245,7 +4250,37 @@ int coroutine_fn bdrv_co_discard(BlockDriverState 
>> *bs, int64_t sector_num,
>>     }
>> 
>>     if (bs->drv->bdrv_co_discard) {
>> -        return bs->drv->bdrv_co_discard(bs, sector_num, nb_sectors);
>> +        int max_discard = bs->bl.max_discard ?
>> +                          bs->bl.max_discard : MAX_DISCARD_DEFAULT;
>> +
>> +        while (nb_sectors > 0) {
>> +            int ret;
>> +            int num = nb_sectors;
>> +
>> +            /* align request */
>> +            if (bs->bl.discard_alignment &&
>> +                num >= bs->bl.discard_alignment &&
>> +                sector_num % bs->bl.discard_alignment) {
>> +                if (num > bs->bl.discard_alignment) {
>> +                    num = bs->bl.discard_alignment;
>> +                }
>> +                num -= sector_num % bs->bl.discard_alignment;
>> +            }
> 
> Is it always possible to discard at arbitrary sector offsets?

It should be. This just makes sure that the unaligned part of a request gets 
executed first (eventually resulting in an -ENOTSUP) and
consecutive calls are aligned.

For example. The alignment is 1MB (2048 sectors) and max_discard its 2048 
sectors as well.. Lets say you want to discard 4096 sectors starting at offset 
1024.

Then there will be 3 calls
1) discard at 1024, len 1024
2) discard at 2048, len 2048
3) discard at 4096, len 1024.

Peter

Reply via email to