diff mbox series

[v4,2/7] qapi: Make parameter 'file' optional for BlockdevCreateOptionsLUKS

Message ID af7253711254128efbc37b25fb5c47b851367ce7.1706586786.git.yong.huang@smartx.com (mailing list archive)
State New, archived
Headers show
Series Support generic Luks encryption | expand

Commit Message

Yong Huang Jan. 30, 2024, 5:37 a.m. UTC
From: Hyman Huang <yong.huang@smartx.com>

To support detached LUKS header creation, make the existing 'file'
field in BlockdevCreateOptionsLUKS optional.

Signed-off-by: Hyman Huang <yong.huang@smartx.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
---
 block/crypto.c       | 21 ++++++++++++++-------
 qapi/block-core.json |  5 +++--
 2 files changed, 17 insertions(+), 9 deletions(-)

Comments

Markus Armbruster Feb. 19, 2024, 2:22 p.m. UTC | #1
yong.huang@smartx.com writes:

> From: Hyman Huang <yong.huang@smartx.com>
>
> To support detached LUKS header creation, make the existing 'file'
> field in BlockdevCreateOptionsLUKS optional.
>
> Signed-off-by: Hyman Huang <yong.huang@smartx.com>
> Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>

[...]

> diff --git a/qapi/block-core.json b/qapi/block-core.json
> index ae604c6019..69a88d613d 100644
> --- a/qapi/block-core.json
> +++ b/qapi/block-core.json
> @@ -4957,7 +4957,8 @@
>  #
>  # Driver specific image creation options for LUKS.
>  #
> -# @file: Node to create the image format on
> +# @file: Node to create the image format on, mandatory except when
> +#        'preallocation' is not requested

You mean when @preallocation is "off"?

Cases:

1. @file is mandatory

2. @file is optional and present

3. @file is optional and absent

Ignorant question: behavior in each case?

