diff options
author | Max Reitz <mreitz@redhat.com> | 2018-02-13 14:03:54 +0100 |
---|---|---|
committer | Kevin Wolf <kwolf@redhat.com> | 2018-02-13 16:18:37 +0100 |
commit | 8b9ad56e9cbfd852af53090d18bb32e94b539253 (patch) | |
tree | 3423c76655f707088ef94207df376c790d58e474 /block | |
parent | c3132aff174ea35dd78bc8828fd79c28f9bc9a65 (diff) |
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: Max Reitz <mreitz@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Diffstat (limited to 'block')
-rw-r--r-- | block/sheepdog.c | 29 |
1 files changed, 21 insertions, 8 deletions
diff --git a/block/sheepdog.c b/block/sheepdog.c index af125a2c8d..cc1d37b3da 100644 --- a/block/sheepdog.c +++ b/block/sheepdog.c @@ -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); |