qemu-devel
[Top][All Lists]
Advanced

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

Re: [PATCH 2/3] block: Fix locking in qmp_block_resize()


From: Vladimir Sementsov-Ogievskiy
Subject: Re: [PATCH 2/3] block: Fix locking in qmp_block_resize()
Date: Tue, 8 Dec 2020 17:46:14 +0300
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.5.1

03.12.2020 20:23, Kevin Wolf wrote:
The drain functions assume that we hold the AioContext lock of the
drained block node. Make sure to actually take the lock.

Cc: qemu-stable@nongnu.org
Fixes: eb94b81a94bce112e6b206df846c1551aaf6cab6
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
  blockdev.c | 5 ++++-
  1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/blockdev.c b/blockdev.c
index 229d2cce1b..0535a8dc9e 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -2481,13 +2481,16 @@ void coroutine_fn qmp_block_resize(bool has_device, 
const char *device,
          return;
      }
+ bdrv_co_lock(bs);
      bdrv_drained_begin(bs);
+    bdrv_co_unlock(bs);
+
      old_ctx = bdrv_co_enter(bs);
      blk_truncate(blk, size, false, PREALLOC_MODE_OFF, 0, errp);
      bdrv_co_leave(bs, old_ctx);
-    bdrv_drained_end(bs);
bdrv_co_lock(bs);
+    bdrv_drained_end(bs);
      blk_unref(blk);
      bdrv_co_unlock(bs);
  }


Can't we just do

    old_ctx = bdrv_co_enter(bs);

    bdrv_drained_begin(bs);
blk_truncate(blk, size, false, PREALLOC_MODE_OFF, 0, errp); bdrv_drained_end(bs);
    blk_unref(blk);

    bdrv_co_leave(bs, old_ctx);


? This way we have one acquire/release section instead of three in a row.. But 
then we probably need addition bdrv_ref/bdrv_unref, to not crash with final 
bdrv_co_leave after blk_unref.

Also, preexisting, but it seems not good that coroutine_fn qmp_block_resize is 
called from non-coroutine hmp_block_resize()

anyway:
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>

--
Best regards,
Vladimir



reply via email to

[Prev in Thread] Current Thread [Next in Thread]