• Jeff Layton's avatar
    ceph: check session state after bumping session->s_seq · 62575e27
    Jeff Layton authored
    Some messages sent by the MDS entail a session sequence number
    increment, and the MDS will drop certain types of requests on the floor
    when the sequence numbers don't match.
    
    In particular, a REQUEST_CLOSE message can cross with one of the
    sequence morphing messages from the MDS which can cause the client to
    stall, waiting for a response that will never come.
    
    Originally, this meant an up to 5s delay before the recurring workqueue
    job kicked in and resent the request, but a recent change made it so
    that the client would never resend, causing a 60s stall unmounting and
    sometimes a blockisting event.
    
    Add a new helper for incrementing the session sequence and then testing
    to see whether a REQUEST_CLOSE needs to be resent, and move the handling
    of CEPH_MDS_SESSION_CLOSING into that function. Change all of the
    bare sequence counter increments to use the new helper.
    
    Reorganize check_session_state with a switch statement.  It should no
    longer be called when the session is CLOSING, so throw a warning if it
    ever is (but still handle that case sanely).
    
    [ idryomov: whitespace, pr_err() call fixup ]
    
    URL: https://tracker.ceph.com/issues/47563
    Fixes: fa996773 ("ceph: fix potential mdsc use-after-free crash")
    Reported-by: default avatarPatrick Donnelly <pdonnell@redhat.com>
    Signed-off-by: default avatarJeff Layton <jlayton@kernel.org>
    Reviewed-by: default avatarIlya Dryomov <idryomov@gmail.com>
    Reviewed-by: default avatarXiubo Li <xiubli@redhat.com>
    Signed-off-by: default avatarIlya Dryomov <idryomov@gmail.com>
    62575e27
caps.c 121 KB