[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 15/50] block: Fail requests to empty BlockBackend
From: |
Max Reitz |
Subject: |
[Qemu-devel] [PATCH 15/50] block: Fail requests to empty BlockBackend |
Date: |
Mon, 26 Jan 2015 11:02:49 -0500 |
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 <address@hidden>
---
block/block-backend.c | 43 ++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 42 insertions(+), 1 deletion(-)
diff --git a/block/block-backend.c b/block/block-backend.c
index 62be370..4f3122a 100644
--- a/block/block-backend.c
+++ b/block/block-backend.c
@@ -507,7 +507,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;
}
@@ -635,6 +635,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);
}
@@ -670,6 +674,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);
}
@@ -711,12 +719,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);
}
@@ -732,11 +748,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);
}
@@ -853,6 +877,11 @@ void blk_set_enable_write_cache(BlockBackend *blk, bool
wce)
void blk_invalidate_cache(BlockBackend *blk, Error **errp)
{
+ if (!blk->bs) {
+ error_set(errp, QERR_DEVICE_HAS_NO_MEDIUM, blk->name);
+ return;
+ }
+
bdrv_invalidate_cache(blk->bs, errp);
}
@@ -1003,6 +1032,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);
}
@@ -1019,11 +1052,19 @@ 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);
}
--
2.1.0
- [Qemu-devel] [PATCH 12/50] block: Move I/O status and error actions into BB, (continued)
- [Qemu-devel] [PATCH 12/50] block: Move I/O status and error actions into BB, Max Reitz, 2015/01/26
- [Qemu-devel] [PATCH 11/50] block: Move BlockAcctStats into BlockBackend, Max Reitz, 2015/01/26
- [Qemu-devel] [PATCH 07/50] block: Make bdrv_is_inserted() recursive, Max Reitz, 2015/01/26
- [Qemu-devel] [PATCH 09/50] block: Move guest_block_size into BlockBackend, Max Reitz, 2015/01/26
- [Qemu-devel] [PATCH 20/50] blockdev: Check blk_is_available() in sn-del-int-sync, Max Reitz, 2015/01/26
- [Qemu-devel] [PATCH 21/50] blockdev: Check BB validity in internal snapshot TA, Max Reitz, 2015/01/26
- [Qemu-devel] [PATCH 16/50] block: Prepare remaining BB functions for NULL BDS, Max Reitz, 2015/01/26
- [Qemu-devel] [PATCH 22/50] blockdev: Check BB validity in drive-backup TA, Max Reitz, 2015/01/26
- [Qemu-devel] [PATCH 10/50] block: Remove wr_highest_offset from BlockAcctStats, Max Reitz, 2015/01/26
- [Qemu-devel] [PATCH 18/50] block: Respect empty BB in bdrv_query_info(), Max Reitz, 2015/01/26
- [Qemu-devel] [PATCH 15/50] block: Fail requests to empty BlockBackend,
Max Reitz <=
- [Qemu-devel] [PATCH 19/50] blockdev: Use BlockBackend for blockdev-backup TA, Max Reitz, 2015/01/26
- [Qemu-devel] [PATCH 17/50] block: Respect empty BB in bdrv_lookup_bs(), Max Reitz, 2015/01/26
- [Qemu-devel] [PATCH 23/50] blockdev: Catch NULL BDS in block_set_io_throttle, Max Reitz, 2015/01/26
- [Qemu-devel] [PATCH 25/50] blockdev: Check BB validity in block-commit, Max Reitz, 2015/01/26
- [Qemu-devel] [PATCH 27/50] blockdev: Check BB validity in blockdev-backup, Max Reitz, 2015/01/26
- [Qemu-devel] [PATCH 24/50] blockdev: Check BB validity in block-stream, Max Reitz, 2015/01/26
- [Qemu-devel] [PATCH 28/50] blockdev: Check BB validity in drive-mirror, Max Reitz, 2015/01/26
- [Qemu-devel] [PATCH 29/50] blockdev: Check BB validity in find_block_job(), Max Reitz, 2015/01/26
- [Qemu-devel] [PATCH 34/50] blockdev: Do not create BDS for empty drive, Max Reitz, 2015/01/26
- [Qemu-devel] [PATCH 26/50] blockdev: Check BB validity in drive-backup, Max Reitz, 2015/01/26