• Cesar Eduardo Barros's avatar
    sys_swapon: fix inode locking · 2130781e
    Cesar Eduardo Barros authored
    A conflict between 52c50567 ("mm: swap: unlock swapfile inode mutex
    before closing file on bad swapfiles") and 83ef99be ("sys_swapon:
    remove did_down variable") caused a double unlock of the inode mutex
    (once in bad_swap: before the filp_close, once at the end just before
    returning).
    
    The patch which added the extra unlock cleared did_down to avoid
    unlocking twice, but the other patch removed the did_down variable.
    
    To fix, set inode to NULL after the first unlock, since it will be used
    after that point only for the final unlock.
    
    While checking this patch, I found a path which could unlock without
    locking, in case the same inode was added as a swapfile twice. To fix,
    move the setting of the inode variable further down, to just before
    claim_swapfile, which will lock the inode before doing anything else.
    
    Cc: Mel Gorman <mgorman@suse.de>
    Cc: Hugh Dickins <hughd@google.com>
    Cc: Eric B Munson <emunson@mgebm.net>
    Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarCesar Eduardo Barros <cesarb@cesarb.net>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    2130781e
swapfile.c 66.3 KB