Message ID | 1450290827-30508-3-git-send-email-pbonzini@redhat.com |
---|---|
State | New |
Headers | show |
On Wed, 12/16 19:33, Paolo Bonzini wrote: > Do not use bdrv_drain, since by itself it does not guarantee > anything. > > Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> > --- > block/snapshot.c | 23 ++++++++++++++--------- > 1 file changed, 14 insertions(+), 9 deletions(-) > > diff --git a/block/snapshot.c b/block/snapshot.c > index 6e9fa8d..2d86b88 100644 > --- a/block/snapshot.c > +++ b/block/snapshot.c > @@ -229,6 +229,8 @@ int bdrv_snapshot_delete(BlockDriverState *bs, > Error **errp) > { > BlockDriver *drv = bs->drv; > + int ret; > + > if (!drv) { > error_setg(errp, QERR_DEVICE_HAS_NO_MEDIUM, bdrv_get_device_name(bs)); > return -ENOMEDIUM; > @@ -239,18 +241,21 @@ int bdrv_snapshot_delete(BlockDriverState *bs, > } > > /* drain all pending i/o before deleting snapshot */ > - bdrv_drain(bs); > + bdrv_drained_begin(bs); > > if (drv->bdrv_snapshot_delete) { > - return drv->bdrv_snapshot_delete(bs, snapshot_id, name, errp); > + ret = drv->bdrv_snapshot_delete(bs, snapshot_id, name, errp); > + } else if (bs->file) { > + ret = bdrv_snapshot_delete(bs->file->bs, snapshot_id, name, errp); > + } else { > + error_setg(errp, "Block format '%s' used by device '%s' " > + "does not support internal snapshot deletion", > + drv->format_name, bdrv_get_device_name(bs)); > + ret = -ENOTSUP; > } > - if (bs->file) { > - return bdrv_snapshot_delete(bs->file->bs, snapshot_id, name, errp); > - } > - error_setg(errp, "Block format '%s' used by device '%s' " > - "does not support internal snapshot deletion", > - drv->format_name, bdrv_get_device_name(bs)); > - return -ENOTSUP; > + > + bdrv_drained_end(bs); > + return ret; > } > > int bdrv_snapshot_delete_by_id_or_name(BlockDriverState *bs, > -- > 2.5.0 > > Reviewed-by: Fam Zheng <famz@redhat.com>
[ Cc: qemu-block ] Am 17.12.2015 um 02:55 hat Fam Zheng geschrieben: > On Wed, 12/16 19:33, Paolo Bonzini wrote: > > Do not use bdrv_drain, since by itself it does not guarantee > > anything. > > > > Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Thanks, applied to the block branch. Kevin > > block/snapshot.c | 23 ++++++++++++++--------- > > 1 file changed, 14 insertions(+), 9 deletions(-) > > > > diff --git a/block/snapshot.c b/block/snapshot.c > > index 6e9fa8d..2d86b88 100644 > > --- a/block/snapshot.c > > +++ b/block/snapshot.c > > @@ -229,6 +229,8 @@ int bdrv_snapshot_delete(BlockDriverState *bs, > > Error **errp) > > { > > BlockDriver *drv = bs->drv; > > + int ret; > > + > > if (!drv) { > > error_setg(errp, QERR_DEVICE_HAS_NO_MEDIUM, bdrv_get_device_name(bs)); > > return -ENOMEDIUM; > > @@ -239,18 +241,21 @@ int bdrv_snapshot_delete(BlockDriverState *bs, > > } > > > > /* drain all pending i/o before deleting snapshot */ > > - bdrv_drain(bs); > > + bdrv_drained_begin(bs); > > > > if (drv->bdrv_snapshot_delete) { > > - return drv->bdrv_snapshot_delete(bs, snapshot_id, name, errp); > > + ret = drv->bdrv_snapshot_delete(bs, snapshot_id, name, errp); > > + } else if (bs->file) { > > + ret = bdrv_snapshot_delete(bs->file->bs, snapshot_id, name, errp); > > + } else { > > + error_setg(errp, "Block format '%s' used by device '%s' " > > + "does not support internal snapshot deletion", > > + drv->format_name, bdrv_get_device_name(bs)); > > + ret = -ENOTSUP; > > } > > - if (bs->file) { > > - return bdrv_snapshot_delete(bs->file->bs, snapshot_id, name, errp); > > - } > > - error_setg(errp, "Block format '%s' used by device '%s' " > > - "does not support internal snapshot deletion", > > - drv->format_name, bdrv_get_device_name(bs)); > > - return -ENOTSUP; > > + > > + bdrv_drained_end(bs); > > + return ret; > > } > > > > int bdrv_snapshot_delete_by_id_or_name(BlockDriverState *bs, > > -- > > 2.5.0 > > > > > > Reviewed-by: Fam Zheng <famz@redhat.com> >
diff --git a/block/snapshot.c b/block/snapshot.c index 6e9fa8d..2d86b88 100644 --- a/block/snapshot.c +++ b/block/snapshot.c @@ -229,6 +229,8 @@ int bdrv_snapshot_delete(BlockDriverState *bs, Error **errp) { BlockDriver *drv = bs->drv; + int ret; + if (!drv) { error_setg(errp, QERR_DEVICE_HAS_NO_MEDIUM, bdrv_get_device_name(bs)); return -ENOMEDIUM; @@ -239,18 +241,21 @@ int bdrv_snapshot_delete(BlockDriverState *bs, } /* drain all pending i/o before deleting snapshot */ - bdrv_drain(bs); + bdrv_drained_begin(bs); if (drv->bdrv_snapshot_delete) { - return drv->bdrv_snapshot_delete(bs, snapshot_id, name, errp); + ret = drv->bdrv_snapshot_delete(bs, snapshot_id, name, errp); + } else if (bs->file) { + ret = bdrv_snapshot_delete(bs->file->bs, snapshot_id, name, errp); + } else { + error_setg(errp, "Block format '%s' used by device '%s' " + "does not support internal snapshot deletion", + drv->format_name, bdrv_get_device_name(bs)); + ret = -ENOTSUP; } - if (bs->file) { - return bdrv_snapshot_delete(bs->file->bs, snapshot_id, name, errp); - } - error_setg(errp, "Block format '%s' used by device '%s' " - "does not support internal snapshot deletion", - drv->format_name, bdrv_get_device_name(bs)); - return -ENOTSUP; + + bdrv_drained_end(bs); + return ret; } int bdrv_snapshot_delete_by_id_or_name(BlockDriverState *bs,
Do not use bdrv_drain, since by itself it does not guarantee anything. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> --- block/snapshot.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-)