[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] xen-block: Fix removal of backend instance via xenstore
From: |
Anthony PERARD |
Subject: |
Re: [PATCH] xen-block: Fix removal of backend instance via xenstore |
Date: |
Mon, 22 Mar 2021 14:31:54 +0000 |
Hi Paul, Stefano,
Could one of you could give a Ack to this patch?
Thanks,
On Mon, Mar 08, 2021 at 02:32:32PM +0000, Anthony PERARD wrote:
> From: Anthony PERARD <anthony.perard@citrix.com>
>
> Whenever a Xen block device is detach via xenstore, the image
> associated with it remained open by the backend QEMU and an error is
> logged:
> qemu-system-i386: failed to destroy drive: Node xvdz-qcow2 is in use
>
> This happened since object_unparent() doesn't immediately frees the
> object and thus keep a reference to the node we are trying to free.
> The reference is hold by the "drive" property and the call
> xen_block_drive_destroy() fails.
>
> In order to fix that, we call drain_call_rcu() to run the callback
> setup by bus_remove_child() via object_unparent().
>
> Fixes: 2d24a6466154 ("device-core: use RCU for list of children of a bus")
>
> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
> ---
> CCing people whom introduced/reviewed the change to use RCU to give
> them a chance to say if the change is fine.
> ---
> hw/block/xen-block.c | 9 +++++++++
> 1 file changed, 9 insertions(+)
>
> diff --git a/hw/block/xen-block.c b/hw/block/xen-block.c
> index a3b69e27096f..fe5f828e2d25 100644
> --- a/hw/block/xen-block.c
> +++ b/hw/block/xen-block.c
> @@ -972,6 +972,15 @@ static void xen_block_device_destroy(XenBackendInstance
> *backend,
>
> object_unparent(OBJECT(xendev));
>
> + /*
> + * Drall all pending RCU callbacks as object_unparent() frees `xendev'
> + * in a RCU callback.
> + * And due to the property "drive" still existing in `xendev', we
> + * cann't destroy the XenBlockDrive associated with `xendev' with
> + * xen_block_drive_destroy() below.
> + */
> + drain_call_rcu();
> +
> if (iothread) {
> xen_block_iothread_destroy(iothread, errp);
> if (*errp) {
> --
> Anthony PERARD
>
--
Anthony PERARD
Re: [PATCH] xen-block: Fix removal of backend instance via xenstore,
Anthony PERARD <=
Re: [PATCH] xen-block: Fix removal of backend instance via xenstore, Paul Durrant, 2021/03/22