qemu/block
Paolo Bonzini 3e914655f2 block: fix streaming/closing race
Streaming can issue I/O while qcow2_close is running.  This causes the
L2 caches to become very confused or, alternatively, could cause a
segfault when the streaming coroutine is reentered after closing its
block device.  The fix is to cancel streaming jobs when closing their
underlying device.

The cancellation must be synchronous, on the other hand qemu_aio_wait
will not restart a coroutine that is sleeping in co_sleep.  So add
a flag saying whether streaming has in-flight I/O.  If the busy flag
is false, the coroutine is quiescent and, when cancelled, will not
issue any new I/O.

This protects streaming against closing, but not against deleting.
We have a reference count protecting us against concurrent deletion,
but I still added an assertion to ensure nothing bad happens.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
2012-04-05 14:54:40 +02:00
..
blkdebug.c block: push recursive flushing up from drivers 2012-04-05 14:54:39 +02:00
blkverify.c block: replace unchecked strdup/malloc/calloc with glib 2012-01-26 11:39:03 +01: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: push recursive flushing up from drivers 2012-04-05 14:54:39 +02:00
curl.c block: qemu_aio_get does not return NULL 2011-12-15 12:40:08 +01:00
dmg.c block: take lock around bdrv_read implementations 2011-10-21 17:34:14 +02:00
iscsi.c iSCSI: add configuration variables for iSCSI 2012-02-09 16:17:50 +01:00
nbd.c nbd: add support for NBD_CMD_TRIM 2011-12-22 11:53:57 +01:00
parallels.c block: take lock around bdrv_read implementations 2011-10-21 17:34:14 +02:00
qcow.c block: push recursive flushing up from drivers 2012-04-05 14:54:39 +02:00
qcow2-cache.c qcow2: Add some tracing 2012-03-12 15:14:06 +01:00
qcow2-cluster.c qcow2: Remove unused parameter in get_cluster_table() 2012-04-05 14:54:39 +02:00
qcow2-refcount.c qcow2: Add qcow2_alloc_clusters_at() 2012-03-12 15:14:07 +01:00
qcow2-snapshot.c qcow2: Allow >4 GB VM state 2011-12-15 12:40:33 +01:00
qcow2.c block: push recursive flushing up from drivers 2012-04-05 14:54:39 +02:00
qcow2.h qcow2: Reduce number of I/O requests 2012-03-12 15:14:07 +01: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 qed: do not evict in-use L2 table cache entries 2012-03-12 15:14:06 +01:00
qed-table.c block: bdrv_aio_* do not return NULL 2011-12-15 12:40:07 +01:00
qed.c block: push recursive flushing up from drivers 2012-04-05 14:54:39 +02:00
qed.h qed: add .bdrv_co_write_zeroes() support 2012-02-09 16:17:50 +01:00
raw-posix-aio.h prepare for future GPLv2+ relicensing 2012-01-13 10:55:56 -06:00
raw-posix.c block: bdrv_eject(): Make eject_flag a real bool 2012-02-22 17:23:05 -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: push recursive flushing up from drivers 2012-04-05 14:54:39 +02:00
rbd.c rbd: wire up snapshot removal and rollback functionality 2012-01-26 11:39:03 +01:00
sheepdog.c sheepdog: fix co_recv coroutine context 2012-02-09 16:17:51 +01:00
stream.c block: fix streaming/closing race 2012-04-05 14:54:40 +02:00
vdi.c vdi: change goto to loop 2012-04-05 14:54:40 +02:00
vmdk.c block: push recursive flushing up from drivers 2012-04-05 14:54:39 +02:00
vpc.c block/vpc: write checksum back to footer after check 2012-04-05 14:54:40 +02:00
vvfat.c vvfat: avoid leaking file descriptor in commit_one_file() 2012-01-13 10:36:59 +00:00