• Andreas Gruenbacher's avatar
    gfs2: Fix mmap + page fault deadlocks for buffered I/O · 00bfe02f
    Andreas Gruenbacher authored
    In the .read_iter and .write_iter file operations, we're accessing
    user-space memory while holding the inode glock.  There is a possibility
    that the memory is mapped to the same file, in which case we'd recurse
    on the same glock.
    
    We could detect and work around this simple case of recursive locking,
    but more complex scenarios exist that involve multiple glocks,
    processes, and cluster nodes, and working around all of those cases
    isn't practical or even possible.
    
    Avoid these kinds of problems by disabling page faults while holding the
    inode glock.  If a page fault would occur, we either end up with a
    partial read or write or with -EFAULT if nothing could be read or
    written.  In either case, we know that we're not done with the
    operation, so we indicate that we're willing to give up the inode glock
    and then we fault in the missing pages.  If that made us lose the inode
    glock, we return a partial read or write.  Otherwise, we resume the
    operation.
    
    This locking problem was originally reported by Jan Kara.  Linus came up
    with the idea of disabling page faults.  Many thanks to Al Viro and
    Matthew Wilcox for their feedback.
    Signed-off-by: default avatarAndreas Gruenbacher <agruenba@redhat.com>
    00bfe02f
file.c 38 KB