On 21.06.2016 11:21, Kevin Wolf wrote: > vvfat uses a temporary qcow file to cache written data in read-write > mode. In order to do things properly, this should show up in the BDS > graph and I/O should go through BdrvChild like for every other node. > > Signed-off-by: Kevin Wolf <kw...@redhat.com> > --- > block/vvfat.c | 66 > ++++++++++++++++++++++++++++++++++++++--------------------- > 1 file changed, 43 insertions(+), 23 deletions(-)
checkpatch.pl has some complaints: ERROR: "foo* bar" should be "foo *bar" #43: FILE: block/vvfat.c:348: + BdrvChild* qcow; ERROR: spaces required around that '-' (ctx:VxV) #81: FILE: block/vvfat.c:1392: + if (bdrv_is_allocated(s->qcow->bs, sector_num, nb_sectors-i, &n)) { ^ ERROR: spaces required around that '*' (ctx:VxV) #84: FILE: block/vvfat.c:1395: + if (bdrv_read(s->qcow->bs, sector_num, buf + i*0x200, n)) { ^ ERROR: code indent should never use tabs #103: FILE: block/vvfat.c:1677: +^I cluster2sector(s, cluster_num) + i,$ The fourth is actually something you introduced (more or less, at least all of the surrounding code uses spaces), so that must be fixed. The rest is preexisting, but I think some of those are worth fixing still; namely all but the first. You know how I think about the first and I know how you think about it, so I won't complain if it's surrounded by code in the same style. > diff --git a/block/vvfat.c b/block/vvfat.c > index 6d2e21c..2eb2536 100644 > --- a/block/vvfat.c > +++ b/block/vvfat.c [...] > @@ -2949,7 +2958,7 @@ write_target_commit(BlockDriverState *bs, uint64_t > offset, uint64_t bytes, > > static void write_target_close(BlockDriverState *bs) { > BDRVVVFATState* s = *((BDRVVVFATState**) bs->opaque); > - bdrv_unref(s->qcow); > + bdrv_unref_child(NULL, s->qcow); Not that it matters, but why not s->bs instead of NULL? > g_free(s->qcow_filename); > } > > @@ -2959,8 +2968,19 @@ static BlockDriver vvfat_write_target = { > .bdrv_close = write_target_close, > }; > > -static int enable_write_target(BDRVVVFATState *s, Error **errp) > +static void vvfat_qcow_options(int *child_flags, QDict *child_options, > + int parent_flags, QDict *parent_options) > { > + *child_flags = BDRV_O_RDWR | BDRV_O_NO_FLUSH; > +} > + > +const BdrvChildRole child_vvfat_qcow = { Any reason for not making this static? > + .inherit_options = vvfat_qcow_options, > +}; > + > +static int enable_write_target(BlockDriverState *bs, Error **errp) > +{ > + BDRVVVFATState *s = bs->opaque; > BlockDriver *bdrv_qcow = NULL; > BlockDriverState *backing; > QemuOpts *opts = NULL; > @@ -2999,8 +3019,8 @@ static int enable_write_target(BDRVVVFATState *s, Error > **errp) > > options = qdict_new(); > qdict_put(options, "driver", qstring_from_str("qcow")); > - s->qcow = bdrv_open(s->qcow_filename, NULL, options, > - BDRV_O_RDWR | BDRV_O_NO_FLUSH, errp); > + s->qcow = bdrv_open_child(s->qcow_filename, options, "qcow", bs, I'd have called it "write_target", but, well. Max > + &child_vvfat_qcow, false, errp); > if (!s->qcow) { > ret = -EINVAL; > goto err; >
signature.asc
Description: OpenPGP digital signature