Skip to content
  • Kevin Wolf's avatar
    1a30b0f5
    block: .bdrv_open is non-coroutine and unlocked · 1a30b0f5
    Kevin Wolf authored
    
    
    Drivers were a bit confused about whether .bdrv_open can run in a
    coroutine and whether or not it holds a graph lock.
    
    It cannot keep a graph lock from the caller across the whole function
    because it both changes the graph (requires a writer lock) and does I/O
    (requires a reader lock). Therefore, it should take these locks
    internally as needed.
    
    The functions used to be called in coroutine context during image
    creation. This was buggy for other reasons, and as of commit 32192301,
    all block drivers go through no_co_wrappers. So it is not called in
    coroutine context any more.
    
    Fix qcow2 and qed to work with the correct assumptions: The graph lock
    needs to be taken internally instead of just assuming it's already
    there, and the coroutine path is dead code that can be removed.
    
    Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
    Reviewed-by: default avatarEric Blake <eblake@redhat.com>
    Reviewed-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
    Message-Id: <20230504115750.54437-9-kwolf@redhat.com>
    Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
    1a30b0f5
    block: .bdrv_open is non-coroutine and unlocked
    Kevin Wolf authored
    
    
    Drivers were a bit confused about whether .bdrv_open can run in a
    coroutine and whether or not it holds a graph lock.
    
    It cannot keep a graph lock from the caller across the whole function
    because it both changes the graph (requires a writer lock) and does I/O
    (requires a reader lock). Therefore, it should take these locks
    internally as needed.
    
    The functions used to be called in coroutine context during image
    creation. This was buggy for other reasons, and as of commit 32192301,
    all block drivers go through no_co_wrappers. So it is not called in
    coroutine context any more.
    
    Fix qcow2 and qed to work with the correct assumptions: The graph lock
    needs to be taken internally instead of just assuming it's already
    there, and the coroutine path is dead code that can be removed.
    
    Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
    Reviewed-by: default avatarEric Blake <eblake@redhat.com>
    Reviewed-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
    Message-Id: <20230504115750.54437-9-kwolf@redhat.com>
    Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
Loading