qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Hyman Huang <yong.huang@smartx.com>
To: qemu-devel@nongnu.org
Cc: "Kevin Wolf" <kwolf@redhat.com>,
	"Hanna Reitz" <hreitz@redhat.com>,
	"Daniel P . Berrangé" <berrange@redhat.com>,
	"Eric Blake" <eblake@redhat.com>,
	"Markus Armbruster" <armbru@redhat.com>,
	yong.huang@smartx.com
Subject: [RFC 7/8] Gluks: Implement the fundamental block layer driver hooks
Date: Tue,  5 Dec 2023 00:06:24 +0800	[thread overview]
Message-ID: <ce3c00e10d2a0218319373c107f3ca186bedfae1.1701705003.git.yong.huang@smartx.com> (raw)
In-Reply-To: <cover.1701705003.git.yong.huang@smartx.com>

Signed-off-by: Hyman Huang <yong.huang@smartx.com>
---
 block/generic-luks.c | 104 ++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 102 insertions(+), 2 deletions(-)

diff --git a/block/generic-luks.c b/block/generic-luks.c
index ebc0365d40..32cbedc86f 100644
--- a/block/generic-luks.c
+++ b/block/generic-luks.c
@@ -23,8 +23,14 @@
 #include "qemu/osdep.h"
 
 #include "block/block_int.h"
+#include "block/block-io.h"
 #include "block/crypto.h"
+#include "block/qdict.h"
 #include "crypto/block.h"
+#include "qapi/error.h"
+#include "qemu/error-report.h"
+#include "qemu/module.h"
+#include "qemu/option.h"
 
 #include "generic-luks.h"
 
@@ -50,10 +56,89 @@ static QemuOptsList gluks_create_opts_luks = {
     },
 };
 
+static int gluks_read_func(QCryptoBlock *block,
+                           size_t offset,
+                           uint8_t *buf,
+                           size_t buflen,
+                           void *opaque,
+                           Error **errp)
+{
+
+    BlockDriverState *bs = opaque;
+    BDRVGLUKSState *s = bs->opaque;
+    ssize_t ret;
+
+    GLOBAL_STATE_CODE();
+    GRAPH_RDLOCK_GUARD_MAINLOOP();
+
+    ret = bdrv_pread(s->header, offset, buflen, buf, 0);
+    if (ret < 0) {
+        error_setg_errno(errp, -ret, "Could not read generic luks header");
+        return ret;
+    }
+    return 0;
+}
+
 static int gluks_open(BlockDriverState *bs, QDict *options, int flags,
                       Error **errp)
 {
-    return 0;
+    BDRVGLUKSState *s = bs->opaque;
+    QemuOpts *opts = NULL;
+    QCryptoBlockOpenOptions *open_opts = NULL;
+    QDict *cryptoopts = NULL;
+    unsigned int cflags = 0;
+    int ret;
+
+    GLOBAL_STATE_CODE();
+
+    if (!bdrv_open_child(NULL, options, "file", bs, &child_of_bds,
+                         (BDRV_CHILD_DATA | BDRV_CHILD_PRIMARY), false, errp)) {
+        return -EINVAL;
+    }
+    s->header = bdrv_open_child(NULL, options, "header", bs,
+                                &child_of_bds, BDRV_CHILD_METADATA, false,
+                                errp);
+    if (!s->header) {
+        return -EINVAL;
+    }
+
+    GRAPH_RDLOCK_GUARD_MAINLOOP();
+
+    opts = qemu_opts_create(&block_crypto_runtime_opts_luks,
+        NULL, 0, &error_abort);
+    if (!qemu_opts_absorb_qdict(opts, options, errp)) {
+        ret = -EINVAL;
+        goto cleanup;
+    }
+
+    cryptoopts = qemu_opts_to_qdict(opts, NULL);
+    qdict_put_str(cryptoopts, "format",
+        QCryptoBlockFormat_str(Q_CRYPTO_BLOCK_FORMAT_GLUKS));
+
+    open_opts = block_crypto_open_opts_init(cryptoopts, errp);
+    if (!open_opts) {
+        goto cleanup;
+    }
+
+    s->crypto.block = qcrypto_block_open(open_opts, NULL,
+                                         gluks_read_func,
+                                         bs,
+                                         cflags,
+                                         1,
+                                         errp);
+    if (!s->crypto.block) {
+        ret = -EIO;
+        goto cleanup;
+    }
+
+    s->header_size = qcrypto_block_get_payload_offset(s->crypto.block);
+    qcrypto_block_set_payload_offset(s->crypto.block, 0);
+
+    ret = 0;
+ cleanup:
+    qobject_unref(cryptoopts);
+    qapi_free_QCryptoBlockOpenOptions(open_opts);
+    return ret;
 }
 
 static int coroutine_fn GRAPH_UNLOCKED
