qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Kevin Wolf <kwolf@redhat.com>
To: qemu-block@nongnu.org
Cc: kwolf@redhat.com, peter.maydell@linaro.org, qemu-devel@nongnu.org
Subject: [Qemu-devel] [PULL 36/71] block: bdrv_get_full_backing_filename_from_...'s ret. val.
Date: Mon, 25 Feb 2019 16:20:18 +0100	[thread overview]
Message-ID: <20190225152053.15976-37-kwolf@redhat.com> (raw)
In-Reply-To: <20190225152053.15976-1-kwolf@redhat.com>

From: Max Reitz <mreitz@redhat.com>

Make bdrv_get_full_backing_filename_from_filename() return an allocated
string instead of placing the result in a caller-provided buffer.

Signed-off-by: Max Reitz <mreitz@redhat.com>
Message-id: 20190201192935.18394-11-mreitz@redhat.com
Signed-off-by: Max Reitz <mreitz@redhat.com>
---
 include/block/block.h |  7 +++---
 block.c               | 53 ++++++++++++++++++++++++++++++-------------
 block/vmdk.c          | 10 ++++----
 qemu-img.c            | 12 ++++------
 4 files changed, 49 insertions(+), 33 deletions(-)

diff --git a/include/block/block.h b/include/block/block.h
index e233372a3a..5f1650304d 100644
--- a/include/block/block.h
+++ b/include/block/block.h
@@ -489,10 +489,9 @@ void bdrv_get_backing_filename(BlockDriverState *bs,
                                char *filename, int filename_size);
 void bdrv_get_full_backing_filename(BlockDriverState *bs,
                                     char *dest, size_t sz, Error **errp);
-void bdrv_get_full_backing_filename_from_filename(const char *backed,
-                                                  const char *backing,
-                                                  char *dest, size_t sz,
-                                                  Error **errp);
+char *bdrv_get_full_backing_filename_from_filename(const char *backed,
+                                                   const char *backing,
+                                                   Error **errp);
 
 int path_has_protocol(const char *path);
 int path_is_absolute(const char *path);
diff --git a/block.c b/block.c
index 91859a928d..466d7887cc 100644
--- a/block.c
+++ b/block.c
@@ -312,20 +312,29 @@ fail:
     return -EACCES;
 }
 
