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. Kevin