All of lore.kernel.org
 help / color / mirror / Atom feed
From: Max Reitz <mreitz@redhat.com>
To: qemu-block@nongnu.org
Cc: qemu-devel@nongnu.org, Max Reitz <mreitz@redhat.com>,
	Kevin Wolf <kwolf@redhat.com>, Alberto Garcia <berto@igalia.com>,
	Eric Blake <eblake@redhat.com>
Subject: [Qemu-devel] [PATCH v12 10/31] block: bdrv_get_full_backing_filename_from_...'s ret. val.
Date: Mon, 17 Dec 2018 23:43:27 +0100	[thread overview]
Message-ID: <20181217224348.14922-11-mreitz@redhat.com> (raw)
In-Reply-To: <20181217224348.14922-1-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>
Reviewed-by: Alberto Garcia <berto@igalia.com>
---
 include/block/block.h |  7 +++---
 block.c               | 53 ++++++++++++++++++++++++++++++-------------
 block/vmdk.c          |  9 ++++----
 qemu-img.c            | 12 ++++------
 4 files changed, 48 insertions(+), 33 deletions(-)

diff --git a/include/block/block.h b/include/block/block.h
index c69b08bef9..9dd573351b 100644
--- a/include/block/block.h
+++ b/include/block/block.h
@@ -487,10 +487,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 933a43c989..0cd4412725 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)
@@ -4965,17 +4986,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 3d3273e65b..b3fc3b9e12 100644
--- a/block/vmdk.c
+++ b/block/vmdk.c
@@ -2049,16 +2049,15 @@ static int coroutine_fn vmdk_co_create_opts(const char *filename, QemuOpts *opts
     }
     if (backing_file) {
         BlockBackend *blk;
-        char *full_backing = g_new0(char, PATH_MAX);
-        bdrv_get_full_backing_filename_from_filename(filename, backing_file,
-                                                     full_backing, PATH_MAX,
-                                                     &local_err);
+        char *full_backing =
+            bdrv_get_full_backing_filename_from_filename(filename, backing_file,
+                                                         &local_err);
         if (local_err) {
-            g_free(full_backing);
             error_propagate(errp, local_err);
             ret = -ENOENT;
             goto exit;
         }
+        assert(full_backing);
 
         blk = blk_new_open(full_backing, NULL, NULL,
                            BDRV_O_NO_BACKING, errp);
diff --git a/qemu-img.c b/qemu-img.c
index da14ec0bb5..cd81621554 100644
--- a/qemu-img.c
+++ b/qemu-img.c
@@ -3336,18 +3336,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.19.2

  parent reply	other threads:[~2018-12-17 22:44 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-12-17 22:43 [Qemu-devel] [PATCH v12 00/31] block: Fix some filename generation issues Max Reitz
2018-12-17 22:43 ` [Qemu-devel] [PATCH v12 01/31] block: Use bdrv_refresh_filename() to pull Max Reitz
2018-12-22 15:10   ` Alberto Garcia
2018-12-17 22:43 ` [Qemu-devel] [PATCH v12 02/31] block: Use children list in bdrv_refresh_filename Max Reitz
2018-12-17 22:43 ` [Qemu-devel] [PATCH v12 03/31] block: Skip implicit nodes for filename info Max Reitz
2018-12-17 22:43 ` [Qemu-devel] [PATCH v12 04/31] block: Add BDS.auto_backing_file Max Reitz
2018-12-17 22:43 ` [Qemu-devel] [PATCH v12 05/31] block: Respect backing bs in bdrv_refresh_filename Max Reitz
2018-12-17 22:43 ` [Qemu-devel] [PATCH v12 06/31] iotests.py: Add filter_imgfmt() Max Reitz
2018-12-17 22:43 ` [Qemu-devel] [PATCH v12 07/31] iotests.py: Add node_info() Max Reitz
2018-12-17 22:43 ` [Qemu-devel] [PATCH v12 08/31] iotests: Add test for backing file overrides Max Reitz
2018-12-17 22:43 ` [Qemu-devel] [PATCH v12 09/31] block: Make path_combine() return the path Max Reitz
2018-12-17 22:43 ` Max Reitz [this message]
2018-12-17 22:43 ` [Qemu-devel] [PATCH v12 11/31] block: bdrv_get_full_backing_filename's ret. val Max Reitz
2018-12-17 22:43 ` [Qemu-devel] [PATCH v12 12/31] block: Add bdrv_make_absolute_filename() Max Reitz
2018-12-17 22:43 ` [Qemu-devel] [PATCH v12 13/31] block: Fix bdrv_find_backing_image() Max Reitz
2018-12-17 22:43 ` [Qemu-devel] [PATCH v12 14/31] block: Add bdrv_dirname() Max Reitz
2018-12-17 22:43 ` [Qemu-devel] [PATCH v12 15/31] blkverify: Make bdrv_dirname() return NULL Max Reitz
2018-12-17 22:43 ` [Qemu-devel] [PATCH v12 16/31] quorum: " Max Reitz
2018-12-17 22:43 ` [Qemu-devel] [PATCH v12 17/31] block/nbd: " Max Reitz
2018-12-17 22:43 ` [Qemu-devel] [PATCH v12 18/31] block/nfs: Implement bdrv_dirname() Max Reitz
2018-12-17 22:43 ` [Qemu-devel] [PATCH v12 19/31] block: Use bdrv_dirname() for relative filenames Max Reitz
2018-12-17 22:43 ` [Qemu-devel] [PATCH v12 20/31] iotests: Add quorum case to test 110 Max Reitz
2018-12-17 22:43 ` [Qemu-devel] [PATCH v12 21/31] block: Add strong_runtime_opts to BlockDriver Max Reitz
2018-12-17 22:43 ` [Qemu-devel] [PATCH v12 22/31] block: Add BlockDriver.bdrv_gather_child_options Max Reitz
2018-12-17 22:43 ` [Qemu-devel] [PATCH v12 23/31] block: Generically refresh runtime options Max Reitz
2018-12-17 22:43 ` [Qemu-devel] [PATCH v12 24/31] block: Purify .bdrv_refresh_filename() Max Reitz
2018-12-17 22:43 ` [Qemu-devel] [PATCH v12 25/31] block: Do not copy exact_filename from format file Max Reitz
2018-12-17 22:43 ` [Qemu-devel] [PATCH v12 26/31] block/nvme: Fix bdrv_refresh_filename() Max Reitz
2018-12-17 22:43 ` [Qemu-devel] [PATCH v12 27/31] block/curl: Harmonize option defaults Max Reitz
2018-12-17 22:43 ` [Qemu-devel] [PATCH v12 28/31] block/curl: Implement bdrv_refresh_filename() Max Reitz
2018-12-17 22:43 ` [Qemu-devel] [PATCH v12 29/31] block/null: Generate filename even with latency-ns Max Reitz
2018-12-17 22:43 ` [Qemu-devel] [PATCH v12 30/31] block: BDS options may lack the "driver" option Max Reitz
2018-12-17 22:43 ` [Qemu-devel] [PATCH v12 31/31] iotests: Test json:{} filenames of internal BDSs Max Reitz
2019-01-29 20:51 ` [Qemu-devel] [Qemu-block] [PATCH v12 00/31] block: Fix some filename generation issues John Snow
2019-01-30 13:00   ` Max Reitz

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=20181217224348.14922-11-mreitz@redhat.com \
    --to=mreitz@redhat.com \
    --cc=berto@igalia.com \
    --cc=eblake@redhat.com \
    --cc=kwolf@redhat.com \
    --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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.