qemu/block
Stefan Hajnoczi aef4acb661 qcow2: avoid reentrant bdrv_read() in copy_sectors()
A BlockDriverState should not issue requests on itself through the
public block layer interface.  Nested, or reentrant, requests are
problematic because they do I/O throttling and request tracking twice.

Features like block layer copy-on-read use request tracking to avoid
race conditions between concurrent requests.  The reentrant request will
have to "wait" for its parent request to complete.  But the parent is
waiting for the reentrant request to make progress so we have reached
deadlock.

The solution is for block drivers to avoid the public block layer
interfaces for reentrant requests.   Instead they should call their own
internal functions if they wish to perform reentrant requests.

This is also a good opportunity to make copy_sectors() a true
coroutine_fn.  That means calling bdrv_co_writev() instead of
bdrv_write().  Behavior is unchanged but we're being explicit that this
executes in coroutine context.

Signed-off-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
2011-12-05 14:49:47 +01:00
..
blkdebug.c block: drop redundant bdrv_flush implementation 2011-10-21 17:34:13 +02:00
blkverify.c block: drop redundant bdrv_flush implementation 2011-10-21 17:34:13 +02:00
bochs.c block: take lock around bdrv_read implementations 2011-10-21 17:34:14 +02:00
cloop.c block/cloop: Use g_free instead of free 2011-11-04 14:24:12 +01:00
cow.c block: Rename bdrv_co_flush to bdrv_co_flush_to_disk 2011-11-11 14:02:59 +01:00
curl.c block/curl: Don't finish AIOCBs too early 2011-09-21 15:16:04 +02:00
dmg.c block: take lock around bdrv_read implementations 2011-10-21 17:34:14 +02:00
iscsi.c iSCSI block driver 2011-10-28 19:25:48 +02:00
nbd.c block: take lock around bdrv_write implementations 2011-10-21 17:34:14 +02:00
parallels.c block: take lock around bdrv_read implementations 2011-10-21 17:34:14 +02:00
qcow.c qcow: Add migration blocker 2011-11-23 17:03:59 +01:00
qcow2-cache.c Use glib memory allocation and free functions 2011-08-20 23:01:08 -05:00
qcow2-cluster.c qcow2: avoid reentrant bdrv_read() in copy_sectors() 2011-12-05 14:49:47 +01:00
qcow2-refcount.c qcow2: remove unused qcow2_create_refcount_update function 2011-08-25 15:23:10 +02:00
qcow2-snapshot.c Use new macro QEMU_PACKED for packed structures 2011-09-03 10:45:59 +00:00
qcow2.c qcow2: implement bdrv_invalidate_cache (v2) 2011-11-21 14:58:48 -06:00
qcow2.h qcow2: implement bdrv_invalidate_cache (v2) 2011-11-21 14:58:48 -06:00
qed-check.c Use glib memory allocation and free functions 2011-08-20 23:01:08 -05:00
qed-cluster.c Use glib memory allocation and free functions 2011-08-20 23:01:08 -05:00
qed-gencb.c Use glib memory allocation and free functions 2011-08-20 23:01:08 -05:00
qed-l2-cache.c Use glib memory allocation and free functions 2011-08-20 23:01:08 -05:00
qed-table.c qed: fix use-after-free during l2 cache commit 2011-10-05 10:52:31 -05:00
qed.c qed: add migration blocker (v2) 2011-11-21 14:58:48 -06:00
qed.h qed: add migration blocker (v2) 2011-11-21 14:58:48 -06:00
raw-posix-aio.h Remove aio_ctx from paio_* interface 2009-10-30 08:39:34 -05:00
raw-posix.c block: change discard to co_discard 2011-10-21 17:34:14 +02:00
raw-win32.c block: Rename bdrv_co_flush to bdrv_co_flush_to_disk 2011-11-11 14:02:59 +01:00
raw.c block: Rename bdrv_co_flush to bdrv_co_flush_to_disk 2011-11-11 14:02:59 +01:00
rbd.c block: Rename bdrv_co_flush to bdrv_co_flush_to_disk 2011-11-11 14:02:59 +01:00
sheepdog.c sheepdog: Avoid deadlock in error path 2011-11-22 10:33:43 +01:00
vdi.c vdi: Fix memory leak 2011-11-23 17:04:05 +01:00
vmdk.c vmdk: Add migration blocker 2011-11-23 17:04:03 +01:00
vpc.c vpc: Add missing error handling in alloc_block 2011-11-23 17:04:06 +01:00
vvfat.c vvfat: Add migration blocker 2011-11-23 17:04:05 +01:00