• Shyam Prasad N's avatar
    cifs: fix lock ordering while disabling multichannel · 5eef12c4
    Shyam Prasad N authored
    The code to handle the case of server disabling multichannel
    was picking iface_lock with chan_lock held. This goes against
    the lock ordering rules, as iface_lock is a higher order lock
    (even if it isn't so obvious).
    
    This change fixes the lock ordering by doing the following in
    that order for each secondary channel:
    1. store iface and server pointers in local variable
    2. remove references to iface and server in channels
    3. unlock chan_lock
    4. lock iface_lock
    5. dec ref count for iface
    6. unlock iface_lock
    7. dec ref count for server
    8. lock chan_lock again
    
    Since this function can only be called in smb2_reconnect, and
    that cannot be called by two parallel processes, we should not
    have races due to dropping chan_lock between steps 3 and 8.
    
    Fixes: ee1d2179 ("cifs: handle when server stops supporting multichannel")
    Reported-by: default avatarPaulo Alcantara <pc@manguebit.com>
    Signed-off-by: default avatarShyam Prasad N <sprasad@microsoft.com>
    Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
    5eef12c4
sess.c 53.5 KB