R&D/Hypervisor

qemu-img rebase 분석

sunshout 2014. 5. 21. 22:05

file: qemu-img.c


ㅇ flags 


o 주요 변수들

BlockDriverState *bs, *bs_old_backing = NULL, *bs_new_backing = NULL;

BlockDriver *old_backing_drv, *new_backing_drv;

int flags;

o Open the image

/*

     * Open the images.

     *

     * Ignore the old backing file for unsafe rebase in case we want to correct

     * the reference to a renamed or moved backing file.

     */

    bs = bdrv_new_open("image", filename, fmt, flags, true, quiet);

    if (!bs) {

        return 1;

    }




o create BlockDriver (bdrv_find_format)

old_backing_drv = bdrv_find_format(bs->backing_format);

new_backing_drv = bdrv_find_format(out_basefmt);



o change backing file(bdrv_change_backing_file)

    /*

     * Change the backing file. All clusters that are different from the old

     * backing file are overwritten in the COW file now, so the visible content

     * doesn't change when we switch the backing file.

     */

    if (out_baseimg && *out_baseimg) {

        ret = bdrv_change_backing_file(bs, out_baseimg, out_basefmt);

    } else {

        ret = bdrv_change_backing_file(bs, NULL, NULL);

    }



@block.c

o bdrv_change_backing_file(BlockDriverState bs, backing_file_path, backing_fmt)

- BlockDriverState 구조체의 bs->backing_file, bs->backing_fmt 만 변경시킴

/*

 * Return values:

 * 0        - success

 * -EINVAL  - backing format specified, but no file

 * -ENOSPC  - can't update the backing file because no space is left in the

 *            image file header

 * -ENOTSUP - format driver doesn't support changing the backing file

 */

int bdrv_change_backing_file(BlockDriverState *bs,

    const char *backing_file, const char *backing_fmt)

{

    BlockDriver *drv = bs->drv;

    int ret;


    /* Backing file format doesn't make sense without a backing file */

    if (backing_fmt && !backing_file) {

        return -EINVAL;

    }


    if (drv->bdrv_change_backing_file != NULL) {

        ret = drv->bdrv_change_backing_file(bs, backing_file, backing_fmt);

    } else {

        ret = -ENOTSUP;

    }


    if (ret == 0) {

        pstrcpy(bs->backing_file, sizeof(bs->backing_file), backing_file ?: "");

        pstrcpy(bs->backing_format, sizeof(bs->backing_format), backing_fmt ?: "");

    }

    return ret;

}