-void bdrv_get_full_backing_filename_from_filename(const char *backed,
-                                                  const char *backing,
-                                                  char *dest, size_t sz,
-                                                  Error **errp)
+/*
+ * If @backing is empty, this function returns NULL without setting
+ * @errp.  In all other cases, NULL will only be returned with @errp
+ * set.
+ *
+ * Therefore, a return value of NULL without @errp set means that
+ * there is no backing file; if @errp is set, there is one but its
+ * absolute filename cannot be generated.
+ */
+char *bdrv_get_full_backing_filename_from_filename(const char *backed,
+                                                   const char *backing,
+                                                   Error **errp)
 {
-    if (backing[0] == '\0' || path_has_protocol(backing) ||
-        path_is_absolute(backing))
-    {
-        pstrcpy(dest, sz, backing);
+    if (backing[0] == '\0') {
+        return NULL;
+    } else if (path_has_protocol(backing) || path_is_absolute(backing)) {
+        return g_strdup(backing);
     } else if (backed[0] == '\0' || strstart(backed, "json:", NULL)) {
         error_setg(errp, "Cannot use relative backing file names for '%s'",
                    backed);
+        return NULL;
     } else {
-        path_combine_deprecated(dest, sz, backed, backing);
+        return path_combine(backed, backing);
     }
 }
 
@@ -333,12 +342,24 @@ void bdrv_get_full_backing_filename(BlockDriverState *bs, char *dest, size_t sz,
                                     Error **errp)
 {
     char *backed;
+    char *full_name;
+    Error *local_error = NULL;
 
     bdrv_refresh_filename(bs);
 
     backed = bs->exact_filename[0] ? bs->exact_filename : bs->filename;
-    bdrv_get_full_backing_filename_from_filename(backed, bs->backing_file,
-                                                 dest, sz, errp);
+
+    full_name = bdrv_get_full_backing_filename_from_filename(backed,
+                                                             bs->backing_file,
+                                                             &local_error);
+    if (full_name) {
+        pstrcpy(dest, sz, full_name);
+        g_free(full_name);
+    } else if (local_error) {
+        error_propagate(errp, local_error);
+    } else if (sz > 0) {
+        *dest = '\0';
+    }
 }
 
 void bdrv_register(BlockDriver *bdrv)
@@ -5179,17 +5200,17 @@ void bdrv_img_create(const char *filename, const char *fmt,
     size = qemu_opt_get_size(opts, BLOCK_OPT_SIZE, img_size);
     if (backing_file && !(flags & BDRV_O_NO_BACKING)) {
         BlockDriverState *bs;
-        char *full_backing = g_new0(char, PATH_MAX);
+        char *full_backing;
         int back_flags;
         QDict *backing_options = NULL;
 
-        bdrv_get_full_backing_filename_from_filename(filename, backing_file,
-                                                     full_backing, PATH_MAX,
-                                                     &local_err);
+        full_backing =
+            bdrv_get_full_backing_filename_from_filename(filename, backing_file,
+                                                         &local_err);
         if (local_err) {
-            g_free(full_backing);
             goto out;
         }
+        assert(full_backing);
 
         /* backing files always opened read-only */
         back_flags = flags;
diff --git a/block/vmdk.c b/block/vmdk.c
index 32e4e7589a..81c506cb69 100644
--- a/block/vmdk.c
+++ b/block/vmdk.c
@@ -2078,16 +2078,16 @@ static int coroutine_fn vmdk_co_do_create(int64_t size,
 
     if (backing_file) {
         BlockBackend *backing;
-        char *full_backing = g_new0(char, PATH_MAX);
-        bdrv_get_full_backing_filename_from_filename(blk_bs(blk)->filename, backing_file,
-                                                     full_backing, PATH_MAX,
-                                                     &local_err);
+        char *full_backing =
+            bdrv_get_full_backing_filename_from_filename(blk_bs(blk)->filename,
+                                                         backing_file,
+                                                         &local_err);
         if (local_err) {
-            g_free(full_backing);
             error_propagate(errp, local_err);
             ret = -ENOENT;
             goto exit;
         }
+        assert(full_backing);
 
         backing = blk_new_open(full_backing, NULL, NULL,
                                BDRV_O_NO_BACKING, errp);
diff --git a/qemu-img.c b/qemu-img.c
index d2fc28c987..ae0025926c 100644
--- a/qemu-img.c
+++ b/qemu-img.c
@@ -3343,18 +3343,14 @@ static int img_rebase(int argc, char **argv)
             bdrv_refresh_filename(bs);
             overlay_filename = bs->exact_filename[0] ? bs->exact_filename
                                                      : bs->filename;
-            out_real_path = g_malloc(PATH_MAX);
-
-            bdrv_get_full_backing_filename_from_filename(overlay_filename,
-                                                         out_baseimg,
-                                                         out_real_path,
-                                                         PATH_MAX,
-                                                         &local_err);
+            out_real_path =
+                bdrv_get_full_backing_filename_from_filename(overlay_filename,
+                                                             out_baseimg,
+                                                             &local_err);
             if (local_err) {
                 error_reportf_err(local_err,
                                   "Could not resolve backing filename: ");
                 ret = -1;
-                g_free(out_real_path);
                 goto out;
             }
 
-- 
2.20.1

  parent reply	other threads:[~2019-02-25 15:22 UTC|newest]

Thread overview: 88+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-02-25 15:19 [Qemu-devel] [PULL 00/71] Block layer patches Kevin Wolf
2019-02-25 15:19 ` [Qemu-devel] [PULL 01/71] MAINTAINERS: Replace myself with John Snow for block jobs Kevin Wolf
2019-02-25 15:19 ` [Qemu-devel] [PULL 02/71] MAINTAINERS: Remove myself as block maintainer Kevin Wolf
2019-02-25 15:19 ` [Qemu-devel] [PULL 03/71] block/snapshot.c: eliminate use of ID input in snapshot operations Kevin Wolf
2019-02-25 15:19 ` [Qemu-devel] [PULL 04/71] block/snapshot: remove bdrv_snapshot_delete_by_id_or_name Kevin Wolf
2019-02-25 15:19 ` [Qemu-devel] [PULL 05/71] qcow2-snapshot: remove redundant find_snapshot_by_id_and_name call Kevin Wolf
2019-02-25 15:19 ` [Qemu-devel] [PULL 06/71] block: don't set the same context Kevin Wolf
2019-02-25 15:19 ` [Qemu-devel] [PULL 07/71] commit: Replace commit_top_bs on failure after deleting the block job Kevin Wolf
2019-02-25 15:19 ` [Qemu-devel] [PULL 08/71] qemu-img: fix error reporting for -object Kevin Wolf
2019-02-25 15:19 ` [Qemu-devel] [PULL 09/71] block-backend: Make blk_inc/dec_in_flight public Kevin Wolf
2019-02-25 15:19 ` [Qemu-devel] [PULL 10/71] virtio-blk: Increase in_flight for request restart BH Kevin Wolf
2019-02-25 15:19 ` [Qemu-devel] [PULL 11/71] nbd: Restrict connection_co reentrance Kevin Wolf
2019-02-25 15:19 ` [Qemu-devel] [PULL 12/71] io: Make qio_channel_yield() interruptible Kevin Wolf
2019-02-25 15:19 ` [Qemu-devel] [PULL 13/71] io: Remove redundant read/write_coroutine assignments Kevin Wolf
2019-02-25 15:19 ` [Qemu-devel] [PULL 14/71] nbd: Move nbd_read_eof() to nbd/client.c Kevin Wolf
2019-02-25 15:19 ` [Qemu-devel] [PULL 15/71] nbd: Use low-level QIOChannel API in nbd_read_eof() Kevin Wolf
2019-02-25 15:19 ` [Qemu-devel] [PULL 16/71] nbd: Increase bs->in_flight during AioContext switch Kevin Wolf
2019-04-11 13:40   ` Vladimir Sementsov-Ogievskiy
2019-04-11 13:40     ` Vladimir Sementsov-Ogievskiy
2019-04-11 14:15     ` Kevin Wolf
2019-04-11 14:15       ` Kevin Wolf
2019-04-11 14:48       ` Vladimir Sementsov-Ogievskiy
2019-04-11 14:48         ` Vladimir Sementsov-Ogievskiy
2019-04-11 16:48         ` Kevin Wolf
2019-04-11 16:48           ` Kevin Wolf
2019-04-11 17:13           ` Vladimir Sementsov-Ogievskiy
2019-04-11 17:13             ` Vladimir Sementsov-Ogievskiy
2019-04-11 17:20             ` Vladimir Sementsov-Ogievskiy
2019-04-11 17:20               ` Vladimir Sementsov-Ogievskiy
2019-04-12 11:11               ` Kevin Wolf
2019-04-12 11:11                 ` Kevin Wolf
2019-02-25 15:19 ` [Qemu-devel] [PULL 17/71] block: Don't poll in bdrv_set_aio_context() Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 18/71] block: Fix AioContext switch for drained node Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 19/71] test-bdrv-drain: AioContext switch in drained section Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 20/71] block: Use normal drain for bdrv_set_aio_context() Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 21/71] aio-posix: Assert that aio_poll() is always called in home thread Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 22/71] block: improve should_update_child Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 23/71] block: fix bdrv_check_perm for non-tree subgraph Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 24/71] tests: add test-bdrv-graph-mod Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 25/71] qcow2: Assert that L2 table offsets fit in the L1 table Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 26/71] block/nvme: Remove QEMU_PACKED from naturally aligned NVMeRegs struct Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 27/71] block: Use bdrv_refresh_filename() to pull Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 28/71] block: Use children list in bdrv_refresh_filename Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 29/71] block: Skip implicit nodes for filename info Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 30/71] block: Add BDS.auto_backing_file Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 31/71] block: Respect backing bs in bdrv_refresh_filename Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 32/71] iotests.py: Add filter_imgfmt() Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 33/71] iotests.py: Add node_info() Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 34/71] iotests: Add test for backing file overrides Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 35/71] block: Make path_combine() return the path Kevin Wolf
2019-02-25 15:20 ` Kevin Wolf [this message]
2019-02-25 15:20 ` [Qemu-devel] [PULL 37/71] block: bdrv_get_full_backing_filename's ret. val Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 38/71] block: Add bdrv_make_absolute_filename() Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 39/71] block: Fix bdrv_find_backing_image() Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 40/71] block: Add bdrv_dirname() Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 41/71] blkverify: Make bdrv_dirname() return NULL Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 42/71] quorum: " Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 43/71] block/nbd: " Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 44/71] block/nfs: Implement bdrv_dirname() Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 45/71] block: Use bdrv_dirname() for relative filenames Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 46/71] iotests: Add quorum case to test 110 Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 47/71] block: Add strong_runtime_opts to BlockDriver Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 48/71] block: Add BlockDriver.bdrv_gather_child_options Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 49/71] block: Generically refresh runtime options Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 50/71] block: Purify .bdrv_refresh_filename() Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 51/71] block: Do not copy exact_filename from format file Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 52/71] block/nvme: Fix bdrv_refresh_filename() Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 53/71] block/curl: Harmonize option defaults Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 54/71] block/curl: Implement bdrv_refresh_filename() Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 55/71] block/null: Generate filename even with latency-ns Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 56/71] block: BDS options may lack the "driver" option Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 57/71] iotests: Test json:{} filenames of internal BDSs Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 58/71] iotests: Re-add filename filters Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 59/71] iotests: Fix 237 for Python 2.x Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 60/71] iotests: Remove superfluous rm from 232 Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 61/71] iotests: Fix 232 for LUKS Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 62/71] iotests: Fix 207 to use QMP filters for qmp_log Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 63/71] iotests.py: Add is_str() Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 64/71] iotests.py: Filter filename in any string value Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 65/71] iotests: Filter SSH paths Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 66/71] iotests: Let 045 be run concurrently Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 67/71] iotests.py: s/_/-/g on keys in qmp_log() Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 68/71] qcow2: include LUKS payload overhead in qemu-img measure Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 69/71] iotests: add LUKS payload overhead to 178 qemu-img measure test Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 70/71] vmdk: false positive of compat6 with hwversion not set Kevin Wolf
2019-02-25 15:20 ` [Qemu-devel] [PULL 71/71] iotests: Skip 211 on insufficient memory Kevin Wolf
2019-02-27 17:43 ` [Qemu-devel] [PULL 00/71] Block layer patches no-reply
2019-02-28  9:42 ` Peter Maydell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190225152053.15976-37-kwolf@redhat.com \
    --to=kwolf@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).