Message ID | 1432115859-11413-3-git-send-email-dimara@arrikto.com |
---|---|
State | New |
Headers | show |
On Wed, May 20, 2015 at 12:57:36PM +0300, Dimitris Aragiorgis wrote: > During migration, QEMU uses fsync()/fdatasync() on the open file > descriptor for read-write block devices to flush data just before > stopping the VM. > > However, fsync() on a scsi-generic device returns -EINVAL which > causes the migration to fail. This patch skips flushing data in case > of an SG device, since submitting SCSI commands directly via an SG > character device (e.g. /dev/sg0) bypasses the page cache completely, > anyway. > > Note that fsync() not only flushes the page cache but also the disk > cache. The scsi-generic device never sends flushes, and for > migration it assumes that the same SCSI device is used by the > destination host, so it does not issue any SCSI SYNCHRONIZE CACHE > (10) command. > > Finally, remove the bdrv_is_sg() test from iscsi_co_flush() since > this is now redundant (we flush the underlying protocol at the end > of bdrv_co_flush() which, with this patch, we never reach). > > Signed-off-by: Dimitris Aragiorgis <dimara@arrikto.com> > --- > block/io.c | 3 ++- > block/iscsi.c | 4 ---- > 2 files changed, 2 insertions(+), 5 deletions(-) Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
diff --git a/block/io.c b/block/io.c index 1ce62c4..922dc07 100644 --- a/block/io.c +++ b/block/io.c @@ -2231,7 +2231,8 @@ int coroutine_fn bdrv_co_flush(BlockDriverState *bs) { int ret; - if (!bs || !bdrv_is_inserted(bs) || bdrv_is_read_only(bs)) { + if (!bs || !bdrv_is_inserted(bs) || bdrv_is_read_only(bs) || + bdrv_is_sg(bs)) { return 0; } diff --git a/block/iscsi.c b/block/iscsi.c index 502a81f..965978b 100644 --- a/block/iscsi.c +++ b/block/iscsi.c @@ -627,10 +627,6 @@ static int coroutine_fn iscsi_co_flush(BlockDriverState *bs) IscsiLun *iscsilun = bs->opaque; struct IscsiTask iTask; - if (bdrv_is_sg(bs)) { - return 0; - } - if (!iscsilun->force_next_flush) { return 0; }
During migration, QEMU uses fsync()/fdatasync() on the open file descriptor for read-write block devices to flush data just before stopping the VM. However, fsync() on a scsi-generic device returns -EINVAL which causes the migration to fail. This patch skips flushing data in case of an SG device, since submitting SCSI commands directly via an SG character device (e.g. /dev/sg0) bypasses the page cache completely, anyway. Note that fsync() not only flushes the page cache but also the disk cache. The scsi-generic device never sends flushes, and for migration it assumes that the same SCSI device is used by the destination host, so it does not issue any SCSI SYNCHRONIZE CACHE (10) command. Finally, remove the bdrv_is_sg() test from iscsi_co_flush() since this is now redundant (we flush the underlying protocol at the end of bdrv_co_flush() which, with this patch, we never reach). Signed-off-by: Dimitris Aragiorgis <dimara@arrikto.com> --- block/io.c | 3 ++- block/iscsi.c | 4 ---- 2 files changed, 2 insertions(+), 5 deletions(-)