On 12/10/2015 13:50, Fam Zheng wrote: > +void bdrv_drained_begin(BlockDriverState *bs) > +{ > + if (bs->quiesce_counter++) { > + return; > + } > + aio_disable_external(bdrv_get_aio_context(bs)); > + bdrv_drain(bs); > +}
I think bdrv_drain should be called unconditionally, i.e. before the "if". This should also solve Kevin's doubt about new allocating write request reenabling the timer: any write request from the drained section happens normally, until you get a nested drain request and then the callback completes the requests. Paolo