On Tue, Jul 02, 2013 at 11:38:33AM +0200, Kevin Wolf wrote: > Am 01.07.2013 um 13:29 hat Stefan Hajnoczi geschrieben: > > Since 80ccf93b we flush the block device during close. The > > bdrv_drain_all() call should come before bdrv_flush() to ensure guest > > write requests have completed. Otherwise we may miss pending writes > > when flushing. > > > > However, there is still a slight change that cancelling a blockjob or > > doing bdrv_flush() might leave an I/O request running, so call > > bdrv_drain_all() again for safety as the final step. > > > > Cc: qemu-sta...@nongnu.org > > Signed-off-by: Stefan Hajnoczi <stefa...@redhat.com> > > --- > > block.c | 5 +++-- > > 1 file changed, 3 insertions(+), 2 deletions(-) > > > > diff --git a/block.c b/block.c > > index 6c493ad..fca55b1 100644 > > --- a/block.c > > +++ b/block.c > > @@ -1358,11 +1358,12 @@ void bdrv_reopen_abort(BDRVReopenState > > *reopen_state) > > > > void bdrv_close(BlockDriverState *bs) > > { > > - bdrv_flush(bs); > > + bdrv_drain_all(); /* complete guest I/O */ > > if (bs->job) { > > block_job_cancel_sync(bs->job); > > } > > - bdrv_drain_all(); > > + bdrv_flush(bs); > > + bdrv_drain_all(); /* in case blockjob or flush started I/O */ > > notifier_list_notify(&bs->close_notifiers, bs); > > I think we need the bdrv_drain_all() immediately before calling > bdrv_flush(), so that block job writes are flushed as well. You can > probably move the first one there, there doesn't seem to be a reason to > drain guest requests and block job requests separately.
Good idea, will fix in v2. Stefan