Message ID | 1430911419-8256-2-git-send-email-famz@redhat.com |
---|---|
State | New |
Headers | show |
diff --git a/block/block-backend.c b/block/block-backend.c index 93e46f3..71fc695 100644 --- a/block/block-backend.c +++ b/block/block-backend.c @@ -478,6 +478,10 @@ static int blk_check_request(BlockBackend *blk, int64_t sector_num, return -EIO; } + if (bdrv_op_is_blocked(blk->bs, BLOCK_OP_TYPE_DEVICE_IO, NULL)) { + return -EBUSY; + } + return blk_check_byte_request(blk, sector_num * BDRV_SECTOR_SIZE, nb_sectors * BDRV_SECTOR_SIZE); } diff --git a/include/block/block.h b/include/block/block.h index 7d1a717..906fb31 100644 --- a/include/block/block.h +++ b/include/block/block.h @@ -159,6 +159,7 @@ typedef enum BlockOpType { BLOCK_OP_TYPE_RESIZE, BLOCK_OP_TYPE_STREAM, BLOCK_OP_TYPE_REPLACE, + BLOCK_OP_TYPE_DEVICE_IO, BLOCK_OP_TYPE_MAX, } BlockOpType;
Preventing device from submitting IO is useful around various nested poll. Op blocker is a good place to put this flag. Devices would submit IO requests through blk_* block backend interface, which calls blk_check_request to check the validity. Return -EBUSY if the operation is blocked, in which case device IO is temporarily disabled by another BDS user. Signed-off-by: Fam Zheng <famz@redhat.com> --- block/block-backend.c | 4 ++++ include/block/block.h | 1 + 2 files changed, 5 insertions(+)