Re: [Qemu-devel] [PATCH 5/7] sheepdog: Make sd_prealloc() take a BDS

2018-02-13 Thread Eric Blake

On 02/13/2018 07:03 AM, Max Reitz wrote:

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

Signed-off-by: Max Reitz 
---
  block/sheepdog.c | 29 +
  1 file changed, 21 insertions(+), 8 deletions(-)




@@ -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) {




  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);


I'm a bit weak on ensuring the same ending flags result after the new 
bdrv_open()/blk_new() as what you used to get on blk_new_open(), so 
someone that can actually test this is appreciated.


Reviewed-by: Eric Blake 

--
Eric Blake, Principal Software Engineer
Red Hat, Inc.   +1-919-301-3266
Virtualization:  qemu.org | libvirt.org



[Qemu-devel] [PATCH 5/7] sheepdog: Make sd_prealloc() take a BDS

2018-02-13 Thread Max Reitz
We want to use this function in sd_truncate() later on, so taking a
filename is not exactly ideal.

Signed-off-by: Max Reitz 
---
 block/sheepdog.c | 29 +
 1 file 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);
-- 
2.14.3