Re: [PATCH] qemu_process: add tray changed event to queue in refresh disks

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 12/13/22 13:40, Kristina Hanicova wrote:
> There are some cases when the internal state of disks can change
> without qemu sending events about it (e.g. a disk can close
> during reset). In case this happens, we should emit an event
> about the modified disk.
> 
> Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1824722#c20
> 
> Signed-off-by: Kristina Hanicova <khanicov@xxxxxxxxxx>
> ---
>  src/qemu/qemu_process.c | 17 +++++++++++++++--
>  1 file changed, 15 insertions(+), 2 deletions(-)
> 
> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> index 5de55435d2..601e9694b6 100644
> --- a/src/qemu/qemu_process.c
> +++ b/src/qemu/qemu_process.c
> @@ -8675,6 +8675,7 @@ qemuProcessRefreshDisks(virDomainObj *vm,
>      qemuDomainObjPrivate *priv = vm->privateData;
>      g_autoptr(GHashTable) table = NULL;
>      size_t i;
> +    virQEMUDriver *driver = QEMU_DOMAIN_PRIVATE(vm)->driver;

Nit pick, we tend to declare driver first as it's usually the most
important variable. In this specific case, it can be declared second
(just like in qemuProcessFakeReboot(), for instance), because
QEMU_DOMAIN_PRIVATE(vm) is the same as priv variable.

>  
>      if (qemuDomainObjEnterMonitorAsync(vm, asyncJob) == 0) {
>          table = qemuMonitorGetBlockInfo(priv->mon);
> @@ -8697,14 +8698,26 @@ qemuProcessRefreshDisks(virDomainObj *vm,
>              continue;
>  
>          if (info->removable) {
> +            virObjectEvent *event = NULL;
> +            int reason;
> +
>              if (info->empty)
>                  virDomainDiskEmptySource(disk);
>  
>              if (info->tray) {
> -                if (info->tray_open)
> +                if (info->tray_open == disk->tray_status)
> +                    continue;
> +
> +                if (info->tray_open) {
> +                    reason = VIR_DOMAIN_EVENT_TRAY_CHANGE_OPEN;
>                      disk->tray_status = VIR_DOMAIN_DISK_TRAY_OPEN;
> -                else
> +                } else {
> +                    reason = VIR_DOMAIN_EVENT_TRAY_CHANGE_CLOSE;
>                      disk->tray_status = VIR_DOMAIN_DISK_TRAY_CLOSED;
> +                }
> +
> +                event = virDomainEventTrayChangeNewFromObj(vm, disk->info.alias, reason);
> +                virObjectEventStateQueue(driver->domainEventState, event);
>              }
>          }
>  

Reviewed-by: Michal Privoznik <mprivozn@xxxxxxxxxx>

and pushed.

Michal




[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux