diff options
author | Eric Blake <eblake@redhat.com> | 2017-04-27 16:58:18 -0500 |
---|---|---|
committer | Markus Armbruster <armbru@redhat.com> | 2017-05-09 09:14:39 +0200 |
commit | ff6ed7141d87d26eafa2b8e4df969623e40fac49 (patch) | |
tree | eedb7135d64638688c41dbd54ae577ff3727bbfe /block.c | |
parent | 46f5ac205a9dc5e2c24274c7df371509a286281f (diff) |
block: Simplify bdrv_append_temp_snapshot() logic
Noticed while checking Coccinelle results. Naming a label 'out:'
when it is only used on error paths is weird. Also, we had some
dead stores to 'ret'. Meanwhile we know that snapshot_options
is NULL on success and that QDECREF(NULL) is safe. So merge the
two exit paths into one by careful control over bs_snapshot.
Signed-off-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Message-Id: <20170427215821.19397-8-eblake@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Diffstat (limited to 'block.c')
-rw-r--r-- | block.c | 17 |
1 files changed, 7 insertions, 10 deletions
@@ -2195,7 +2195,7 @@ static BlockDriverState *bdrv_append_temp_snapshot(BlockDriverState *bs, char *tmp_filename = g_malloc0(PATH_MAX + 1); int64_t total_size; QemuOpts *opts = NULL; - BlockDriverState *bs_snapshot; + BlockDriverState *bs_snapshot = NULL; Error *local_err = NULL; int ret; @@ -2235,28 +2235,25 @@ static BlockDriverState *bdrv_append_temp_snapshot(BlockDriverState *bs, bs_snapshot = bdrv_open(NULL, NULL, snapshot_options, flags, errp); snapshot_options = NULL; if (!bs_snapshot) { - ret = -EINVAL; goto out; } - /* bdrv_append() consumes a strong reference to bs_snapshot (i.e. it will - * call bdrv_unref() on it), so in order to be able to return one, we have - * to increase bs_snapshot's refcount here */ + /* bdrv_append() consumes a strong reference to bs_snapshot + * (i.e. it will call bdrv_unref() on it) even on error, so in + * order to be able to return one, we have to increase + * bs_snapshot's refcount here */ bdrv_ref(bs_snapshot); bdrv_append(bs_snapshot, bs, &local_err); if (local_err) { error_propagate(errp, local_err); - ret = -EINVAL; + bs_snapshot = NULL; goto out; } - g_free(tmp_filename); - return bs_snapshot; - out: QDECREF(snapshot_options); g_free(tmp_filename); - return NULL; + return bs_snapshot; } /* |