Skip to contentSkip to conversation

crypto threads

PATCH Superseded Vladimir Sementsov-Ogievskiy 3 participants 8 messages Dec 4, 2018

Subsystems (2)

v1 of 3 Superseded Latest is v3 →

lore
Share & tools
lore
#0 lore raw

cover crypto threads

Hi all.

These series are preliminary step before moving encryption code in qcow2 to the threads. The first attempt of doing it is on list ([PATCH 00/11] qcow2: encryption threads :
https://lists.gnu.org/archive/html/qemu-block/2018-11/msg00729.html)
But it's approach with multiplying the whole QCryptoBlock per thread was rejected. So, here is a solution to maintain multitasking inside QCryptoBlock.

Patch 01 may be considered as 3.1-rc4 material, others are ofcourse for 4.0.

Vladimir Sementsov-Ogievskiy (5):
crypto/block-luks: fix memory leak in qcrypto_block_luks_create crypto/block: refactor qcrypto_block_*crypt_helper functions crypto/block: rename qcrypto_block_*crypt_helper crypto/block: introduce qcrypto_block_*crypt_helper functions
crypto: support multiple threads accessing one QCryptoBlock

 crypto/blockpriv.h        |  42 ++++++--
 include/crypto/block.h    |  16 ++-
 block/crypto.c            |   1 +
 block/qcow.c              |   2 +-
 block/qcow2.c             |   4 +-
 crypto/block-luks.c       |  60 +++++------
 crypto/block-qcow.c       |  26 ++---
 crypto/block.c            | 210 ++++++++++++++++++++++++++++----------
 tests/test-crypto-block.c |   2 +
 9 files changed, 257 insertions(+), 106 deletions(-)
Signature · 1 line
2.18.0
#1 lore raw

PATCH 1/5 crypto/block-luks: fix memory leak in qcrypto_block_luks_create

Free block->cipher and block->ivgen on error path.

---
 crypto/block-luks.c | 3 +++
 1 file changed, 3 insertions(+)
crypto/block-luks.c +3 -0
index 5738124773..51e24d23ca 100644
@@ -1341,6 +1341,9 @@ qcrypto_block_luks_create(QCryptoBlock *block,
     qcrypto_ivgen_free(ivgen);
     qcrypto_cipher_free(cipher);
 
+    qcrypto_cipher_free(block->cipher);
+    qcrypto_ivgen_free(block->ivgen);
+
     g_free(luks);
     return -1;
 }
Signature · 1 line
2.18.0
#2 lore raw

Re: [Qemu-devel] [PATCH for-3.1? 1/5] crypto/block-luks: fix memory leak in qcrypto_block_luks_create

Quoted 13 lines · Vladimir Sementsov-Ogievskiy

Free block->cipher and block->ivgen on error path.

---
 crypto/block-luks.c | 3 +++
 1 file changed, 3 insertions(+)
crypto/block-luks.c +0 -0
index 5738124773..51e24d23ca 100644

crypto/block-luks.c qcrypto_block_luks_create(QCryptoBlock *block,

Quoted 10 lines
crypto/block-luks.c +3 -1
@@ -1341,6 +1341,9 @@ qcrypto_block_luks_create(QCryptoBlock *block,
     qcrypto_ivgen_free(ivgen);
     qcrypto_cipher_free(cipher);
 
+    qcrypto_cipher_free(block->cipher);
+    qcrypto_ivgen_free(block->ivgen);
+
     g_free(luks);
     return -1;
 }
--

Too late for 3.1, I'm afraid. You should probably add the cc tag for stable.

thanks
-- PMM

#3 lore raw

PATCH 2/5 crypto/block: refactor qcrypto_block_*crypt_helper functions

In reply to Vladimir Sementsov-Ogievskiy

qcrypto_block_encrypt_helper and qcrypto_block_decrypt_helper are almost identical, let's reduce code duplication and simplify further improvements.

---
 crypto/block.c | 81 +++++++++++++++++++-------------------------------
 1 file changed, 31 insertions(+), 50 deletions(-)
crypto/block.c +31 -50
index e59d1140fe..f4101f0841 100644
@@ -190,14 +190,21 @@ void qcrypto_block_free(QCryptoBlock *block)
 }
 
 
-int qcrypto_block_decrypt_helper(QCryptoCipher *cipher,
-                                 size_t niv,
-                                 QCryptoIVGen *ivgen,
-                                 int sectorsize,
-                                 uint64_t offset,
-                                 uint8_t *buf,
-                                 size_t len,
-                                 Error **errp)
+typedef int (*QCryptoCipherEncryptFunc)(QCryptoCipher *cipher,
+                                        const void *in,
+                                        void *out,
+                                        size_t len,
+                                        Error **errp);
+
+static int do_qcrypto_block_encrypt(QCryptoCipher *cipher,
+                                    size_t niv,
+                                    QCryptoIVGen *ivgen,
+                                    int sectorsize,
+                                    uint64_t offset,
+                                    uint8_t *buf,
+                                    size_t len,
+                                    QCryptoCipherEncryptFunc func,
+                                    Error **errp)
 {
     uint8_t *iv;
     int ret = -1;
@@ -226,8 +233,7 @@ int qcrypto_block_decrypt_helper(QCryptoCipher *cipher,
         }
 
         nbytes = len > sectorsize ? sectorsize : len;
-        if (qcrypto_cipher_decrypt(cipher, buf, buf,
-                                   nbytes, errp) < 0) {
+        if (func(cipher, buf, buf, nbytes, errp) < 0) {
             goto cleanup;
         }
 
@@ -243,7 +249,7 @@ int qcrypto_block_decrypt_helper(QCryptoCipher *cipher,
 }
 
 
-int qcrypto_block_encrypt_helper(QCryptoCipher *cipher,
+int qcrypto_block_decrypt_helper(QCryptoCipher *cipher,
                                  size_t niv,
                                  QCryptoIVGen *ivgen,
                                  int sectorsize,
@@ -252,45 +258,20 @@ int qcrypto_block_encrypt_helper(QCryptoCipher *cipher,
                                  size_t len,
                                  Error **errp)
 {
-    uint8_t *iv;
-    int ret = -1;
-    uint64_t startsector = offset / sectorsize;
-
-    assert(QEMU_IS_ALIGNED(offset, sectorsize));
-    assert(QEMU_IS_ALIGNED(len, sectorsize));
-
-    iv = niv ? g_new0(uint8_t, niv) : NULL;
-
-    while (len > 0) {
-        size_t nbytes;
-        if (niv) {
-            if (qcrypto_ivgen_calculate(ivgen,
-                                        startsector,
-                                        iv, niv,
-                                        errp) < 0) {
-                goto cleanup;
-            }
-
-            if (qcrypto_cipher_setiv(cipher,
-                                     iv, niv,
-                                     errp) < 0) {
-                goto cleanup;
-            }
-        }
-
-        nbytes = len > sectorsize ? sectorsize : len;
-        if (qcrypto_cipher_encrypt(cipher, buf, buf,
-                                   nbytes, errp) < 0) {
-            goto cleanup;
-        }
+    return do_qcrypto_block_encrypt(cipher, niv, ivgen, sectorsize, offset,
+                                    buf, len, qcrypto_cipher_decrypt, errp);
+}
 
-        startsector++;
-        buf += nbytes;
-        len -= nbytes;
-    }
 
-    ret = 0;
- cleanup:
-    g_free(iv);
-    return ret;
+int qcrypto_block_encrypt_helper(QCryptoCipher *cipher,
+                                 size_t niv,
+                                 QCryptoIVGen *ivgen,
+                                 int sectorsize,
+                                 uint64_t offset,
+                                 uint8_t *buf,
+                                 size_t len,
+                                 Error **errp)
+{
+    return do_qcrypto_block_encrypt(cipher, niv, ivgen, sectorsize, offset,
+                                    buf, len, qcrypto_cipher_encrypt, errp);
 }
Signature · 1 line
2.18.0
#4 lore raw

PATCH 3/5 crypto/block: rename qcrypto_block_*crypt_helper

In reply to Vladimir Sementsov-Ogievskiy

Rename qcrypto_block_*crypt_helper to qcrypto_cipher_*crypt_helper, as it's not about QCryptoBlock. This is needed to introduce qcrypto_block_*crypt_helper in the next commit, which will have QCryptoBlock pointer and than will be able to use additional fields of it, which in turn will be used to implement thread-safe QCryptoBlock operations.

---
 crypto/blockpriv.h  | 34 +++++++++++++-------------
 crypto/block-luks.c | 44 +++++++++++++++++-----------------
 crypto/block-qcow.c | 16 ++++++-------
 crypto/block.c      | 58 ++++++++++++++++++++++-----------------------
 4 files changed, 76 insertions(+), 76 deletions(-)
crypto/blockpriv.h +17 -17
index 41840abcec..347a7c010a 100644
@@ -78,22 +78,22 @@ struct QCryptoBlockDriver {
 };
 
 
-int qcrypto_block_decrypt_helper(QCryptoCipher *cipher,
-                                 size_t niv,
-                                 QCryptoIVGen *ivgen,
-                                 int sectorsize,
-                                 uint64_t offset,
-                                 uint8_t *buf,
-                                 size_t len,
-                                 Error **errp);
-
-int qcrypto_block_encrypt_helper(QCryptoCipher *cipher,
-                                 size_t niv,
-                                 QCryptoIVGen *ivgen,
-                                 int sectorsize,
-                                 uint64_t offset,
-                                 uint8_t *buf,
-                                 size_t len,
-                                 Error **errp);
+int qcrypto_cipher_decrypt_helper(QCryptoCipher *cipher,
+                                  size_t niv,
+                                  QCryptoIVGen *ivgen,
+                                  int sectorsize,
+                                  uint64_t offset,
+                                  uint8_t *buf,
+                                  size_t len,
+                                  Error **errp);
+
+int qcrypto_cipher_encrypt_helper(QCryptoCipher *cipher,
+                                  size_t niv,
+                                  QCryptoIVGen *ivgen,
+                                  int sectorsize,
+                                  uint64_t offset,
+                                  uint8_t *buf,
+                                  size_t len,
+                                  Error **errp);
 
 #endif /* QCRYPTO_BLOCKPRIV_H */
crypto/block-luks.c +22 -22

68 lines not on this page · raw message

crypto/block-qcow.c +8 -8
index 7606231e79..536ef4ee98 100644
@@ -152,10 +152,10 @@ qcrypto_block_qcow_decrypt(QCryptoBlock *block,
 {
     assert(QEMU_IS_ALIGNED(offset, QCRYPTO_BLOCK_QCOW_SECTOR_SIZE));
     assert(QEMU_IS_ALIGNED(len, QCRYPTO_BLOCK_QCOW_SECTOR_SIZE));
-    return qcrypto_block_decrypt_helper(block->cipher,
-                                        block->niv, block->ivgen,
-                                        QCRYPTO_BLOCK_QCOW_SECTOR_SIZE,
-                                        offset, buf, len, errp);
+    return qcrypto_cipher_decrypt_helper(block->cipher,
+                                         block->niv, block->ivgen,
+                                         QCRYPTO_BLOCK_QCOW_SECTOR_SIZE,
+                                         offset, buf, len, errp);
 }
 
 
@@ -168,10 +168,10 @@ qcrypto_block_qcow_encrypt(QCryptoBlock *block,
 {
     assert(QEMU_IS_ALIGNED(offset, QCRYPTO_BLOCK_QCOW_SECTOR_SIZE));
     assert(QEMU_IS_ALIGNED(len, QCRYPTO_BLOCK_QCOW_SECTOR_SIZE));
-    return qcrypto_block_encrypt_helper(block->cipher,
-                                        block->niv, block->ivgen,
-                                        QCRYPTO_BLOCK_QCOW_SECTOR_SIZE,
-                                        offset, buf, len, errp);
+    return qcrypto_cipher_encrypt_helper(block->cipher,
+                                         block->niv, block->ivgen,
+                                         QCRYPTO_BLOCK_QCOW_SECTOR_SIZE,
+                                         offset, buf, len, errp);
 }
 
 
crypto/block.c +29 -29

73 lines not on this page · raw message

Signature · 1 line
2.18.0
#5 lore raw

PATCH 4/5 crypto/block: introduce qcrypto_block_*crypt_helper functions

In reply to Vladimir Sementsov-Ogievskiy

Introduce QCryptoBlock-based functions and use them where possible. This is needed to implement thread-safe encrypt/decrypt operations.

---
 crypto/blockpriv.h  | 14 ++++++++++++++
 crypto/block-luks.c | 14 ++++++--------
 crypto/block-qcow.c | 14 ++++++--------
 crypto/block.c      | 26 ++++++++++++++++++++++++++
 4 files changed, 52 insertions(+), 16 deletions(-)
crypto/blockpriv.h +14 -0
index 347a7c010a..e9fe3e5687 100644
@@ -96,4 +96,18 @@ int qcrypto_cipher_encrypt_helper(QCryptoCipher *cipher,
                                   size_t len,
                                   Error **errp);
 
+int qcrypto_block_decrypt_helper(QCryptoBlock *block,
+                                 int sectorsize,
+                                 uint64_t offset,
+                                 uint8_t *buf,
+                                 size_t len,
+                                 Error **errp);
+
+int qcrypto_block_encrypt_helper(QCryptoBlock *block,
+                                 int sectorsize,
+                                 uint64_t offset,
+                                 uint8_t *buf,
+                                 size_t len,
+                                 Error **errp);
+
 #endif /* QCRYPTO_BLOCKPRIV_H */
crypto/block-luks.c +6 -8
index 72dd51051d..bbffd80fff 100644
@@ -1409,10 +1409,9 @@ qcrypto_block_luks_decrypt(QCryptoBlock *block,
 {
     assert(QEMU_IS_ALIGNED(offset, QCRYPTO_BLOCK_LUKS_SECTOR_SIZE));
     assert(QEMU_IS_ALIGNED(len, QCRYPTO_BLOCK_LUKS_SECTOR_SIZE));
-    return qcrypto_cipher_decrypt_helper(block->cipher,
-                                         block->niv, block->ivgen,
-                                         QCRYPTO_BLOCK_LUKS_SECTOR_SIZE,
-                                         offset, buf, len, errp);
+    return qcrypto_block_decrypt_helper(block,
+                                        QCRYPTO_BLOCK_LUKS_SECTOR_SIZE,
+                                        offset, buf, len, errp);
 }
 
 
@@ -1425,10 +1424,9 @@ qcrypto_block_luks_encrypt(QCryptoBlock *block,
 {
     assert(QEMU_IS_ALIGNED(offset, QCRYPTO_BLOCK_LUKS_SECTOR_SIZE));
     assert(QEMU_IS_ALIGNED(len, QCRYPTO_BLOCK_LUKS_SECTOR_SIZE));
-    return qcrypto_cipher_encrypt_helper(block->cipher,
-                                         block->niv, block->ivgen,
-                                         QCRYPTO_BLOCK_LUKS_SECTOR_SIZE,
-                                         offset, buf, len, errp);
+    return qcrypto_block_encrypt_helper(block,
+                                        QCRYPTO_BLOCK_LUKS_SECTOR_SIZE,
+                                        offset, buf, len, errp);
 }
 
 
crypto/block-qcow.c +6 -8
index 536ef4ee98..36bf5f09b7 100644
@@ -152,10 +152,9 @@ qcrypto_block_qcow_decrypt(QCryptoBlock *block,
 {
     assert(QEMU_IS_ALIGNED(offset, QCRYPTO_BLOCK_QCOW_SECTOR_SIZE));
     assert(QEMU_IS_ALIGNED(len, QCRYPTO_BLOCK_QCOW_SECTOR_SIZE));
-    return qcrypto_cipher_decrypt_helper(block->cipher,
-                                         block->niv, block->ivgen,
-                                         QCRYPTO_BLOCK_QCOW_SECTOR_SIZE,
-                                         offset, buf, len, errp);
+    return qcrypto_block_decrypt_helper(block,
+                                        QCRYPTO_BLOCK_QCOW_SECTOR_SIZE,
+                                        offset, buf, len, errp);
 }
 
 
@@ -168,10 +167,9 @@ qcrypto_block_qcow_encrypt(QCryptoBlock *block,
 {
     assert(QEMU_IS_ALIGNED(offset, QCRYPTO_BLOCK_QCOW_SECTOR_SIZE));
     assert(QEMU_IS_ALIGNED(len, QCRYPTO_BLOCK_QCOW_SECTOR_SIZE));
-    return qcrypto_cipher_encrypt_helper(block->cipher,
-                                         block->niv, block->ivgen,
-                                         QCRYPTO_BLOCK_QCOW_SECTOR_SIZE,
-                                         offset, buf, len, errp);
+    return qcrypto_block_encrypt_helper(block,
+                                        QCRYPTO_BLOCK_QCOW_SECTOR_SIZE,
+                                        offset, buf, len, errp);
 }
 
 
crypto/block.c +26 -0
index 540b27e581..3edd9ec251 100644
@@ -275,3 +275,29 @@ int qcrypto_cipher_encrypt_helper(QCryptoCipher *cipher,
     return do_qcrypto_cipher_encrypt(cipher, niv, ivgen, sectorsize, offset,
                                      buf, len, qcrypto_cipher_encrypt, errp);
 }
+
+
+int qcrypto_block_decrypt_helper(QCryptoBlock *block,
+                                 int sectorsize,
+                                 uint64_t offset,
+                                 uint8_t *buf,
+                                 size_t len,
+                                 Error **errp)
+{
+    return do_qcrypto_cipher_encrypt(block->cipher, block->niv, block->ivgen,
+                                     sectorsize, offset, buf, len,
+                                     qcrypto_cipher_decrypt, errp);
+}
+
+
+int qcrypto_block_encrypt_helper(QCryptoBlock *block,
+                                 int sectorsize,
+                                 uint64_t offset,
+                                 uint8_t *buf,
+                                 size_t len,
+                                 Error **errp)
+{
+    return do_qcrypto_cipher_encrypt(block->cipher, block->niv, block->ivgen,
+                                     sectorsize, offset, buf, len,
+                                     qcrypto_cipher_encrypt, errp);
+}
Signature · 1 line
2.18.0
#6 lore raw

PATCH 5/5 crypto: support multiple threads accessing one QCryptoBlock

In reply to Vladimir Sementsov-Ogievskiy

The two thing that should be handled are cipher and ivgen. For ivgen the solution is just mutex, as iv calculations should not be long in comparison with encryption/decryption. And for cipher let's just keep per-thread ciphers.

---
 crypto/blockpriv.h        |  16 ++++-
 include/crypto/block.h    |  16 ++++-
 block/crypto.c            |   1 +
 block/qcow.c              |   2 +-
 block/qcow2.c             |   4 +-
 crypto/block-luks.c       |  25 +++----
 crypto/block-qcow.c       |  20 +++---
 crypto/block.c            | 135 ++++++++++++++++++++++++++++++++------
 tests/test-crypto-block.c |   2 +
 9 files changed, 176 insertions(+), 45 deletions(-)
crypto/blockpriv.h +15 -1
index e9fe3e5687..86dae49210 100644
@@ -22,6 +22,7 @@
 #define QCRYPTO_BLOCKPRIV_H
 
 #include "crypto/block.h"
+#include "qemu/thread.h"
 
 typedef struct QCryptoBlockDriver QCryptoBlockDriver;
 
@@ -31,8 +32,12 @@ struct QCryptoBlock {
     const QCryptoBlockDriver *driver;
     void *opaque;
 
-    QCryptoCipher *cipher;
+    QCryptoCipher **ciphers;
+    int n_ciphers;
+    int n_free_ciphers;
     QCryptoIVGen *ivgen;
+    QemuMutex mutex;
+
     QCryptoHashAlgorithm kdfhash;
     size_t niv;
     uint64_t payload_offset; /* In bytes */
@@ -46,6 +51,7 @@ struct QCryptoBlockDriver {
                 QCryptoBlockReadFunc readfunc,
                 void *opaque,
                 unsigned int flags,
+                int n_threads,
                 Error **errp);
 
     int (*create)(QCryptoBlock *block,
@@ -110,4 +116,12 @@ int qcrypto_block_encrypt_helper(QCryptoBlock *block,
                                  size_t len,
                                  Error **errp);
 
+int qcrypto_block_init_cipher(QCryptoBlock *block,
+                              QCryptoCipherAlgorithm alg,
+                              QCryptoCipherMode mode,
+                              const uint8_t *key, size_t nkey,
+                              int n_threads, Error **errp);
+
+void qcrypto_block_free_cipher(QCryptoBlock *block);
+
 #endif /* QCRYPTO_BLOCKPRIV_H */
include/crypto/block.h +15 -1
index cd18f46d56..d54044323a 100644
@@ -75,6 +75,8 @@ typedef enum {
  * @readfunc: callback for reading data from the volume
  * @opaque: data to pass to @readfunc
  * @flags: bitmask of QCryptoBlockOpenFlags values
+ * @n_threads: prepare block to multi tasking with up to
+ *             @n_threads threads
  * @errp: pointer to a NULL-initialized error object
  *
  * Create a new block encryption object for an existing
@@ -107,6 +109,7 @@ QCryptoBlock *qcrypto_block_open(QCryptoBlockOpenOptions *options,
                                  QCryptoBlockReadFunc readfunc,
                                  void *opaque,
                                  unsigned int flags,
+                                 int n_threads,
                                  Error **errp);
 
 /**
@@ -202,12 +205,23 @@ int qcrypto_block_encrypt(QCryptoBlock *block,
  * qcrypto_block_get_cipher:
  * @block: the block encryption object
  *
- * Get the cipher to use for payload encryption
+ * Get the cipher to use for payload encryption. Must be paired with
+ * qcrypto_block_put_cipher.
  *
  * Returns: the cipher object
  */
 QCryptoCipher *qcrypto_block_get_cipher(QCryptoBlock *block);
 
+/**
+ * qcrypto_block_put_cipher:
+ * @block: the block encryption object
+ *
+ * Put cipher back to the block. Must follow qcrypto_block_get_cipher.
+ *
+ * Returns: the cipher object
+ */
+void qcrypto_block_put_cipher(QCryptoBlock *block, QCryptoCipher *cipher);
+
 /**
  * qcrypto_block_get_ivgen:
  * @block: the block encryption object
block/crypto.c +1 -0
index 33ee01bebd..f0a5f6b987 100644
@@ -229,6 +229,7 @@ static int block_crypto_open_generic(QCryptoBlockFormat format,
                                        block_crypto_read_func,
                                        bs,
                                        cflags,
+                                       1,
                                        errp);
 
     if (!crypto->block) {
block/qcow.c +1 -1
index 4518cb4c35..0a235bf393 100644
@@ -213,7 +213,7 @@ static int qcow_open(BlockDriverState *bs, QDict *options, int flags,
                 cflags |= QCRYPTO_BLOCK_OPEN_NO_IO;
             }
             s->crypto = qcrypto_block_open(crypto_opts, "encrypt.",
-                                           NULL, NULL, cflags, errp);
+                                           NULL, NULL, cflags, 1, errp);
             if (!s->crypto) {
                 ret = -EINVAL;
                 goto fail;
block/qcow2.c +2 -2
index 991d6ac91b..bc8868c36a 100644
@@ -294,7 +294,7 @@ static int qcow2_read_extensions(BlockDriverState *bs, uint64_t start_offset,
             }
             s->crypto = qcrypto_block_open(s->crypto_opts, "encrypt.",
                                            qcow2_crypto_hdr_read_func,
-                                           bs, cflags, errp);
+                                           bs, cflags, 1, errp);
             if (!s->crypto) {
                 return -EINVAL;
             }
@@ -1445,7 +1445,7 @@ static int coroutine_fn qcow2_do_open(BlockDriverState *bs, QDict *options,
                 cflags |= QCRYPTO_BLOCK_OPEN_NO_IO;
             }
             s->crypto = qcrypto_block_open(s->crypto_opts, "encrypt.",
-                                           NULL, NULL, cflags, errp);
+                                           NULL, NULL, cflags, 1, errp);
             if (!s->crypto) {
                 ret = -EINVAL;
                 goto fail;
crypto/block-luks.c +13 -12
index bbffd80fff..41fb0aa2e7 100644
@@ -636,6 +636,7 @@ qcrypto_block_luks_open(QCryptoBlock *block,
                         QCryptoBlockReadFunc readfunc,
                         void *opaque,
                         unsigned int flags,
+                        int n_threads,
                         Error **errp)
 {
     QCryptoBlockLUKS *luks;
@@ -836,11 +837,10 @@ qcrypto_block_luks_open(QCryptoBlock *block,
             goto fail;
         }
 
-        block->cipher = qcrypto_cipher_new(cipheralg,
-                                           ciphermode,
-                                           masterkey, masterkeylen,
-                                           errp);
-        if (!block->cipher) {
+        ret = qcrypto_block_init_cipher(block, cipheralg, ciphermode,
+                                        masterkey, masterkeylen, n_threads,
+                                        errp);
+        if (ret < 0) {
             ret = -ENOTSUP;
             goto fail;
         }
@@ -863,7 +863,7 @@ qcrypto_block_luks_open(QCryptoBlock *block,
 
  fail:
     g_free(masterkey);
-    qcrypto_cipher_free(block->cipher);
+    qcrypto_block_free_cipher(block);
     qcrypto_ivgen_free(block->ivgen);
     g_free(luks);
     g_free(password);
@@ -888,6 +888,7 @@ qcrypto_block_luks_create(QCryptoBlock *block,
                           void *opaque,
                           Error **errp)
 {
+    int ret;
     QCryptoBlockLUKS *luks;
     QCryptoBlockCreateOptionsLUKS luks_opts;
     Error *local_err = NULL;
@@ -1030,11 +1031,11 @@ qcrypto_block_luks_create(QCryptoBlock *block,
 
 
     /* Setup the block device payload encryption objects */
-    block->cipher = qcrypto_cipher_new(luks_opts.cipher_alg,
-                                       luks_opts.cipher_mode,
-                                       masterkey, luks->header.key_bytes,
-                                       errp);
-    if (!block->cipher) {
+    ret = qcrypto_block_init_cipher(block, luks_opts.cipher_alg,
+                                    luks_opts.cipher_mode,
+                                    masterkey, luks->header.key_bytes,
+                                    1, errp);
+    if (ret < 0) {
         goto error;
     }
 
@@ -1341,7 +1342,7 @@ qcrypto_block_luks_create(QCryptoBlock *block,
     qcrypto_ivgen_free(ivgen);
     qcrypto_cipher_free(cipher);
 
-    qcrypto_cipher_free(block->cipher);
+    qcrypto_block_free_cipher(block);
     qcrypto_ivgen_free(block->ivgen);
 
     g_free(luks);
crypto/block-qcow.c +11 -9
index 36bf5f09b7..e668145561 100644
@@ -44,6 +44,7 @@ qcrypto_block_qcow_has_format(const uint8_t *buf G_GNUC_UNUSED,
 static int
 qcrypto_block_qcow_init(QCryptoBlock *block,
                         const char *keysecret,
+                        int n_threads,
                         Error **errp)
 {
     char *password;
@@ -71,11 +72,11 @@ qcrypto_block_qcow_init(QCryptoBlock *block,
         goto fail;
     }
 
-    block->cipher = qcrypto_cipher_new(QCRYPTO_CIPHER_ALG_AES_128,
-                                       QCRYPTO_CIPHER_MODE_CBC,
-                                       keybuf, G_N_ELEMENTS(keybuf),
-                                       errp);
-    if (!block->cipher) {
+    ret = qcrypto_block_init_cipher(block, QCRYPTO_CIPHER_ALG_AES_128,
+                                    QCRYPTO_CIPHER_MODE_CBC,
+                                    keybuf, G_N_ELEMENTS(keybuf),
+                                    n_threads, errp);
+    if (ret < 0) {
         ret = -ENOTSUP;
         goto fail;
     }
@@ -86,7 +87,7 @@ qcrypto_block_qcow_init(QCryptoBlock *block,
     return 0;
 
  fail:
-    qcrypto_cipher_free(block->cipher);
+    qcrypto_block_free_cipher(block);
     qcrypto_ivgen_free(block->ivgen);
     return ret;
 }
@@ -99,6 +100,7 @@ qcrypto_block_qcow_open(QCryptoBlock *block,
                         QCryptoBlockReadFunc readfunc G_GNUC_UNUSED,
                         void *opaque G_GNUC_UNUSED,
                         unsigned int flags,
+                        int n_threads,
                         Error **errp)
 {
     if (flags & QCRYPTO_BLOCK_OPEN_NO_IO) {
@@ -112,8 +114,8 @@ qcrypto_block_qcow_open(QCryptoBlock *block,
                        optprefix ? optprefix : "");
             return -1;
         }
-        return qcrypto_block_qcow_init(block,
-                                       options->u.qcow.key_secret, errp);
+        return qcrypto_block_qcow_init(block, options->u.qcow.key_secret,
+                                       n_threads, errp);
     }
 }
 
@@ -133,7 +135,7 @@ qcrypto_block_qcow_create(QCryptoBlock *block,
         return -1;
     }
     /* QCow2 has no special header, since everything is hardwired */
-    return qcrypto_block_qcow_init(block, options->u.qcow.key_secret, errp);
+    return qcrypto_block_qcow_init(block, options->u.qcow.key_secret, 1, errp);
 }
 
 
crypto/block.c +116 -19

211 lines not on this page · raw message

tests/test-crypto-block.c +2 -0
index fae4ffc453..097497b5bf 100644
@@ -269,6 +269,8 @@ static void test_block_assert_setup(const struct QCryptoBlockTestData *data,
                     qcrypto_ivgen_get_algorithm(ivgen));
     g_assert_cmpint(data->ivgen_hash, ==,
                     qcrypto_ivgen_get_hash(ivgen));
+
+    qcrypto_block_put_cipher(blk, cipher);
 }
 
 
Signature · 1 line
2.18.0
#7 lore raw
In reply to Vladimir Sementsov-Ogievskiy
Patchew URL: https://patchew.org/QEMU/[email protected]/

Patchew URL: https://patchew.org/QEMU/[email protected]/

Hi,

This series failed the docker-quick@centos7 build test. Please find the testing commands and their output below. If you have Docker installed, you can probably reproduce it locally.

=== TEST SCRIPT BEGIN ===
#!/bin/bash
time make docker-test-quick@centos7 SHOW_ENV=1 J=8 === TEST SCRIPT END ===

libpmem support no
libudev no

WARNING: Use of SDL 1.2 is deprecated and will be removed in
WARNING: future releases. Please switch to using SDL 2.0

NOTE: cross-compilers enabled: 'cc'
GEN x86_64-softmmu/config-devices.mak.tmp
---
CC tests/usb-hcd-uhci-test.o
CC tests/usb-hcd-xhci-test.o
/tmp/qemu-test/src/tests/test-crypto-block.c: In function 'test_block':
/tmp/qemu-test/src/tests/test-crypto-block.c:310:30: error: passing argument 6 of 'qcrypto_block_open' makes integer from pointer without a cast [-Werror]

                              NULL);
                              ^
In file included from /tmp/qemu-test/src/tests/test-crypto-block.c:24:0:
/tmp/qemu-test/src/include/crypto/block.h:107:15: note: expected 'int' but argument is of type 'void *'
 QCryptoBlock *qcrypto_block_open(QCryptoBlockOpenOptions *options,
               ^
/tmp/qemu-test/src/tests/test-crypto-block.c:310:30: error: too few arguments to function 'qcrypto_block_open'
                              NULL);
                              ^
In file included from /tmp/qemu-test/src/tests/test-crypto-block.c:24:0:
/tmp/qemu-test/src/include/crypto/block.h:107:15: note: declared here
 QCryptoBlock *qcrypto_block_open(QCryptoBlockOpenOptions *options,
               ^
/tmp/qemu-test/src/tests/test-crypto-block.c:318:30: error: passing argument 6 of 'qcrypto_block_open' makes integer from pointer without a cast [-Werror]
                              &error_abort);
                              ^
In file included from /tmp/qemu-test/src/tests/test-crypto-block.c:24:0:
/tmp/qemu-test/src/include/crypto/block.h:107:15: note: expected 'int' but argument is of type 'struct Error **'
 QCryptoBlock *qcrypto_block_open(QCryptoBlockOpenOptions *options,
               ^
/tmp/qemu-test/src/tests/test-crypto-block.c:318:30: error: too few arguments to function 'qcrypto_block_open'
                              &error_abort);
                              ^
In file included from /tmp/qemu-test/src/tests/test-crypto-block.c:24:0:
/tmp/qemu-test/src/include/crypto/block.h:107:15: note: declared here
 QCryptoBlock *qcrypto_block_open(QCryptoBlockOpenOptions *options,
               ^
/tmp/qemu-test/src/tests/test-crypto-block.c:332:30: error: passing argument 6 of 'qcrypto_block_open' makes integer from pointer without a cast [-Werror]
                              &error_abort);
                              ^
In file included from /tmp/qemu-test/src/tests/test-crypto-block.c:24:0:
/tmp/qemu-test/src/include/crypto/block.h:107:15: note: expected 'int' but argument is of type 'struct Error **'
 QCryptoBlock *qcrypto_block_open(QCryptoBlockOpenOptions *options,
               ^
/tmp/qemu-test/src/tests/test-crypto-block.c:332:30: error: too few arguments to function 'qcrypto_block_open'
                              &error_abort);
                              ^

In file included from /tmp/qemu-test/src/tests/test-crypto-block.c:24:0:

The full log is available at
http://patchew.org/logs/[email protected]/testing.docker-quick@centos7/?type=message.
---
Email generated automatically by Patchew [http://patchew.org/].
Please send your feedback to [email protected]