From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34727) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Yt8jv-0007q3-D1 for qemu-devel@nongnu.org; Fri, 15 May 2015 02:04:56 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Yt8jt-0003jw-CM for qemu-devel@nongnu.org; Fri, 15 May 2015 02:04:55 -0400 From: Fam Zheng Date: Fri, 15 May 2015 14:04:16 +0800 Message-Id: <1431669868-26804-1-git-send-email-famz@redhat.com> Subject: [Qemu-devel] [PATCH v3 00/12] Fix transactional snapshot with dataplane and NBD export 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 Changes from v2, which covers virtio-scsi as well: - Patch 1: Review all bdrv_op_block_all callers. Document bdrv_op_blocker_add_notifier. Fix blocking in bdrv_op_blocker_notify. - Patch 11: Commit message and function comment update. - Patch 12: New. Reported by Paolo. Unlike the iohandler in main loop, iothreads currently process the event notifier used by virtio-blk ioeventfd in nested aio_poll. This is dangerous without proper protection, because guest requests could sneak to block layer where they mustn't. For example, a QMP transaction may involve multiple bdrv_drain_all() in handling the list of AioContext it works on. If an aio_poll in one of the bdrv_drain_all() happens to process a guest VQ kick, and dispatches the ioeventfd event to virtio-blk, a new guest write is then submitted, and voila, the transaction semantics is violated. This series avoids this problem by disabling virtio-blk handlers during bdrv_drain_all() and transactions. - Patches 1~3 add the block layer op blocker change notifier code. - Patches 4,5 secure virtio-blk dataplane. - Patch 6 secures nbd export. - Patch 7~10 protect each transaction type from being voilated by new IO generated in nested aio_poll. - Patch 11 protects bdrv_drain and bdrv_drain_all. - Patch 12 does the same protection to virtio-scsi dataplane. Fam Zheng (12): block: Add op blocker type "device IO" block: Add op blocker notifier list block-backend: Add blk_op_blocker_add_notifier virtio-blk: Move complete_request to 'ops' structure virtio-blk: Don't handle output when there is "device IO" op blocker nbd-server: Clear "can_read" when "device io" blocker is set blockdev: Block device IO during internal snapshot transaction blockdev: Block device IO during external snapshot transaction blockdev: Block device IO during drive-backup transaction blockdev: Block device IO during blockdev-backup transaction block: Block "device IO" during bdrv_drain and bdrv_drain_all virtio-scsi-dataplane: Add "device IO" op blocker listener block.c | 35 ++++++++++++++++ block/block-backend.c | 6 +++ block/io.c | 22 +++++++++- blockdev.c | 49 ++++++++++++++++++---- blockjob.c | 1 + hw/block/dataplane/virtio-blk.c | 37 ++++++++++++++--- hw/block/virtio-blk.c | 69 +++++++++++++++++++++++++++++-- hw/scsi/virtio-scsi-dataplane.c | 91 ++++++++++++++++++++++++++++++++--------- hw/scsi/virtio-scsi.c | 4 ++ include/block/block.h | 9 ++++ include/block/block_int.h | 3 ++ include/hw/virtio/virtio-blk.h | 17 ++++++-- include/hw/virtio/virtio-scsi.h | 3 ++ include/sysemu/block-backend.h | 2 + migration/block.c | 1 + nbd.c | 18 ++++++++ 16 files changed, 327 insertions(+), 40 deletions(-) -- 2.4.0