Skip to content
  • Kevin Wolf's avatar
    69b736e7
    block: Make permission changes in reopen less wrong · 69b736e7
    Kevin Wolf authored
    
    
    The way that reopen interacts with permission changes has one big
    problem: Both operations are recursive, and the permissions are changes
    for each node in the reopen queue.
    
    For a simple graph that consists just of parent and child,
    .bdrv_check_perm will be called twice for the child, once recursively
    when adjusting the permissions of parent, and once again when the child
    itself is reopened.
    
    Even worse, the first .bdrv_check_perm call happens before
    .bdrv_reopen_prepare was called for the child and the second one is
    called afterwards.
    
    Making sure that .bdrv_check_perm (and the other permission callbacks)
    are called only once is hard. We can cope with multiple calls right now,
    but as soon as file-posix gets a dynamic auto-read-only that may need to
    open a new file descriptor, we get the additional requirement that all
    of them are after the .bdrv_reopen_prepare call.
    
    So reorder things in bdrv_reopen_multiple() to first call
    .bdrv_reopen_prepare for all involved nodes and only then adjust
    permissions.
    
    Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
    69b736e7
    block: Make permission changes in reopen less wrong
    Kevin Wolf authored
    
    
    The way that reopen interacts with permission changes has one big
    problem: Both operations are recursive, and the permissions are changes
    for each node in the reopen queue.
    
    For a simple graph that consists just of parent and child,
    .bdrv_check_perm will be called twice for the child, once recursively
    when adjusting the permissions of parent, and once again when the child
    itself is reopened.
    
    Even worse, the first .bdrv_check_perm call happens before
    .bdrv_reopen_prepare was called for the child and the second one is
    called afterwards.
    
    Making sure that .bdrv_check_perm (and the other permission callbacks)
    are called only once is hard. We can cope with multiple calls right now,
    but as soon as file-posix gets a dynamic auto-read-only that may need to
    open a new file descriptor, we get the additional requirement that all
    of them are after the .bdrv_reopen_prepare call.
    
    So reorder things in bdrv_reopen_multiple() to first call
    .bdrv_reopen_prepare for all involved nodes and only then adjust
    permissions.
    
    Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
Loading