Hi folks, When we test migration with raw-format disk, we found that the QEMU process in the dst will lose the write lock after migration. However, the QEMU process in the dst will still hold the write lock for qcow2-format disk.
After reading some block layer's code, I found that the first blk_set_perm in blk_root_activate will set blk->shared_perm to BLK_PERM_ALL (disable all shared permissions?). Then in blk_vm_state_changed, blk_set_perm will set shared_perm to blk->shared_perm, which is BLK_PERM_ALL. And it makes raw_handle_perm_lock not to get the write lock. So I try the following patch and it will fix the problem: diff --git a/block/block-backend.c b/block/block-backend.c index 12ef80ea17..96518fd1f0 100644 --- a/block/block-backend.c +++ b/block/block-backend.c @@ -197,13 +197,6 @@ static void blk_root_activate(BdrvChild *child, Error **errp) blk->disable_perm = false; - blk_set_perm(blk, blk->perm, BLK_PERM_ALL, &local_err); - if (local_err) { - error_propagate(errp, local_err); - blk->disable_perm = true; - return; - } - if (runstate_check(RUN_STATE_INMIGRATE)) { /* Activation can happen when migration process is still active, for * example when nbd_server_add is called during non-shared storage I'm new to the block layer and I'm not sure that it's a right fix to the problem. Any idea about the problem and the patch? Thanks, Peng