From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:56840) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YsSxm-0003um-6D for qemu-devel@nongnu.org; Wed, 13 May 2015 05:28:27 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YsSxl-0001eV-0a for qemu-devel@nongnu.org; Wed, 13 May 2015 05:28:26 -0400 From: Fam Zheng Date: Wed, 13 May 2015 17:28:09 +0000 Message-Id: <1431538099-3286-2-git-send-email-famz@redhat.com> In-Reply-To: <1431538099-3286-1-git-send-email-famz@redhat.com> References: <1431538099-3286-1-git-send-email-famz@redhat.com> Subject: [Qemu-devel] [PATCH v2 01/11] block: Add op blocker type "device IO" List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Kevin Wolf , qemu-block@nongnu.org, jcody@redhat.com, armbru@redhat.com, mreitz@redhat.com, Stefan Hajnoczi , pbonzini@redhat.com Preventing device from submitting IO is useful around various nested aio_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, which means device IO is temporarily disabled by another BDS user. Signed-off-by: Fam Zheng --- block/block-backend.c | 4 ++++ include/block/block.h | 1 + 2 files changed, 5 insertions(+) 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; -- 2.4.0