Message ID | 1442589793-7105-20-git-send-email-mreitz@redhat.com |
---|---|
State | New |
Headers | show |
Am 18.09.2015 um 17:22 hat Max Reitz geschrieben: > If there is no BlockDriverState in a BlockBackend or if the tray of the > guest device is open, fail all requests (where that is possible) with > -ENOMEDIUM. > > The reason the status of the guest device is taken into account is > because once the guest device's tray is opened, any request on the same > BlockBackend as the guest uses should fail. If the BDS tree is supposed > to be usable even after ejecting it from the guest, a different > BlockBackend must be used. > > Signed-off-by: Max Reitz <mreitz@redhat.com> > Reviewed-by: Eric Blake <eblake@redhat.com> Do we want to include blk_drain() to make it a no-op instead of crashing? Also, we're now introducing BlockAIOCBs with a NULL bs with your use of abort_aio_request. I haven't carefully reviewed the implications of this yet, but that should definitely be done before we merge the series. Kevin
On 22.09.2015 16:30, Kevin Wolf wrote: > Am 18.09.2015 um 17:22 hat Max Reitz geschrieben: >> If there is no BlockDriverState in a BlockBackend or if the tray of the >> guest device is open, fail all requests (where that is possible) with >> -ENOMEDIUM. >> >> The reason the status of the guest device is taken into account is >> because once the guest device's tray is opened, any request on the same >> BlockBackend as the guest uses should fail. If the BDS tree is supposed >> to be usable even after ejecting it from the guest, a different >> BlockBackend must be used. >> >> Signed-off-by: Max Reitz <mreitz@redhat.com> >> Reviewed-by: Eric Blake <eblake@redhat.com> > > Do we want to include blk_drain() to make it a no-op instead of > crashing? Yes, we do, so that would be in patch 20. Thanks for catching that. > Also, we're now introducing BlockAIOCBs with a NULL bs with your use of > abort_aio_request. I haven't carefully reviewed the implications of this > yet, but that should definitely be done before we merge the series. That should be patch 12. Max
Am 22.09.2015 um 17:05 hat Max Reitz geschrieben: > On 22.09.2015 16:30, Kevin Wolf wrote: > > Am 18.09.2015 um 17:22 hat Max Reitz geschrieben: > >> If there is no BlockDriverState in a BlockBackend or if the tray of the > >> guest device is open, fail all requests (where that is possible) with > >> -ENOMEDIUM. > >> > >> The reason the status of the guest device is taken into account is > >> because once the guest device's tray is opened, any request on the same > >> BlockBackend as the guest uses should fail. If the BDS tree is supposed > >> to be usable even after ejecting it from the guest, a different > >> BlockBackend must be used. > >> > >> Signed-off-by: Max Reitz <mreitz@redhat.com> > >> Reviewed-by: Eric Blake <eblake@redhat.com> > > > > Do we want to include blk_drain() to make it a no-op instead of > > crashing? > > Yes, we do, so that would be in patch 20. Thanks for catching that. > > > Also, we're now introducing BlockAIOCBs with a NULL bs with your use of > > abort_aio_request. I haven't carefully reviewed the implications of this > > yet, but that should definitely be done before we merge the series. > > That should be patch 12. Yes, you caught me reviewing just correctness, but not completeness of patch 12. Kevin
diff --git a/block/block-backend.c b/block/block-backend.c index 417374f..0da4be9 100644 --- a/block/block-backend.c +++ b/block/block-backend.c @@ -509,7 +509,7 @@ static int blk_check_byte_request(BlockBackend *blk, int64_t offset, return -EIO; } - if (!blk_is_inserted(blk)) { + if (!blk_is_available(blk)) { return -ENOMEDIUM; } @@ -648,6 +648,10 @@ int blk_pwrite(BlockBackend *blk, int64_t offset, const void *buf, int count) int64_t blk_getlength(BlockBackend *blk) { + if (!blk_is_available(blk)) { + return -ENOMEDIUM; + } + return bdrv_getlength(blk->bs); } @@ -658,6 +662,10 @@ void blk_get_geometry(BlockBackend *blk, uint64_t *nb_sectors_ptr) int64_t blk_nb_sectors(BlockBackend *blk) { + if (!blk_is_available(blk)) { + return -ENOMEDIUM; + } + return bdrv_nb_sectors(blk->bs); } @@ -688,6 +696,10 @@ BlockAIOCB *blk_aio_writev(BlockBackend *blk, int64_t sector_num, BlockAIOCB *blk_aio_flush(BlockBackend *blk, BlockCompletionFunc *cb, void *opaque) { + if (!blk_is_available(blk)) { + return abort_aio_request(blk, cb, opaque, -ENOMEDIUM); + } + return bdrv_aio_flush(blk->bs, cb, opaque); } @@ -729,12 +741,20 @@ int blk_aio_multiwrite(BlockBackend *blk, BlockRequest *reqs, int num_reqs) int blk_ioctl(BlockBackend *blk, unsigned long int req, void *buf) { + if (!blk_is_available(blk)) { + return -ENOMEDIUM; + } + return bdrv_ioctl(blk->bs, req, buf); } BlockAIOCB *blk_aio_ioctl(BlockBackend *blk, unsigned long int req, void *buf, BlockCompletionFunc *cb, void *opaque) { + if (!blk_is_available(blk)) { + return abort_aio_request(blk, cb, opaque, -ENOMEDIUM); + } + return bdrv_aio_ioctl(blk->bs, req, buf, cb, opaque); } @@ -750,11 +770,19 @@ int blk_co_discard(BlockBackend *blk, int64_t sector_num, int nb_sectors) int blk_co_flush(BlockBackend *blk) { + if (!blk_is_available(blk)) { + return -ENOMEDIUM; + } + return bdrv_co_flush(blk->bs); } int blk_flush(BlockBackend *blk) { + if (!blk_is_available(blk)) { + return -ENOMEDIUM; + } + return bdrv_flush(blk->bs); } @@ -876,6 +904,11 @@ void blk_set_enable_write_cache(BlockBackend *blk, bool wce) void blk_invalidate_cache(BlockBackend *blk, Error **errp) { + if (!blk->bs) { + error_setg(errp, "Device '%s' has no medium", blk->name); + return; + } + bdrv_invalidate_cache(blk->bs, errp); } @@ -1031,6 +1064,10 @@ int blk_write_compressed(BlockBackend *blk, int64_t sector_num, int blk_truncate(BlockBackend *blk, int64_t offset) { + if (!blk_is_available(blk)) { + return -ENOMEDIUM; + } + return bdrv_truncate(blk->bs, offset); } @@ -1047,21 +1084,37 @@ int blk_discard(BlockBackend *blk, int64_t sector_num, int nb_sectors) int blk_save_vmstate(BlockBackend *blk, const uint8_t *buf, int64_t pos, int size) { + if (!blk_is_available(blk)) { + return -ENOMEDIUM; + } + return bdrv_save_vmstate(blk->bs, buf, pos, size); } int blk_load_vmstate(BlockBackend *blk, uint8_t *buf, int64_t pos, int size) { + if (!blk_is_available(blk)) { + return -ENOMEDIUM; + } + return bdrv_load_vmstate(blk->bs, buf, pos, size); } int blk_probe_blocksizes(BlockBackend *blk, BlockSizes *bsz) { + if (!blk_is_available(blk)) { + return -ENOMEDIUM; + } + return bdrv_probe_blocksizes(blk->bs, bsz); } int blk_probe_geometry(BlockBackend *blk, HDGeometry *geo) { + if (!blk_is_available(blk)) { + return -ENOMEDIUM; + } + return bdrv_probe_geometry(blk->bs, geo); }