121 lines
4.6 KiB
Diff
121 lines
4.6 KiB
Diff
|
From 0433f2d3bd818b83908636ae240ecbfd256e0a9c Mon Sep 17 00:00:00 2001
|
||
|
From: John Snow <jsnow@redhat.com>
|
||
|
Date: Wed, 10 Oct 2018 20:30:13 +0100
|
||
|
Subject: [PATCH 2/4] block/rbd: Attempt to parse legacy filenames
|
||
|
|
||
|
RH-Author: John Snow <jsnow@redhat.com>
|
||
|
Message-id: <20181010203015.11719-3-jsnow@redhat.com>
|
||
|
Patchwork-id: 82629
|
||
|
O-Subject: [RHEL8/rhel qemu-kvm PATCH 2/4] block/rbd: Attempt to parse legacy filenames
|
||
|
Bugzilla: 1635585
|
||
|
RH-Acked-by: Markus Armbruster <armbru@redhat.com>
|
||
|
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||
|
|
||
|
From: Jeff Cody <jcody@redhat.com>
|
||
|
|
||
|
When we converted rbd to get rid of the older key/value-centric
|
||
|
encoding format, we broke compatibility with image files with backing
|
||
|
file strings encoded in the old format.
|
||
|
|
||
|
This leaves a bit of an ugly conundrum, and a hacky solution.
|
||
|
|
||
|
If the initial attempt to parse the "proper" options fails, it assumes
|
||
|
that we may have an older key/value encoded filename. Fall back to
|
||
|
attempting to parse the filename, and extract the required options from
|
||
|
it. If that fails, pass along the original error message.
|
||
|
|
||
|
We do not support mixed modern usage alongside legacy keyvalue pair
|
||
|
usage.
|
||
|
|
||
|
A deprecation warning has been added, although care should be taken
|
||
|
when actually deprecating since the impact is not limited to
|
||
|
commandline or qapi usage, but also opening existing images.
|
||
|
|
||
|
Reviewed-by: Eric Blake <eblake@redhat.com>
|
||
|
Signed-off-by: Jeff Cody <jcody@redhat.com>
|
||
|
Message-id: 15b332e5432ad069441f7275a46080f465d789a0.1536704901.git.jcody@redhat.com
|
||
|
Signed-off-by: Jeff Cody <jcody@redhat.com>
|
||
|
(cherry picked from commit 084d1d13bdb753d558b991996e7686c077bd6d80)
|
||
|
Signed-off-by: John Snow <jsnow@redhat.com>
|
||
|
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||
|
---
|
||
|
block/rbd.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++--
|
||
|
1 file changed, 52 insertions(+), 2 deletions(-)
|
||
|
|
||
|
diff --git a/block/rbd.c b/block/rbd.c
|
||
|
index 1e4d339..ebe0701 100644
|
||
|
--- a/block/rbd.c
|
||
|
+++ b/block/rbd.c
|
||
|
@@ -671,6 +671,33 @@ static int qemu_rbd_convert_options(QDict *options, BlockdevOptionsRbd **opts,
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
+static int qemu_rbd_attempt_legacy_options(QDict *options,
|
||
|
+ BlockdevOptionsRbd **opts,
|
||
|
+ char **keypairs)
|
||
|
+{
|
||
|
+ char *filename;
|
||
|
+ int r;
|
||
|
+
|
||
|
+ filename = g_strdup(qdict_get_try_str(options, "filename"));
|
||
|
+ if (!filename) {
|
||
|
+ return -EINVAL;
|
||
|
+ }
|
||
|
+ qdict_del(options, "filename");
|
||
|
+
|
||
|
+ qemu_rbd_parse_filename(filename, options, NULL);
|
||
|
+
|
||
|
+ /* keypairs freed by caller */
|
||
|
+ *keypairs = g_strdup(qdict_get_try_str(options, "=keyvalue-pairs"));
|
||
|
+ if (*keypairs) {
|
||
|
+ qdict_del(options, "=keyvalue-pairs");
|
||
|
+ }
|
||
|
+
|
||
|
+ r = qemu_rbd_convert_options(options, opts, NULL);
|
||
|
+
|
||
|
+ g_free(filename);
|
||
|
+ return r;
|
||
|
+}
|
||
|
+
|
||
|
static int qemu_rbd_open(BlockDriverState *bs, QDict *options, int flags,
|
||
|
Error **errp)
|
||
|
{
|
||
|
@@ -693,8 +720,31 @@ static int qemu_rbd_open(BlockDriverState *bs, QDict *options, int flags,
|
||
|
|
||
|
r = qemu_rbd_convert_options(options, &opts, &local_err);
|
||
|
if (local_err) {
|
||
|
- error_propagate(errp, local_err);
|
||
|
- goto out;
|
||
|
+ /* If keypairs are present, that means some options are present in
|
||
|
+ * the modern option format. Don't attempt to parse legacy option
|
||
|
+ * formats, as we won't support mixed usage. */
|
||
|
+ if (keypairs) {
|
||
|
+ error_propagate(errp, local_err);
|
||
|
+ goto out;
|
||
|
+ }
|
||
|
+
|
||
|
+ /* If the initial attempt to convert and process the options failed,
|
||
|
+ * we may be attempting to open an image file that has the rbd options
|
||
|
+ * specified in the older format consisting of all key/value pairs
|
||
|
+ * encoded in the filename. Go ahead and attempt to parse the
|
||
|
+ * filename, and see if we can pull out the required options. */
|
||
|
+ r = qemu_rbd_attempt_legacy_options(options, &opts, &keypairs);
|
||
|
+ if (r < 0) {
|
||
|
+ /* Propagate the original error, not the legacy parsing fallback
|
||
|
+ * error, as the latter was just a best-effort attempt. */
|
||
|
+ error_propagate(errp, local_err);
|
||
|
+ goto out;
|
||
|
+ }
|
||
|
+ /* Take care whenever deciding to actually deprecate; once this ability
|
||
|
+ * is removed, we will not be able to open any images with legacy-styled
|
||
|
+ * backing image strings. */
|
||
|
+ error_report("RBD options encoded in the filename as keyvalue pairs "
|
||
|
+ "is deprecated");
|
||
|
}
|
||
|
|
||
|
/* Remove the processed options from the QDict (the visitor processes
|
||
|
--
|
||
|
1.8.3.1
|
||
|
|