On Mon, Jun 26, 2017 at 03:30:55PM +0100, Stefan Hajnoczi wrote: >> + bs->file = bdrv_open_child(NULL, options, "file", >> + bs, &child_file, false, &local_err); >> + >> + if (local_err) { >> + error_propagate(errp, local_err); >> + return -EINVAL; >> + } >> + >> + qdict_flatten(options); >> + return throttle_configure_tgm(bs, tgm, options, errp); > >Who destroys bs->file on error? It is reaped by bdrv_open_inherit() on failure, if I'm not mistaken. That's how other drivers handle this as well. Some (eg block/qcow2.c) check if bs->file is NULL instead of the error pointer they pass, so this is not not very consistent.