>  #
>  # @size: Size of the virtual disk in bytes
>  #
> @@ -4968,7 +4969,7 @@
>  ##
>  { 'struct': 'BlockdevCreateOptionsLUKS',
>    'base': 'QCryptoBlockCreateOptionsLUKS',
> -  'data': { 'file':             'BlockdevRef',
> +  'data': { '*file':            'BlockdevRef',
>              'size':             'size',
>              '*preallocation':   'PreallocMode' } }
Yong Huang Feb. 20, 2024, 7:31 a.m. UTC | #2
On Tue, Feb 20, 2024 at 2:31 PM Markus Armbruster <armbru@redhat.com> wrote:

> yong.huang@smartx.com writes:
>
> > From: Hyman Huang <yong.huang@smartx.com>
> >
> > To support detached LUKS header creation, make the existing 'file'
> > field in BlockdevCreateOptionsLUKS optional.
> >
> > Signed-off-by: Hyman Huang <yong.huang@smartx.com>
> > Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
>
> [...]
>
> > diff --git a/qapi/block-core.json b/qapi/block-core.json
> > index ae604c6019..69a88d613d 100644
> > --- a/qapi/block-core.json
> > +++ b/qapi/block-core.json
> > @@ -4957,7 +4957,8 @@
> >  #
> >  # Driver specific image creation options for LUKS.
> >  #
> > -# @file: Node to create the image format on
> > +# @file: Node to create the image format on, mandatory except when
> > +#        'preallocation' is not requested
>
> You mean when @preallocation is "off"?
>
> Cases:
>
> 1. @file is mandatory
>

When @preallocation is specified to PREALLOC_MODE_ON, file
is mandatory because preallocation aims to act on payload data that
@file holds.


> 2. @file is optional and present
>

When @preallocation is not specified or equals to PREALLOC_MODE_OFF,
@file if optional.
If @file present,there are two cases:
1. @header is absent,  the creation process degenerate to the origin action.
2. @header is present,  the creation process would trunk the payload data
image that @file holds and do the LUKS formatting on the image that
@header refers;


>
> 3. @file is optional and absent
>

When @preallocation is not specified or equals to PREALLOC_MODE_OFF,
@file if optional.
If @file is absent, do the LUKS formatting only.
Note that Either the parameter 'header' or 'file' must be specified.

Here's my interpretation; do let me know if any of the points are off or
need to be refactored.


>
> Ignorant question: behavior in each case?
>
> >  #
> >  # @size: Size of the virtual disk in bytes
> >  #
> > @@ -4968,7 +4969,7 @@
> >  ##
> >  { 'struct': 'BlockdevCreateOptionsLUKS',
> >    'base': 'QCryptoBlockCreateOptionsLUKS',
> > -  'data': { 'file':             'BlockdevRef',
> > +  'data': { '*file':            'BlockdevRef',
> >              'size':             'size',
> >              '*preallocation':   'PreallocMode' } }
>
>
Thanks,

Yong
Markus Armbruster Feb. 20, 2024, 8:55 a.m. UTC | #3
Yong Huang <yong.huang@smartx.com> writes:

> On Tue, Feb 20, 2024 at 2:31 PM Markus Armbruster <armbru@redhat.com> wrote:
>
>> yong.huang@smartx.com writes:
>>
>> > From: Hyman Huang <yong.huang@smartx.com>
>> >
>> > To support detached LUKS header creation, make the existing 'file'
>> > field in BlockdevCreateOptionsLUKS optional.
>> >
>> > Signed-off-by: Hyman Huang <yong.huang@smartx.com>
>> > Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
>>
>> [...]
>>
>> > diff --git a/qapi/block-core.json b/qapi/block-core.json
>> > index ae604c6019..69a88d613d 100644
>> > --- a/qapi/block-core.json
>> > +++ b/qapi/block-core.json
>> > @@ -4957,7 +4957,8 @@
>> >  #
>> >  # Driver specific image creation options for LUKS.
>> >  #
>> > -# @file: Node to create the image format on
>> > +# @file: Node to create the image format on, mandatory except when
>> > +#        'preallocation' is not requested
>>
>> You mean when @preallocation is "off"?
>>
>> Cases:
>>
>> 1. @file is mandatory
>>
>
> When @preallocation is specified to PREALLOC_MODE_ON, file
> is mandatory because preallocation aims to act on payload data that
> @file holds.
>
>
>> 2. @file is optional and present
>>
>
> When @preallocation is not specified or equals to PREALLOC_MODE_OFF,
> @file if optional.
> If @file present,there are two cases:
> 1. @header is absent,  the creation process degenerate to the origin action.
> 2. @header is present,  the creation process would trunk the payload data
> image that @file holds and do the LUKS formatting on the image that
> @header refers;
>
>
>>
>> 3. @file is optional and absent
>>
>
> When @preallocation is not specified or equals to PREALLOC_MODE_OFF,
> @file if optional.
> If @file is absent, do the LUKS formatting only.
> Note that Either the parameter 'header' or 'file' must be specified.
>
> Here's my interpretation; do let me know if any of the points are off or
> need to be refactored.
>
>
>>
>> Ignorant question: behavior in each case?

Thanks!  Would it make sense to work the above into the documentation?

[...]
Yong Huang Feb. 20, 2024, 9:13 a.m. UTC | #4
On Tue, Feb 20, 2024 at 4:56 PM Markus Armbruster <armbru@redhat.com> wrote:

> Yong Huang <yong.huang@smartx.com> writes:
>
> > On Tue, Feb 20, 2024 at 2:31 PM Markus Armbruster <armbru@redhat.com>
> wrote:
> >
> >> yong.huang@smartx.com writes:
> >>
> >> > From: Hyman Huang <yong.huang@smartx.com>
> >> >
> >> > To support detached LUKS header creation, make the existing 'file'
> >> > field in BlockdevCreateOptionsLUKS optional.
> >> >
> >> > Signed-off-by: Hyman Huang <yong.huang@smartx.com>
> >> > Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
> >>
> >> [...]
> >>
> >> > diff --git a/qapi/block-core.json b/qapi/block-core.json
> >> > index ae604c6019..69a88d613d 100644
> >> > --- a/qapi/block-core.json
> >> > +++ b/qapi/block-core.json
> >> > @@ -4957,7 +4957,8 @@
> >> >  #
> >> >  # Driver specific image creation options for LUKS.
> >> >  #
> >> > -# @file: Node to create the image format on
> >> > +# @file: Node to create the image format on, mandatory except when
> >> > +#        'preallocation' is not requested
> >>
> >> You mean when @preallocation is "off"?
> >>
> >> Cases:
> >>
> >> 1. @file is mandatory
> >>
> >
> > When @preallocation is specified to PREALLOC_MODE_ON, file
> > is mandatory because preallocation aims to act on payload data that
> > @file holds.
> >
> >
> >> 2. @file is optional and present
> >>
> >
> > When @preallocation is not specified or equals to PREALLOC_MODE_OFF,
> > @file if optional.
> > If @file present,there are two cases:
> > 1. @header is absent,  the creation process degenerate to the origin
> action.
> > 2. @header is present,  the creation process would trunk the payload data
> > image that @file holds and do the LUKS formatting on the image that
> > @header refers;
> >
> >
> >>
> >> 3. @file is optional and absent
> >>
> >
> > When @preallocation is not specified or equals to PREALLOC_MODE_OFF,
> > @file if optional.
> > If @file is absent, do the LUKS formatting only.
> > Note that Either the parameter 'header' or 'file' must be specified.
> >
> > Here's my interpretation; do let me know if any of the points are off or
> > need to be refactored.
> >
> >
> >>
> >> Ignorant question: behavior in each case?
>
> Thanks!  Would it make sense to work the above into the documentation?
>

You mean adding the above interpretation to the following patch?

https://patchew.org/QEMU/c2049499aa05758b4cf18dcec942694ed454a980.1708358310.git.yong.huang@smartx.com/


> [...]
>
>
Yong
Markus Armbruster Feb. 20, 2024, 9:41 a.m. UTC | #5
Yong Huang <yong.huang@smartx.com> writes:

> On Tue, Feb 20, 2024 at 4:56 PM Markus Armbruster <armbru@redhat.com> wrote:
>
>> Yong Huang <yong.huang@smartx.com> writes:
>>
>> > On Tue, Feb 20, 2024 at 2:31 PM Markus Armbruster <armbru@redhat.com>
>> wrote:
>> >
>> >> yong.huang@smartx.com writes:
>> >>
>> >> > From: Hyman Huang <yong.huang@smartx.com>
>> >> >
>> >> > To support detached LUKS header creation, make the existing 'file'
>> >> > field in BlockdevCreateOptionsLUKS optional.
>> >> >
>> >> > Signed-off-by: Hyman Huang <yong.huang@smartx.com>
>> >> > Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
>> >>
>> >> [...]
>> >>
>> >> > diff --git a/qapi/block-core.json b/qapi/block-core.json
>> >> > index ae604c6019..69a88d613d 100644
>> >> > --- a/qapi/block-core.json
>> >> > +++ b/qapi/block-core.json
>> >> > @@ -4957,7 +4957,8 @@
>> >> >  #
>> >> >  # Driver specific image creation options for LUKS.
>> >> >  #
>> >> > -# @file: Node to create the image format on
>> >> > +# @file: Node to create the image format on, mandatory except when
>> >> > +#        'preallocation' is not requested
>> >>
>> >> You mean when @preallocation is "off"?
>> >>
>> >> Cases:
>> >>
>> >> 1. @file is mandatory
>> >>
>> >
>> > When @preallocation is specified to PREALLOC_MODE_ON, file
>> > is mandatory because preallocation aims to act on payload data that
>> > @file holds.
>> >
>> >
>> >> 2. @file is optional and present
>> >>
>> >
>> > When @preallocation is not specified or equals to PREALLOC_MODE_OFF,
>> > @file if optional.
>> > If @file present,there are two cases:
>> > 1. @header is absent,  the creation process degenerate to the origin action.
>> > 2. @header is present,  the creation process would trunk the payload data
>> > image that @file holds and do the LUKS formatting on the image that
>> > @header refers;
>> >
>> >
>> >>
>> >> 3. @file is optional and absent
>> >>
>> >
>> > When @preallocation is not specified or equals to PREALLOC_MODE_OFF,
>> > @file if optional.
>> > If @file is absent, do the LUKS formatting only.
>> > Note that Either the parameter 'header' or 'file' must be specified.
>> >
>> > Here's my interpretation; do let me know if any of the points are off or
>> > need to be refactored.
>> >
>> >
>> >>
>> >> Ignorant question: behavior in each case?
>>
>> Thanks!  Would it make sense to work the above into the documentation?
>>
>
> You mean adding the above interpretation to the following patch?
>
> https://patchew.org/QEMU/c2049499aa05758b4cf18dcec942694ed454a980.1708358310.git.yong.huang@smartx.com/

To the doc comments.

The doc comments are the source code for the "QEMU QMP Reference
Manual".  That manual should fully explain what the QMP commands do.

Information on how to best use the commands, or an introduction to
concepts behind the commands can also be useful, but is often a bad fit
for a *reference* manual.  We can put it elsewhere then.

Makes sense?
Yong Huang Feb. 20, 2024, 10:09 a.m. UTC | #6
On Tue, Feb 20, 2024 at 5:47 PM Markus Armbruster <armbru@redhat.com> wrote:

> Yong Huang <yong.huang@smartx.com> writes:
>
> > On Tue, Feb 20, 2024 at 4:56 PM Markus Armbruster <armbru@redhat.com>
> wrote:
> >
> >> Yong Huang <yong.huang@smartx.com> writes:
> >>
> >> > On Tue, Feb 20, 2024 at 2:31 PM Markus Armbruster <armbru@redhat.com>
> >> wrote:
> >> >
> >> >> yong.huang@smartx.com writes:
> >> >>
> >> >> > From: Hyman Huang <yong.huang@smartx.com>
> >> >> >
> >> >> > To support detached LUKS header creation, make the existing 'file'
> >> >> > field in BlockdevCreateOptionsLUKS optional.
> >> >> >
> >> >> > Signed-off-by: Hyman Huang <yong.huang@smartx.com>
> >> >> > Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
> >> >>
> >> >> [...]
> >> >>
> >> >> > diff --git a/qapi/block-core.json b/qapi/block-core.json
> >> >> > index ae604c6019..69a88d613d 100644
> >> >> > --- a/qapi/block-core.json
> >> >> > +++ b/qapi/block-core.json
> >> >> > @@ -4957,7 +4957,8 @@
> >> >> >  #
> >> >> >  # Driver specific image creation options for LUKS.
> >> >> >  #
> >> >> > -# @file: Node to create the image format on
> >> >> > +# @file: Node to create the image format on, mandatory except when
> >> >> > +#        'preallocation' is not requested
> >> >>
> >> >> You mean when @preallocation is "off"?
> >> >>
> >> >> Cases:
> >> >>
> >> >> 1. @file is mandatory
> >> >>
> >> >
> >> > When @preallocation is specified to PREALLOC_MODE_ON, file
> >> > is mandatory because preallocation aims to act on payload data that
> >> > @file holds.
> >> >
> >> >
> >> >> 2. @file is optional and present
> >> >>
> >> >
> >> > When @preallocation is not specified or equals to PREALLOC_MODE_OFF,
> >> > @file if optional.
> >> > If @file present,there are two cases:
> >> > 1. @header is absent,  the creation process degenerate to the origin
> action.
> >> > 2. @header is present,  the creation process would trunk the payload
> data
> >> > image that @file holds and do the LUKS formatting on the image that
> >> > @header refers;
> >> >
> >> >
> >> >>
> >> >> 3. @file is optional and absent
> >> >>
> >> >
> >> > When @preallocation is not specified or equals to PREALLOC_MODE_OFF,
> >> > @file if optional.
> >> > If @file is absent, do the LUKS formatting only.
> >> > Note that Either the parameter 'header' or 'file' must be specified.
> >> >
> >> > Here's my interpretation; do let me know if any of the points are off
> or
> >> > need to be refactored.
> >> >
> >> >
> >> >>
> >> >> Ignorant question: behavior in each case?
> >>
> >> Thanks!  Would it make sense to work the above into the documentation?
> >>
> >
> > You mean adding the above interpretation to the following patch?
> >
> >
> https://patchew.org/QEMU/c2049499aa05758b4cf18dcec942694ed454a980.1708358310.git.yong.huang@smartx.com/
>
> To the doc comments.
>
> The doc comments are the source code for the "QEMU QMP Reference
> Manual".  That manual should fully explain what the QMP commands do.


> Information on how to best use the commands, or an introduction to
> concepts behind the commands can also be useful, but is often a bad fit
> for a *reference* manual.  We can put it elsewhere then.
>
> Makes sense?
>
>
Of course yes, it can be somewhat complex to use the LUKS volume with
a detachable header, but users may find some relief from the
interpretation.

I'll try it.
diff mbox series

Patch

diff --git a/block/crypto.c b/block/crypto.c
index 68656158e9..e87dc84111 100644
--- a/block/crypto.c
+++ b/block/crypto.c
@@ -663,9 +663,9 @@  block_crypto_co_create_luks(BlockdevCreateOptions *create_options, Error **errp)
     assert(create_options->driver == BLOCKDEV_DRIVER_LUKS);
     luks_opts = &create_options->u.luks;
 
-    bs = bdrv_co_open_blockdev_ref(luks_opts->file, errp);
-    if (bs == NULL) {
-        return -EIO;
+    if (luks_opts->file == NULL) {
+        error_setg(errp, "Formatting LUKS disk requires parameter 'file'");
+        return -EINVAL;
     }
 
     create_opts = (QCryptoBlockCreateOptions) {
@@ -677,10 +677,17 @@  block_crypto_co_create_luks(BlockdevCreateOptions *create_options, Error **errp)
         preallocation = luks_opts->preallocation;
     }
 
-    ret = block_crypto_co_create_generic(bs, luks_opts->size, &create_opts,
-                                         preallocation, errp);
-    if (ret < 0) {
-        goto fail;
+    if (luks_opts->file) {
+        bs = bdrv_co_open_blockdev_ref(luks_opts->file, errp);
+        if (bs == NULL) {
+            return -EIO;
+        }
+
+        ret = block_crypto_co_create_generic(bs, luks_opts->size, &create_opts,
+                                             preallocation, errp);
+        if (ret < 0) {
+            goto fail;
+        }
     }
 
     ret = 0;
diff --git a/qapi/block-core.json b/qapi/block-core.json
index ae604c6019..69a88d613d 100644
--- a/qapi/block-core.json
+++ b/qapi/block-core.json
@@ -4957,7 +4957,8 @@ 
 #
 # Driver specific image creation options for LUKS.
 #
-# @file: Node to create the image format on
+# @file: Node to create the image format on, mandatory except when
+#        'preallocation' is not requested
 #
 # @size: Size of the virtual disk in bytes
 #
@@ -4968,7 +4969,7 @@ 
 ##
 { 'struct': 'BlockdevCreateOptionsLUKS',
   'base': 'QCryptoBlockCreateOptionsLUKS',
-  'data': { 'file':             'BlockdevRef',
+  'data': { '*file':            'BlockdevRef',
             'size':             'size',
             '*preallocation':   'PreallocMode' } }