• Sage Weil's avatar
    ceph: fix cap removal races · f818a736
    Sage Weil authored
    The iterate_session_caps helper traverses the session caps list and tries
    to grab an inode reference.  However, the __ceph_remove_cap was clearing
    the inode backpointer _before_ removing itself from the session list,
    causing a null pointer dereference.
    
    Clear cap->ci under protection of s_cap_lock to avoid the race, and to
    tightly couple the list and backpointer state.  Use a local flag to
    indicate whether we are releasing the cap, as cap->session may be modified
    by a racing thread in iterate_session_caps.
    Signed-off-by: default avatarSage Weil <sage@newdream.net>
    f818a736
caps.c 80 KB