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?