@@ -612,34 +612,41 @@ void hmp_pmemsave(Monitor *mon, const QDict *qdict)
static void hmp_cont_cb(void *opaque, int err)
{
- Monitor *mon = opaque;
-
if (!err) {
- hmp_cont(mon, NULL);
+ qmp_cont(NULL);
}
}
-void hmp_cont(Monitor *mon, const QDict *qdict)
+static bool blockinfo_is_encrypted(const BlockInfo *bdev)
{
- Error *errp = NULL;
-
- qmp_cont(&errp);
- if (error_is_set(&errp)) {
- if (error_is_type(errp, QERR_DEVICE_ENCRYPTED)) {
- const char *device;
+ return (bdev->inserted && bdev->inserted->encrypted);
+}
- /* The device is encrypted. Ask the user for the password
- and retry */
+static bool blockinfo_key_is_set(const BlockInfo *bdev)
+{
+ return (bdev->inserted && bdev->inserted->valid_encryption_key);
+}
- device = error_get_field(errp, "device");
- assert(device != NULL);
+void hmp_cont(Monitor *mon, const QDict *qdict)
+{
+ BlockInfoList *bdev_list, *bdev;
+ Error *errp = NULL;
- monitor_read_block_device_key(mon, device, hmp_cont_cb, mon);
- error_free(errp);
- return;
+ bdev_list = qmp_query_block(NULL);
+ for (bdev = bdev_list; bdev; bdev = bdev->next) {
+ if (blockinfo_is_encrypted(bdev->value) &&
+ !blockinfo_key_is_set(bdev->value)) {
+ monitor_read_block_device_key(mon, bdev->value->device,
+ hmp_cont_cb, NULL);
+ goto out;
}
- hmp_handle_error(mon, &errp);
}
+
+ qmp_cont(&errp);
+ hmp_handle_error(mon, &errp);
+
+out:
+ qapi_free_BlockInfoList(bdev_list);
}
void hmp_system_wakeup(Monitor *mon, const QDict *qdict)
This commit changes hmp_cont() to loop through all block devices and proactively set an encryption key for any encrypted device without a valid one. This change is needed because QERR_DEVICE_ENCRYPTED is going to be dropped by a future commit. Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com> --- hmp.c | 43 +++++++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 18 deletions(-)