@@ -70,13 +155,24 @@ gluks_child_perms(BlockDriverState *bs, BdrvChild *c,
                   uint64_t perm, uint64_t shared,
                   uint64_t *nperm, uint64_t *nshared)
 {
+    if (role & BDRV_CHILD_METADATA) {
+        /* assign read permission only */
+        perm |= BLK_PERM_CONSISTENT_READ;
+        /* share all permissions */
+        shared |= BLK_PERM_ALL;
 
+        *nperm = perm;
+        *nshared = shared;
+        return;
+    }
+
+    bdrv_default_perms(bs, c, role, reopen_queue, perm, shared, nperm, nshared);
 }
 
 static int64_t coroutine_fn GRAPH_RDLOCK
 gluks_co_getlength(BlockDriverState *bs)
 {
-    return 0;
+    return bdrv_co_getlength(bs->file->bs);
 }
 
 static BlockDriver bdrv_generic_luks = {
@@ -87,8 +183,12 @@ static BlockDriver bdrv_generic_luks = {
     .bdrv_child_perm        = gluks_child_perms,
     .bdrv_co_getlength      = gluks_co_getlength,
 
+    .bdrv_close             = block_crypto_close,
+    .bdrv_co_preadv         = block_crypto_co_preadv,
+    .bdrv_co_pwritev        = block_crypto_co_pwritev,
     .create_opts            = &gluks_create_opts_luks,
     .amend_opts             = &block_crypto_amend_opts_luks,
+    .is_format              = false,
 };
 
 static void block_generic_luks_init(void)
-- 
2.39.1



  parent reply	other threads:[~2023-12-04 16:10 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-12-04 16:06 [RFC 0/8] Support generic Luks encryption Hyman Huang
2023-12-04 16:06 ` [RFC 1/8] crypto: Export util functions and structures Hyman Huang
2023-12-04 16:06 ` [RFC 2/8] crypto: Introduce payload offset set function Hyman Huang
2023-12-04 16:06 ` [RFC 3/8] Gluks: Add the basic framework Hyman Huang
2023-12-04 16:06 ` [RFC 4/8] Gluks: Introduce Gluks options Hyman Huang
2023-12-04 16:06 ` [RFC 5/8] qapi: Introduce Gluks types to qapi Hyman Huang
2023-12-04 16:06 ` [RFC 6/8] crypto: Provide the Luks crypto driver to Gluks Hyman Huang
2023-12-04 16:06 ` Hyman Huang [this message]
2023-12-04 16:06 ` [RFC 8/8] block: Support Gluks format image creation using qemu-img Hyman Huang
2023-12-04 16:24 ` [RFC 0/8] Support generic Luks encryption Daniel P. Berrangé
2023-12-04 16:32   ` Yong Huang
2023-12-04 16:41   ` Yong Huang
2023-12-04 16:51     ` Daniel P. Berrangé
2023-12-04 17:32       ` Yong Huang
2023-12-04 17:43         ` Daniel P. Berrangé
2023-12-05  1:51           ` Yong Huang
2023-12-05 11:37             ` Daniel P. Berrangé
2023-12-05 11:27           ` Kevin Wolf

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=ce3c00e10d2a0218319373c107f3ca186bedfae1.1701705003.git.yong.huang@smartx.com \
    --to=yong.huang@smartx.com \
    --cc=armbru@redhat.com \
    --cc=berrange@redhat.com \
    --cc=eblake@redhat.com \
    --cc=hreitz@redhat.com \
    --cc=kwolf@redhat.com \
    --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).