block: make bdrv_delete() static
Manage BlockDriverState lifecycle with refcnt, so bdrv_delete() is no longer public and should be called by bdrv_unref() if refcnt is decreased to 0. This is an identical change because effectively, there's no multiple reference of BDS now: no caller of bdrv_ref() yet, only bdrv_new() sets bs->refcnt to 1, so all bdrv_unref() now actually delete the BDS. Signed-off-by: Fam Zheng <famz@redhat.com> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
9fcb025146
commit
4f6fd3491c
23
block.c
23
block.c
@ -903,7 +903,7 @@ fail:
|
||||
if (!bs->drv) {
|
||||
QDECREF(bs->options);
|
||||
}
|
||||
bdrv_delete(bs);
|
||||
bdrv_unref(bs);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -954,7 +954,7 @@ int bdrv_open_backing_file(BlockDriverState *bs, QDict *options)
|
||||
*backing_filename ? backing_filename : NULL, options,
|
||||
back_flags, back_drv);
|
||||
if (ret < 0) {
|
||||
bdrv_delete(bs->backing_hd);
|
||||
bdrv_unref(bs->backing_hd);
|
||||
bs->backing_hd = NULL;
|
||||
bs->open_flags |= BDRV_O_NO_BACKING;
|
||||
return ret;
|
||||
@ -1029,12 +1029,12 @@ int bdrv_open(BlockDriverState *bs, const char *filename, QDict *options,
|
||||
bs1 = bdrv_new("");
|
||||
ret = bdrv_open(bs1, filename, NULL, 0, drv);
|
||||
if (ret < 0) {
|
||||
bdrv_delete(bs1);
|
||||
bdrv_unref(bs1);
|
||||
goto fail;
|
||||
}
|
||||
total_size = bdrv_getlength(bs1) & BDRV_SECTOR_MASK;
|
||||
|
||||
bdrv_delete(bs1);
|
||||
bdrv_unref(bs1);
|
||||
|
||||
ret = get_tmp_filename(tmp_filename, sizeof(tmp_filename));
|
||||
if (ret < 0) {
|
||||
@ -1108,7 +1108,7 @@ int bdrv_open(BlockDriverState *bs, const char *filename, QDict *options,
|
||||
}
|
||||
|
||||
if (bs->file != file) {
|
||||
bdrv_delete(file);
|
||||
bdrv_unref(file);
|
||||
file = NULL;
|
||||
}
|
||||
|
||||
@ -1143,7 +1143,7 @@ int bdrv_open(BlockDriverState *bs, const char *filename, QDict *options,
|
||||
|
||||
unlink_and_fail:
|
||||
if (file != NULL) {
|
||||
bdrv_delete(file);
|
||||
bdrv_unref(file);
|
||||
}
|
||||
if (bs->is_temporary) {
|
||||
unlink(filename);
|
||||
@ -1404,7 +1404,7 @@ void bdrv_close(BlockDriverState *bs)
|
||||
|
||||
if (bs->drv) {
|
||||
if (bs->backing_hd) {
|
||||
bdrv_delete(bs->backing_hd);
|
||||
bdrv_unref(bs->backing_hd);
|
||||
bs->backing_hd = NULL;
|
||||
}
|
||||
bs->drv->bdrv_close(bs);
|
||||
@ -1429,7 +1429,7 @@ void bdrv_close(BlockDriverState *bs)
|
||||
bs->options = NULL;
|
||||
|
||||
if (bs->file != NULL) {
|
||||
bdrv_delete(bs->file);
|
||||
bdrv_unref(bs->file);
|
||||
bs->file = NULL;
|
||||
}
|
||||
}
|
||||
@ -1653,11 +1653,12 @@ void bdrv_append(BlockDriverState *bs_new, BlockDriverState *bs_top)
|
||||
bs_new->drv ? bs_new->drv->format_name : "");
|
||||
}
|
||||
|
||||
void bdrv_delete(BlockDriverState *bs)
|
||||
static void bdrv_delete(BlockDriverState *bs)
|
||||
{
|
||||
assert(!bs->dev);
|
||||
assert(!bs->job);
|
||||
assert(!bs->in_use);
|
||||
assert(!bs->refcnt);
|
||||
|
||||
bdrv_close(bs);
|
||||
|
||||
@ -2173,7 +2174,7 @@ int bdrv_drop_intermediate(BlockDriverState *active, BlockDriverState *top,
|
||||
QSIMPLEQ_FOREACH_SAFE(intermediate_state, &states_to_delete, entry, next) {
|
||||
/* so that bdrv_close() does not recursively close the chain */
|
||||
intermediate_state->bs->backing_hd = NULL;
|
||||
bdrv_delete(intermediate_state->bs);
|
||||
bdrv_unref(intermediate_state->bs);
|
||||
}
|
||||
ret = 0;
|
||||
|
||||
@ -4531,7 +4532,7 @@ out:
|
||||
free_option_parameters(param);
|
||||
|
||||
if (bs) {
|
||||
bdrv_delete(bs);
|
||||
bdrv_unref(bs);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -338,7 +338,7 @@ static void coroutine_fn backup_run(void *opaque)
|
||||
hbitmap_free(job->bitmap);
|
||||
|
||||
bdrv_iostatus_disable(target);
|
||||
bdrv_delete(target);
|
||||
bdrv_unref(target);
|
||||
|
||||
block_job_completed(&job->common, ret);
|
||||
}
|
||||
|
@ -155,7 +155,7 @@ static int blkverify_open(BlockDriverState *bs, QDict *options, int flags)
|
||||
s->test_file = bdrv_new("");
|
||||
ret = bdrv_open(s->test_file, filename, NULL, flags, NULL);
|
||||
if (ret < 0) {
|
||||
bdrv_delete(s->test_file);
|
||||
bdrv_unref(s->test_file);
|
||||
s->test_file = NULL;
|
||||
goto fail;
|
||||
}
|
||||
@ -169,7 +169,7 @@ static void blkverify_close(BlockDriverState *bs)
|
||||
{
|
||||
BDRVBlkverifyState *s = bs->opaque;
|
||||
|
||||
bdrv_delete(s->test_file);
|
||||
bdrv_unref(s->test_file);
|
||||
s->test_file = NULL;
|
||||
}
|
||||
|
||||
|
@ -314,7 +314,7 @@ static int cow_create(const char *filename, QEMUOptionParameter *options)
|
||||
}
|
||||
|
||||
exit:
|
||||
bdrv_delete(cow_bs);
|
||||
bdrv_unref(cow_bs);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -1286,7 +1286,7 @@ out:
|
||||
}
|
||||
g_free(bs->opaque);
|
||||
bs->opaque = NULL;
|
||||
bdrv_delete(bs);
|
||||
bdrv_unref(bs);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -480,7 +480,7 @@ immediate_exit:
|
||||
bdrv_swap(s->target, s->common.bs);
|
||||
}
|
||||
bdrv_close(s->target);
|
||||
bdrv_delete(s->target);
|
||||
bdrv_unref(s->target);
|
||||
block_job_completed(&s->common, ret);
|
||||
}
|
||||
|
||||
|
@ -751,7 +751,7 @@ static int qcow_create(const char *filename, QEMUOptionParameter *options)
|
||||
g_free(tmp);
|
||||
ret = 0;
|
||||
exit:
|
||||
bdrv_delete(qcow_bs);
|
||||
bdrv_unref(qcow_bs);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -1452,7 +1452,7 @@ static int qcow2_create2(const char *filename, int64_t total_size,
|
||||
|
||||
ret = 0;
|
||||
out:
|
||||
bdrv_delete(bs);
|
||||
bdrv_unref(bs);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -599,7 +599,7 @@ static int qed_create(const char *filename, uint32_t cluster_size,
|
||||
ret = 0; /* success */
|
||||
out:
|
||||
g_free(l1_table);
|
||||
bdrv_delete(bs);
|
||||
bdrv_unref(bs);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -1430,7 +1430,7 @@ static int sd_prealloc(const char *filename)
|
||||
}
|
||||
out:
|
||||
if (bs) {
|
||||
bdrv_delete(bs);
|
||||
bdrv_unref(bs);
|
||||
}
|
||||
g_free(buf);
|
||||
|
||||
@ -1509,13 +1509,13 @@ static int sd_create(const char *filename, QEMUOptionParameter *options)
|
||||
|
||||
if (!is_snapshot(&s->inode)) {
|
||||
error_report("cannot clone from a non snapshot vdi");
|
||||
bdrv_delete(bs);
|
||||
bdrv_unref(bs);
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
base_vid = s->inode.vdi_id;
|
||||
bdrv_delete(bs);
|
||||
bdrv_unref(bs);
|
||||
}
|
||||
|
||||
ret = do_sd_create(s, vdi, vdi_size, base_vid, &vid, 0);
|
||||
|
@ -99,7 +99,7 @@ int bdrv_snapshot_goto(BlockDriverState *bs,
|
||||
ret = bdrv_snapshot_goto(bs->file, snapshot_id);
|
||||
open_ret = drv->bdrv_open(bs, NULL, bs->open_flags);
|
||||
if (open_ret < 0) {
|
||||
bdrv_delete(bs->file);
|
||||
bdrv_unref(bs->file);
|
||||
bs->drv = NULL;
|
||||
return open_ret;
|
||||
}
|
||||
|
@ -73,7 +73,7 @@ static void close_unused_images(BlockDriverState *top, BlockDriverState *base,
|
||||
unused = intermediate;
|
||||
intermediate = intermediate->backing_hd;
|
||||
unused->backing_hd = NULL;
|
||||
bdrv_delete(unused);
|
||||
bdrv_unref(unused);
|
||||
}
|
||||
}
|
||||
|
||||
|
10
block/vmdk.c
10
block/vmdk.c
@ -216,7 +216,7 @@ static void vmdk_free_extents(BlockDriverState *bs)
|
||||
g_free(e->l2_cache);
|
||||
g_free(e->l1_backup_table);
|
||||
if (e->file != bs->file) {
|
||||
bdrv_delete(e->file);
|
||||
bdrv_unref(e->file);
|
||||
}
|
||||
}
|
||||
g_free(s->extents);
|
||||
@ -746,7 +746,7 @@ static int vmdk_parse_extents(const char *desc, BlockDriverState *bs,
|
||||
/* SPARSE extent and VMFSSPARSE extent are both "COWD" sparse file*/
|
||||
ret = vmdk_open_sparse(bs, extent_file, bs->open_flags);
|
||||
if (ret) {
|
||||
bdrv_delete(extent_file);
|
||||
bdrv_unref(extent_file);
|
||||
return ret;
|
||||
}
|
||||
} else {
|
||||
@ -1636,15 +1636,15 @@ static int vmdk_create(const char *filename, QEMUOptionParameter *options)
|
||||
BlockDriverState *bs = bdrv_new("");
|
||||
ret = bdrv_open(bs, backing_file, NULL, 0, NULL);
|
||||
if (ret != 0) {
|
||||
bdrv_delete(bs);
|
||||
bdrv_unref(bs);
|
||||
return ret;
|
||||
}
|
||||
if (strcmp(bs->drv->format_name, "vmdk")) {
|
||||
bdrv_delete(bs);
|
||||
bdrv_unref(bs);
|
||||
return -EINVAL;
|
||||
}
|
||||
parent_cid = vmdk_read_cid(bs, 0);
|
||||
bdrv_delete(bs);
|
||||
bdrv_unref(bs);
|
||||
snprintf(parent_desc_line, sizeof(parent_desc_line),
|
||||
"parentFileNameHint=\"%s\"", backing_file);
|
||||
}
|
||||
|
@ -2894,7 +2894,7 @@ static int write_target_commit(BlockDriverState *bs, int64_t sector_num,
|
||||
|
||||
static void write_target_close(BlockDriverState *bs) {
|
||||
BDRVVVFATState* s = *((BDRVVVFATState**) bs->opaque);
|
||||
bdrv_delete(s->qcow);
|
||||
bdrv_unref(s->qcow);
|
||||
g_free(s->qcow_filename);
|
||||
}
|
||||
|
||||
@ -2935,7 +2935,7 @@ static int enable_write_target(BDRVVVFATState *s)
|
||||
ret = bdrv_open(s->qcow, s->qcow_filename, NULL,
|
||||
BDRV_O_RDWR | BDRV_O_CACHE_WB | BDRV_O_NO_FLUSH, bdrv_qcow);
|
||||
if (ret < 0) {
|
||||
bdrv_delete(s->qcow);
|
||||
bdrv_unref(s->qcow);
|
||||
goto err;
|
||||
}
|
||||
|
||||
|
14
blockdev.c
14
blockdev.c
@ -212,7 +212,7 @@ static void bdrv_format_print(void *opaque, const char *name)
|
||||
static void drive_uninit(DriveInfo *dinfo)
|
||||
{
|
||||
qemu_opts_del(dinfo->opts);
|
||||
bdrv_delete(dinfo->bdrv);
|
||||
bdrv_unref(dinfo->bdrv);
|
||||
g_free(dinfo->id);
|
||||
QTAILQ_REMOVE(&drives, dinfo, next);
|
||||
g_free(dinfo->serial);
|
||||
@ -735,7 +735,7 @@ static DriveInfo *blockdev_init(QemuOpts *all_opts,
|
||||
err:
|
||||
qemu_opts_del(opts);
|
||||
QDECREF(bs_opts);
|
||||
bdrv_delete(dinfo->bdrv);
|
||||
bdrv_unref(dinfo->bdrv);
|
||||
g_free(dinfo->id);
|
||||
QTAILQ_REMOVE(&drives, dinfo, next);
|
||||
g_free(dinfo);
|
||||
@ -996,7 +996,7 @@ static void external_snapshot_abort(BlkTransactionState *common)
|
||||
ExternalSnapshotState *state =
|
||||
DO_UPCAST(ExternalSnapshotState, common, common);
|
||||
if (state->new_bs) {
|
||||
bdrv_delete(state->new_bs);
|
||||
bdrv_unref(state->new_bs);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1638,7 +1638,7 @@ void qmp_drive_backup(const char *device, const char *target,
|
||||
target_bs = bdrv_new("");
|
||||
ret = bdrv_open(target_bs, target, NULL, flags, drv);
|
||||
if (ret < 0) {
|
||||
bdrv_delete(target_bs);
|
||||
bdrv_unref(target_bs);
|
||||
error_setg_file_open(errp, -ret, target);
|
||||
return;
|
||||
}
|
||||
@ -1646,7 +1646,7 @@ void qmp_drive_backup(const char *device, const char *target,
|
||||
backup_start(bs, target_bs, speed, sync, on_source_error, on_target_error,
|
||||
block_job_cb, bs, &local_err);
|
||||
if (local_err != NULL) {
|
||||
bdrv_delete(target_bs);
|
||||
bdrv_unref(target_bs);
|
||||
error_propagate(errp, local_err);
|
||||
return;
|
||||
}
|
||||
@ -1778,7 +1778,7 @@ void qmp_drive_mirror(const char *device, const char *target,
|
||||
target_bs = bdrv_new("");
|
||||
ret = bdrv_open(target_bs, target, NULL, flags | BDRV_O_NO_BACKING, drv);
|
||||
if (ret < 0) {
|
||||
bdrv_delete(target_bs);
|
||||
bdrv_unref(target_bs);
|
||||
error_setg_file_open(errp, -ret, target);
|
||||
return;
|
||||
}
|
||||
@ -1787,7 +1787,7 @@ void qmp_drive_mirror(const char *device, const char *target,
|
||||
on_source_error, on_target_error,
|
||||
block_job_cb, bs, &local_err);
|
||||
if (local_err != NULL) {
|
||||
bdrv_delete(target_bs);
|
||||
bdrv_unref(target_bs);
|
||||
error_propagate(errp, local_err);
|
||||
return;
|
||||
}
|
||||
|
@ -813,7 +813,7 @@ static int blk_connect(struct XenDevice *xendev)
|
||||
readonly);
|
||||
if (bdrv_open(blkdev->bs,
|
||||
blkdev->filename, NULL, qflags, drv) != 0) {
|
||||
bdrv_delete(blkdev->bs);
|
||||
bdrv_unref(blkdev->bs);
|
||||
blkdev->bs = NULL;
|
||||
}
|
||||
}
|
||||
@ -926,7 +926,7 @@ static void blk_disconnect(struct XenDevice *xendev)
|
||||
/* close/delete only if we created it ourself */
|
||||
bdrv_close(blkdev->bs);
|
||||
bdrv_detach_dev(blkdev->bs, blkdev);
|
||||
bdrv_delete(blkdev->bs);
|
||||
bdrv_unref(blkdev->bs);
|
||||
}
|
||||
blkdev->bs = NULL;
|
||||
}
|
||||
|
@ -122,7 +122,6 @@ BlockDriverState *bdrv_new(const char *device_name);
|
||||
void bdrv_make_anon(BlockDriverState *bs);
|
||||
void bdrv_swap(BlockDriverState *bs_new, BlockDriverState *bs_old);
|
||||
void bdrv_append(BlockDriverState *bs_new, BlockDriverState *bs_top);
|
||||
void bdrv_delete(BlockDriverState *bs);
|
||||
int bdrv_parse_cache_flags(const char *mode, int *flags);
|
||||
int bdrv_parse_discard_flags(const char *mode, int *flags);
|
||||
int bdrv_file_open(BlockDriverState **pbs, const char *filename,
|
||||
|
26
qemu-img.c
26
qemu-img.c
@ -300,7 +300,7 @@ static BlockDriverState *bdrv_new_open(const char *filename,
|
||||
return bs;
|
||||
fail:
|
||||
if (bs) {
|
||||
bdrv_delete(bs);
|
||||
bdrv_unref(bs);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
@ -654,7 +654,7 @@ static int img_check(int argc, char **argv)
|
||||
|
||||
fail:
|
||||
qapi_free_ImageCheck(check);
|
||||
bdrv_delete(bs);
|
||||
bdrv_unref(bs);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -724,7 +724,7 @@ static int img_commit(int argc, char **argv)
|
||||
break;
|
||||
}
|
||||
|
||||
bdrv_delete(bs);
|
||||
bdrv_unref(bs);
|
||||
if (ret) {
|
||||
return 1;
|
||||
}
|
||||
@ -1106,11 +1106,11 @@ static int img_compare(int argc, char **argv)
|
||||
ret = 0;
|
||||
|
||||
out:
|
||||
bdrv_delete(bs2);
|
||||
bdrv_unref(bs2);
|
||||
qemu_vfree(buf1);
|
||||
qemu_vfree(buf2);
|
||||
out2:
|
||||
bdrv_delete(bs1);
|
||||
bdrv_unref(bs1);
|
||||
out3:
|
||||
qemu_progress_end();
|
||||
return ret;
|
||||
@ -1561,12 +1561,12 @@ out:
|
||||
free_option_parameters(param);
|
||||
qemu_vfree(buf);
|
||||
if (out_bs) {
|
||||
bdrv_delete(out_bs);
|
||||
bdrv_unref(out_bs);
|
||||
}
|
||||
if (bs) {
|
||||
for (bs_i = 0; bs_i < bs_n; bs_i++) {
|
||||
if (bs[bs_i]) {
|
||||
bdrv_delete(bs[bs_i]);
|
||||
bdrv_unref(bs[bs_i]);
|
||||
}
|
||||
}
|
||||
g_free(bs);
|
||||
@ -1704,7 +1704,7 @@ static ImageInfoList *collect_image_info_list(const char *filename,
|
||||
*last = elem;
|
||||
last = &elem->next;
|
||||
|
||||
bdrv_delete(bs);
|
||||
bdrv_unref(bs);
|
||||
|
||||
filename = fmt = NULL;
|
||||
if (chain) {
|
||||
@ -1918,7 +1918,7 @@ static int img_snapshot(int argc, char **argv)
|
||||
}
|
||||
|
||||
/* Cleanup */
|
||||
bdrv_delete(bs);
|
||||
bdrv_unref(bs);
|
||||
if (ret) {
|
||||
return 1;
|
||||
}
|
||||
@ -2193,14 +2193,14 @@ out:
|
||||
/* Cleanup */
|
||||
if (!unsafe) {
|
||||
if (bs_old_backing != NULL) {
|
||||
bdrv_delete(bs_old_backing);
|
||||
bdrv_unref(bs_old_backing);
|
||||
}
|
||||
if (bs_new_backing != NULL) {
|
||||
bdrv_delete(bs_new_backing);
|
||||
bdrv_unref(bs_new_backing);
|
||||
}
|
||||
}
|
||||
|
||||
bdrv_delete(bs);
|
||||
bdrv_unref(bs);
|
||||
if (ret) {
|
||||
return 1;
|
||||
}
|
||||
@ -2323,7 +2323,7 @@ static int img_resize(int argc, char **argv)
|
||||
}
|
||||
out:
|
||||
if (bs) {
|
||||
bdrv_delete(bs);
|
||||
bdrv_unref(bs);
|
||||
}
|
||||
if (ret) {
|
||||
return 1;
|
||||
|
@ -32,7 +32,7 @@ static char **cmdline;
|
||||
|
||||
static int close_f(BlockDriverState *bs, int argc, char **argv)
|
||||
{
|
||||
bdrv_delete(bs);
|
||||
bdrv_unref(bs);
|
||||
qemuio_bs = NULL;
|
||||
return 0;
|
||||
}
|
||||
@ -61,7 +61,7 @@ static int openfile(char *name, int flags, int growable)
|
||||
|
||||
if (bdrv_open(qemuio_bs, name, NULL, flags, NULL) < 0) {
|
||||
fprintf(stderr, "%s: can't open device %s\n", progname, name);
|
||||
bdrv_delete(qemuio_bs);
|
||||
bdrv_unref(qemuio_bs);
|
||||
qemuio_bs = NULL;
|
||||
return 1;
|
||||
}
|
||||
@ -422,7 +422,7 @@ int main(int argc, char **argv)
|
||||
bdrv_drain_all();
|
||||
|
||||
if (qemuio_bs) {
|
||||
bdrv_delete(qemuio_bs);
|
||||
bdrv_unref(qemuio_bs);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user