mirror.c (880953493386a69416d2e1cdc063c670585a03ac) mirror.c (9a5a1c621ed72161abcf461d46c7b7b7f97938bf)
1/*
2 * Image mirroring
3 *
4 * Copyright Red Hat, Inc. 2012
5 *
6 * Authors:
7 * Paolo Bonzini <pbonzini@redhat.com>
8 *

--- 1429 unchanged lines hidden (view full) ---

1438}
1439
1440static int coroutine_fn bdrv_mirror_top_preadv(BlockDriverState *bs,
1441 int64_t offset, int64_t bytes, QEMUIOVector *qiov, BdrvRequestFlags flags)
1442{
1443 return bdrv_co_preadv(bs->backing, offset, bytes, qiov, flags);
1444}
1445
1/*
2 * Image mirroring
3 *
4 * Copyright Red Hat, Inc. 2012
5 *
6 * Authors:
7 * Paolo Bonzini <pbonzini@redhat.com>
8 *

--- 1429 unchanged lines hidden (view full) ---

1438}
1439
1440static int coroutine_fn bdrv_mirror_top_preadv(BlockDriverState *bs,
1441 int64_t offset, int64_t bytes, QEMUIOVector *qiov, BdrvRequestFlags flags)
1442{
1443 return bdrv_co_preadv(bs->backing, offset, bytes, qiov, flags);
1444}
1445
1446static int coroutine_fn bdrv_mirror_top_do_write(BlockDriverState *bs,
1447 MirrorMethod method, uint64_t offset, uint64_t bytes, QEMUIOVector *qiov,
1448 int flags)
1446static int coroutine_fn GRAPH_RDLOCK
1447bdrv_mirror_top_do_write(BlockDriverState *bs, MirrorMethod method,
1448 uint64_t offset, uint64_t bytes, QEMUIOVector *qiov,
1449 int flags)
1449{
1450 MirrorOp *op = NULL;
1451 MirrorBDSOpaque *s = bs->opaque;
1452 int ret = 0;
1453 bool copy_to_target = false;
1454
1455 if (s->job) {
1456 copy_to_target = s->job->ret >= 0 &&

--- 41 unchanged lines hidden (view full) ---

1498 int64_t offset, int64_t bytes, QEMUIOVector *qiov, BdrvRequestFlags flags)
1499{
1500 MirrorBDSOpaque *s = bs->opaque;
1501 QEMUIOVector bounce_qiov;
1502 void *bounce_buf;
1503 int ret = 0;
1504 bool copy_to_target = false;
1505
1450{
1451 MirrorOp *op = NULL;
1452 MirrorBDSOpaque *s = bs->opaque;
1453 int ret = 0;
1454 bool copy_to_target = false;
1455
1456 if (s->job) {
1457 copy_to_target = s->job->ret >= 0 &&

--- 41 unchanged lines hidden (view full) ---

1499 int64_t offset, int64_t bytes, QEMUIOVector *qiov, BdrvRequestFlags flags)
1500{
1501 MirrorBDSOpaque *s = bs->opaque;
1502 QEMUIOVector bounce_qiov;
1503 void *bounce_buf;
1504 int ret = 0;
1505 bool copy_to_target = false;
1506
1507 assume_graph_lock(); /* FIXME */
1508
1506 if (s->job) {
1507 copy_to_target = s->job->ret >= 0 &&
1508 !job_is_cancelled(&s->job->common.job) &&
1509 s->job->copy_mode == MIRROR_COPY_MODE_WRITE_BLOCKING;
1510 }
1511
1512 if (copy_to_target) {
1513 /* The guest might concurrently modify the data to write; but

--- 28 unchanged lines hidden (view full) ---

1542 return 0;
1543 }
1544 return bdrv_co_flush(bs->backing->bs);
1545}
1546
1547static int coroutine_fn bdrv_mirror_top_pwrite_zeroes(BlockDriverState *bs,
1548 int64_t offset, int64_t bytes, BdrvRequestFlags flags)
1549{
1509 if (s->job) {
1510 copy_to_target = s->job->ret >= 0 &&
1511 !job_is_cancelled(&s->job->common.job) &&
1512 s->job->copy_mode == MIRROR_COPY_MODE_WRITE_BLOCKING;
1513 }
1514
1515 if (copy_to_target) {
1516 /* The guest might concurrently modify the data to write; but

--- 28 unchanged lines hidden (view full) ---

1545 return 0;
1546 }
1547 return bdrv_co_flush(bs->backing->bs);
1548}
1549
1550static int coroutine_fn bdrv_mirror_top_pwrite_zeroes(BlockDriverState *bs,
1551 int64_t offset, int64_t bytes, BdrvRequestFlags flags)
1552{
1553 assume_graph_lock(); /* FIXME */
1550 return bdrv_mirror_top_do_write(bs, MIRROR_METHOD_ZERO, offset, bytes, NULL,
1551 flags);
1552}
1553
1554 return bdrv_mirror_top_do_write(bs, MIRROR_METHOD_ZERO, offset, bytes, NULL,
1555 flags);
1556}
1557
1554static int coroutine_fn bdrv_mirror_top_pdiscard(BlockDriverState *bs,
1555 int64_t offset, int64_t bytes)
1558static int coroutine_fn GRAPH_RDLOCK
1559bdrv_mirror_top_pdiscard(BlockDriverState *bs, int64_t offset, int64_t bytes)
1556{
1557 return bdrv_mirror_top_do_write(bs, MIRROR_METHOD_DISCARD, offset, bytes,
1558 NULL, 0);
1559}
1560
1561static void bdrv_mirror_top_refresh_filename(BlockDriverState *bs)
1562{
1563 if (bs->backing == NULL) {

--- 407 unchanged lines hidden ---
1560{
1561 return bdrv_mirror_top_do_write(bs, MIRROR_METHOD_DISCARD, offset, bytes,
1562 NULL, 0);
1563}
1564
1565static void bdrv_mirror_top_refresh_filename(BlockDriverState *bs)
1566{
1567 if (bs->backing == NULL) {

--- 407 unchanged lines hidden ---