• Jeff Layton's avatar
    ceph: when filling trace, call ceph_get_inode outside of mutexes · bca9fc14
    Jeff Layton authored
    Geng Jichao reported a rather complex deadlock involving several
    moving parts:
    
    1) readahead is issued against an inode and some of its pages are locked
       while the read is in flight
    
    2) the same inode is evicted from the cache, and this task gets stuck
       waiting for the page lock because of the above readahead
    
    3) another task is processing a reply trace, and looks up the inode
       being evicted while holding the s_mutex. That ends up waiting for the
       eviction to complete
    
    4) a write reply for an unrelated inode is then processed in the
       ceph_con_workfn job. It calls ceph_check_caps after putting wrbuffer
       caps, and that gets stuck waiting on the s_mutex held by 3.
    
    The reply to "1" is stuck behind the write reply in "4", so we deadlock
    at that point.
    
    This patch changes the trace processing to call ceph_get_inode outside
    of the s_mutex and snap_rwsem, which should break the cycle above.
    
    [ idryomov: break unnecessarily long lines ]
    
    URL: https://tracker.ceph.com/issues/47998Reported-by: default avatarGeng Jichao <gengjichao@jd.com>
    Signed-off-by: default avatarJeff Layton <jlayton@kernel.org>
    Reviewed-by: default avatarLuis Henriques <lhenriques@suse.de>
    Signed-off-by: default avatarIlya Dryomov <idryomov@gmail.com>
    bca9fc14
inode.c 66.2 KB