[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-block] [PATCH 07/16] block: Convert bs->backing_hd to BdrvChil
From: |
Max Reitz |
Subject: |
Re: [Qemu-block] [PATCH 07/16] block: Convert bs->backing_hd to BdrvChild |
Date: |
Tue, 22 Sep 2015 21:21:20 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.2.0 |
On 17.09.2015 15:48, Kevin Wolf wrote:
> This is the final step in converting all of the BlockDriverState
> pointers that block drivers use to BdrvChild.
>
> After this patch, bs->children contains the full list of child nodes
> that are referenced by a given BDS, and these children are only
> referenced through BdrvChild, so that updating the pointer in there is
> enough for changing edges in the graph.
>
> Signed-off-by: Kevin Wolf <address@hidden>
> ---
> block.c | 116
> +++++++++++++++++++++++++---------------------
> block/io.c | 24 +++++-----
> block/mirror.c | 7 +--
> block/qapi.c | 8 ++--
> block/qcow.c | 4 +-
> block/qcow2-cluster.c | 4 +-
> block/qcow2.c | 6 +--
> block/qed.c | 12 ++---
> block/stream.c | 10 ++--
> block/vmdk.c | 21 +++++----
> block/vvfat.c | 6 +--
> blockdev.c | 6 +--
> include/block/block_int.h | 12 +++--
> qemu-img.c | 8 ++--
> 14 files changed, 130 insertions(+), 114 deletions(-)
>
[...]
> diff --git a/block/io.c b/block/io.c
> index 8a27efa..d7e742a 100644
> --- a/block/io.c
> +++ b/block/io.c
[...]
> @@ -1604,7 +1604,7 @@ int64_t bdrv_get_block_status(BlockDriverState *bs,
> int64_t sector_num,
> int nb_sectors, int *pnum)
> {
> - return bdrv_get_block_status_above(bs, bs->backing_hd,
> + return bdrv_get_block_status_above(bs, backing_bs(bs),
> sector_num, nb_sectors, pnum);
> }
>
> @@ -1662,7 +1662,7 @@ int bdrv_is_allocated_above(BlockDriverState *top,
> n = pnum_inter;
> }
>
> - intermediate = intermediate->backing_hd;
> + intermediate = intermediate->backing ? intermediate->backing->bs :
> NULL;
backing_bs(intermediate)?
> }
>
> *pnum = n;
> diff --git a/block/mirror.c b/block/mirror.c
> index a258926..259e11a 100644
> --- a/block/mirror.c
> +++ b/block/mirror.c
> @@ -371,7 +371,8 @@ static void mirror_exit(BlockJob *job, void *opaque)
> if (s->common.driver->job_type == BLOCK_JOB_TYPE_COMMIT) {
> /* drop the bs loop chain formed by the swap: break the loop then
> * trigger the unref from the top one */
> - BlockDriverState *p = s->base->backing_hd;
> + BlockDriverState *p = s->base->backing
> + ? s->base->backing->bs : NULL;
Maybe you don't want to use backing_bs() outside of the core block
layer, but it could be used here, too.
(There are two similar expressions in block/stream.c, and maybe
elsewhere, too)
> bdrv_set_backing_hd(s->base, NULL);
> bdrv_unref(p);
> }
[...]
> diff --git a/blockdev.c b/blockdev.c
> index 32b04b4..bc158ff 100644
> --- a/blockdev.c
> +++ b/blockdev.c
> @@ -2508,10 +2508,10 @@ void qmp_drive_backup(const char *device, const char
> *target,
> /* See if we have a backing HD we can use to create our new image
> * on top of. */
> if (sync == MIRROR_SYNC_MODE_TOP) {
> - source = bs->backing_hd;
> - if (!source) {
> + if (!bs->backing) {
> sync = MIRROR_SYNC_MODE_FULL;
> }
> + source = bs->backing->bs;
That doesn't seem right. In case of !bs->backing, this won't abort but
just continue and run into bs->backing->bs, which should therefore
probably be backing_bs(bs) instead.
> }
> if (sync == MIRROR_SYNC_MODE_NONE) {
> source = bs;
> @@ -2716,7 +2716,7 @@ void qmp_drive_mirror(const char *device, const char
> *target,
> }
>
> flags = bs->open_flags | BDRV_O_RDWR;
> - source = bs->backing_hd;
> + source = bs->backing ? bs->backing->bs : NULL;
Why not source = backing_bs(bs)?
> if (!source && sync == MIRROR_SYNC_MODE_TOP) {
> sync = MIRROR_SYNC_MODE_FULL;
> }
[...]
> diff --git a/qemu-img.c b/qemu-img.c
> index 6ff4e85..c4454da 100644
> --- a/qemu-img.c
> +++ b/qemu-img.c
[...]
> @@ -2206,11 +2206,11 @@ static int get_block_status(BlockDriverState *bs,
> int64_t sector_num,
> if (ret & (BDRV_BLOCK_ZERO|BDRV_BLOCK_DATA)) {
> break;
> }
> - bs = bs->backing_hd;
> - if (bs == NULL) {
> + if (bs->backing == NULL) {
> ret = 0;
> break;
> }
> + bs = bs->backing->bs;
This changes behavior. bs needs to be set to NULL in the
if (bs->backing == NULL) block, or the break will break: Before, if
bs->backing_hd == NULL, the loop was left with bs == NULL. Now, bs won't
be NULL anymore (but its value is used after the loop and stored in e->bs).
Max
>
> depth++;
> }
>
signature.asc
Description: OpenPGP digital signature
- Re: [Qemu-block] [PATCH 04/16] quorum: Convert to BdrvChild, (continued)
- [Qemu-block] [PATCH 06/16] block: Remove bdrv_open_image(), Kevin Wolf, 2015/09/17
- [Qemu-block] [PATCH 08/16] block: Manage backing file references in bdrv_set_backing_hd(), Kevin Wolf, 2015/09/17
- [Qemu-block] [PATCH 09/16] block: Split bdrv_move_feature_fields(), Kevin Wolf, 2015/09/17
- [Qemu-block] [PATCH 07/16] block: Convert bs->backing_hd to BdrvChild, Kevin Wolf, 2015/09/17
- Re: [Qemu-block] [PATCH 07/16] block: Convert bs->backing_hd to BdrvChild,
Max Reitz <=
- [Qemu-block] [PATCH 10/16] block/io: Make bdrv_requests_pending() public, Kevin Wolf, 2015/09/17
- [Qemu-block] [PATCH 05/16] block: Convert bs->file to BdrvChild, Kevin Wolf, 2015/09/17
- [Qemu-block] [PATCH 11/16] block-backend: Add blk_set_bs(), Kevin Wolf, 2015/09/17