• Miklos Szeredi's avatar
    ovl: fix deadlock in splice write · 9b91b6b0
    Miklos Szeredi authored
    There's possibility of an ABBA deadlock in case of a splice write to an
    overlayfs file and a concurrent splice write to a corresponding real file.
    
    The call chain for splice to an overlay file:
    
     -> do_splice                     [takes sb_writers on overlay file]
       -> do_splice_from
         -> iter_file_splice_write    [takes pipe->mutex]
           -> vfs_iter_write
             ...
             -> ovl_write_iter        [takes sb_writers on real file]
    
    And the call chain for splice to a real file:
    
     -> do_splice                     [takes sb_writers on real file]
       -> do_splice_from
         -> iter_file_splice_write    [takes pipe->mutex]
    
    Syzbot successfully bisected this to commit 82a763e6 ("ovl: simplify
    file splice").
    
    Fix by reverting the write part of the above commit and by adding missing
    bits from ovl_write_iter() into ovl_splice_write().
    
    Fixes: 82a763e6 ("ovl: simplify file splice")
    Reported-and-tested-by: syzbot+579885d1a9a833336209@syzkaller.appspotmail.com
    Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
    9b91b6b0
file.c 15.1 KB