block: Don't wait serialising for non-COR read requests
The assertion problem was noticed in 06c3916b35
, but it wasn't
completely fixed, because even though the req is not marked as
serialising, it still gets serialised by wait_serialising_requests
against other serialising requests, which could lead to the same
assertion failure.
Fix it by even more explicitly skipping the serialising for this
specific case.
Signed-off-by: Fam Zheng <famz@redhat.com>
Message-id: 1448962590-2842-2-git-send-email-famz@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
d21e8776f6
commit
61408b250e
@ -132,7 +132,7 @@ static int coroutine_fn backup_do_cow(BlockDriverState *bs,
|
|||||||
qemu_iovec_init_external(&bounce_qiov, &iov, 1);
|
qemu_iovec_init_external(&bounce_qiov, &iov, 1);
|
||||||
|
|
||||||
if (is_write_notifier) {
|
if (is_write_notifier) {
|
||||||
ret = bdrv_co_no_copy_on_readv(bs,
|
ret = bdrv_co_readv_no_serialising(bs,
|
||||||
start * BACKUP_SECTORS_PER_CLUSTER,
|
start * BACKUP_SECTORS_PER_CLUSTER,
|
||||||
n, &bounce_qiov);
|
n, &bounce_qiov);
|
||||||
} else {
|
} else {
|
||||||
|
12
block/io.c
12
block/io.c
@ -863,7 +863,9 @@ static int coroutine_fn bdrv_aligned_preadv(BlockDriverState *bs,
|
|||||||
mark_request_serialising(req, bdrv_get_cluster_size(bs));
|
mark_request_serialising(req, bdrv_get_cluster_size(bs));
|
||||||
}
|
}
|
||||||
|
|
||||||
wait_serialising_requests(req);
|
if (!(flags & BDRV_REQ_NO_SERIALISING)) {
|
||||||
|
wait_serialising_requests(req);
|
||||||
|
}
|
||||||
|
|
||||||
if (flags & BDRV_REQ_COPY_ON_READ) {
|
if (flags & BDRV_REQ_COPY_ON_READ) {
|
||||||
int pnum;
|
int pnum;
|
||||||
@ -952,7 +954,7 @@ static int coroutine_fn bdrv_co_do_preadv(BlockDriverState *bs,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Don't do copy-on-read if we read data before write operation */
|
/* Don't do copy-on-read if we read data before write operation */
|
||||||
if (bs->copy_on_read && !(flags & BDRV_REQ_NO_COPY_ON_READ)) {
|
if (bs->copy_on_read && !(flags & BDRV_REQ_NO_SERIALISING)) {
|
||||||
flags |= BDRV_REQ_COPY_ON_READ;
|
flags |= BDRV_REQ_COPY_ON_READ;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1021,13 +1023,13 @@ int coroutine_fn bdrv_co_readv(BlockDriverState *bs, int64_t sector_num,
|
|||||||
return bdrv_co_do_readv(bs, sector_num, nb_sectors, qiov, 0);
|
return bdrv_co_do_readv(bs, sector_num, nb_sectors, qiov, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int coroutine_fn bdrv_co_no_copy_on_readv(BlockDriverState *bs,
|
int coroutine_fn bdrv_co_readv_no_serialising(BlockDriverState *bs,
|
||||||
int64_t sector_num, int nb_sectors, QEMUIOVector *qiov)
|
int64_t sector_num, int nb_sectors, QEMUIOVector *qiov)
|
||||||
{
|
{
|
||||||
trace_bdrv_co_no_copy_on_readv(bs, sector_num, nb_sectors);
|
trace_bdrv_co_readv_no_serialising(bs, sector_num, nb_sectors);
|
||||||
|
|
||||||
return bdrv_co_do_readv(bs, sector_num, nb_sectors, qiov,
|
return bdrv_co_do_readv(bs, sector_num, nb_sectors, qiov,
|
||||||
BDRV_REQ_NO_COPY_ON_READ);
|
BDRV_REQ_NO_SERIALISING);
|
||||||
}
|
}
|
||||||
|
|
||||||
int coroutine_fn bdrv_co_copy_on_readv(BlockDriverState *bs,
|
int coroutine_fn bdrv_co_copy_on_readv(BlockDriverState *bs,
|
||||||
|
@ -61,7 +61,7 @@ typedef enum {
|
|||||||
* opened with BDRV_O_UNMAP.
|
* opened with BDRV_O_UNMAP.
|
||||||
*/
|
*/
|
||||||
BDRV_REQ_MAY_UNMAP = 0x4,
|
BDRV_REQ_MAY_UNMAP = 0x4,
|
||||||
BDRV_REQ_NO_COPY_ON_READ = 0x8,
|
BDRV_REQ_NO_SERIALISING = 0x8,
|
||||||
} BdrvRequestFlags;
|
} BdrvRequestFlags;
|
||||||
|
|
||||||
typedef struct BlockSizes {
|
typedef struct BlockSizes {
|
||||||
@ -248,7 +248,7 @@ int coroutine_fn bdrv_co_readv(BlockDriverState *bs, int64_t sector_num,
|
|||||||
int nb_sectors, QEMUIOVector *qiov);
|
int nb_sectors, QEMUIOVector *qiov);
|
||||||
int coroutine_fn bdrv_co_copy_on_readv(BlockDriverState *bs,
|
int coroutine_fn bdrv_co_copy_on_readv(BlockDriverState *bs,
|
||||||
int64_t sector_num, int nb_sectors, QEMUIOVector *qiov);
|
int64_t sector_num, int nb_sectors, QEMUIOVector *qiov);
|
||||||
int coroutine_fn bdrv_co_no_copy_on_readv(BlockDriverState *bs,
|
int coroutine_fn bdrv_co_readv_no_serialising(BlockDriverState *bs,
|
||||||
int64_t sector_num, int nb_sectors, QEMUIOVector *qiov);
|
int64_t sector_num, int nb_sectors, QEMUIOVector *qiov);
|
||||||
int coroutine_fn bdrv_co_writev(BlockDriverState *bs, int64_t sector_num,
|
int coroutine_fn bdrv_co_writev(BlockDriverState *bs, int64_t sector_num,
|
||||||
int nb_sectors, QEMUIOVector *qiov);
|
int nb_sectors, QEMUIOVector *qiov);
|
||||||
|
@ -69,7 +69,7 @@ bdrv_aio_write_zeroes(void *bs, int64_t sector_num, int nb_sectors, int flags, v
|
|||||||
bdrv_lock_medium(void *bs, bool locked) "bs %p locked %d"
|
bdrv_lock_medium(void *bs, bool locked) "bs %p locked %d"
|
||||||
bdrv_co_readv(void *bs, int64_t sector_num, int nb_sector) "bs %p sector_num %"PRId64" nb_sectors %d"
|
bdrv_co_readv(void *bs, int64_t sector_num, int nb_sector) "bs %p sector_num %"PRId64" nb_sectors %d"
|
||||||
bdrv_co_copy_on_readv(void *bs, int64_t sector_num, int nb_sector) "bs %p sector_num %"PRId64" nb_sectors %d"
|
bdrv_co_copy_on_readv(void *bs, int64_t sector_num, int nb_sector) "bs %p sector_num %"PRId64" nb_sectors %d"
|
||||||
bdrv_co_no_copy_on_readv(void *bs, int64_t sector_num, int nb_sector) "bs %p sector_num %"PRId64" nb_sectors %d"
|
bdrv_co_readv_no_serialising(void *bs, int64_t sector_num, int nb_sector) "bs %p sector_num %"PRId64" nb_sectors %d"
|
||||||
bdrv_co_writev(void *bs, int64_t sector_num, int nb_sector) "bs %p sector_num %"PRId64" nb_sectors %d"
|
bdrv_co_writev(void *bs, int64_t sector_num, int nb_sector) "bs %p sector_num %"PRId64" nb_sectors %d"
|
||||||
bdrv_co_write_zeroes(void *bs, int64_t sector_num, int nb_sector, int flags) "bs %p sector_num %"PRId64" nb_sectors %d flags %#x"
|
bdrv_co_write_zeroes(void *bs, int64_t sector_num, int nb_sector, int flags) "bs %p sector_num %"PRId64" nb_sectors %d flags %#x"
|
||||||
bdrv_co_io_em(void *bs, int64_t sector_num, int nb_sectors, int is_write, void *acb) "bs %p sector_num %"PRId64" nb_sectors %d is_write %d acb %p"
|
bdrv_co_io_em(void *bs, int64_t sector_num, int nb_sectors, int is_write, void *acb) "bs %p sector_num %"PRId64" nb_sectors %d is_write %d acb %p"
|
||||||
|
Loading…
Reference in New Issue
Block a user