Message ID | 1372678184-5008-1-git-send-email-stefanha@redhat.com |
---|---|
State | New |
Headers | show |
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-stable@nongnu.org > Signed-off-by: Stefan Hajnoczi <stefanha@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
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-stable@nongnu.org > > Signed-off-by: Stefan Hajnoczi <stefanha@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
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); if (bs->drv) {
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-stable@nongnu.org Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> --- block.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)