Commit 8b9ad56e authored by Max Reitz's avatar Max Reitz Committed by Kevin Wolf
Browse files

sheepdog: Make sd_prealloc() take a BDS



We want to use this function in sd_truncate() later on, so taking a
filename is not exactly ideal.

Signed-off-by: default avatarMax Reitz <mreitz@redhat.com>
Reviewed-by: default avatarEric Blake <eblake@redhat.com>
Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
parent c3132aff
Loading
Loading
Loading
Loading
+21 −8
Original line number Diff line number Diff line
@@ -1826,10 +1826,10 @@ static int do_sd_create(BDRVSheepdogState *s, uint32_t *vdi_id, int snapshot,
    return 0;
}

static int sd_prealloc(const char *filename, Error **errp)
static int sd_prealloc(BlockDriverState *bs, Error **errp)
{
    BlockBackend *blk = NULL;
    BDRVSheepdogState *base = NULL;
    BDRVSheepdogState *base = bs->opaque;
    unsigned long buf_size;
    uint32_t idx, max_idx;
    uint32_t object_size;
@@ -1837,10 +1837,11 @@ static int sd_prealloc(const char *filename, Error **errp)
    void *buf = NULL;
    int ret;

    blk = blk_new_open(filename, NULL, NULL,
                       BDRV_O_RDWR | BDRV_O_RESIZE | BDRV_O_PROTOCOL, errp);
    if (blk == NULL) {
        ret = -EIO;
    blk = blk_new(BLK_PERM_CONSISTENT_READ | BLK_PERM_WRITE | BLK_PERM_RESIZE,
                  BLK_PERM_ALL);

    ret = blk_insert_bs(blk, bs, errp);
    if (ret < 0) {
        goto out_with_err_set;
    }

@@ -1852,7 +1853,6 @@ static int sd_prealloc(const char *filename, Error **errp)
        goto out;
    }

    base = blk_bs(blk)->opaque;
    object_size = (UINT32_C(1) << base->inode.block_size_shift);
    buf_size = MIN(object_size, SD_DATA_OBJ_SIZE);
    buf = g_malloc0(buf_size);
@@ -2108,7 +2108,20 @@ static int sd_create(const char *filename, QemuOpts *opts,
    }

    if (prealloc) {
        ret = sd_prealloc(filename, errp);
        BlockDriverState *bs;
        QDict *opts;

        opts = qdict_new();
        qdict_put_str(opts, "driver", "sheepdog");
        bs = bdrv_open(filename, NULL, opts, BDRV_O_PROTOCOL | BDRV_O_RDWR,
                       errp);
        if (!bs) {
            goto out;
        }

        ret = sd_prealloc(bs, errp);

        bdrv_unref(bs);
    }
out:
    g_free(backing_file);