Skip to content
Snippets Groups Projects
  • Kevin Wolf's avatar
    2f64e1fc
    block: Mark bdrv_replace_child_tran() GRAPH_WRLOCK · 2f64e1fc
    Kevin Wolf authored
    
    Instead of taking the writer lock internally, require callers to already
    hold it when calling bdrv_replace_child_tran(). These callers will
    typically already hold the graph lock once the locking work is
    completed, which means that they can't call functions that take it
    internally.
    
    While a graph lock is held, polling is not allowed. Therefore draining
    the necessary nodes can no longer be done in bdrv_remove_child() and
    bdrv_replace_node_noperm(), but the callers must already make sure that
    they are drained.
    
    Note that the transaction callbacks still take the lock internally, so
    tran_finalize() must be called without the lock held. This is because
    bdrv_append() also calls bdrv_attach_child_noperm(), which currently
    requires to be called unlocked. Once it changes, the transaction
    callbacks can be changed, too.
    
    Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
    Reviewed-by: default avatarEmanuele Giuseppe Esposito <eesposit@redhat.com>
    Reviewed-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
    Message-ID: <20230911094620.45040-10-kwolf@redhat.com>
    Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
    2f64e1fc
    History
    block: Mark bdrv_replace_child_tran() GRAPH_WRLOCK
    Kevin Wolf authored
    
    Instead of taking the writer lock internally, require callers to already
    hold it when calling bdrv_replace_child_tran(). These callers will
    typically already hold the graph lock once the locking work is
    completed, which means that they can't call functions that take it
    internally.
    
    While a graph lock is held, polling is not allowed. Therefore draining
    the necessary nodes can no longer be done in bdrv_remove_child() and
    bdrv_replace_node_noperm(), but the callers must already make sure that
    they are drained.
    
    Note that the transaction callbacks still take the lock internally, so
    tran_finalize() must be called without the lock held. This is because
    bdrv_append() also calls bdrv_attach_child_noperm(), which currently
    requires to be called unlocked. Once it changes, the transaction
    callbacks can be changed, too.
    
    Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
    Reviewed-by: default avatarEmanuele Giuseppe Esposito <eesposit@redhat.com>
    Reviewed-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
    Message-ID: <20230911094620.45040-10-kwolf@redhat.com>
    Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>