d3e84e4 repart: when keeping ref to backing inode/devnode, use fd_reopen() rathern than F_DUPFD

1 file Authored by Lennart Poettering 2 years ago, Committed by zbyszek 2 years ago,
    repart: when keeping ref to backing inode/devnode, use fd_reopen() rathern than F_DUPFD
    
    Via the "backing_fd" variable we intend to pin the backing inode through
    our entire code. So far we typically created the fd via F_DUPFD_CLOEXEC,
    and thus any BSD lock taken one the original fd is shared with our
    backing_fd reference. And if the origina fd is closed but our backing_fd
    is not, we'll keep the BSD lock open, even if we then reopen the block
    device through the backing_fd. If hit, this results in a deadlock.
    
    Let's fix that by creating the backing_fd via fd_reopen(), so that the
    locks are no longer shared, and if the original fd is closed all BSD
    locks on it that are in effect are auto-released.
    
    (Note the deadlock is only triggered if multiple operations on the same
    backing inode are executed, i.e. factory reset, resize and applying of
    partitions.)
    
    Replaces: #24181
    (cherry picked from commit 38f81e937426993cfc899aa09298f69f00935852)
    
        
file modified
+2 -2