• Naohiro Aota's avatar
    mm/swapfile.c: move inode_lock out of claim_swapfile · d795a90e
    Naohiro Aota authored
    claim_swapfile() currently keeps the inode locked when it is successful,
    or the file is already swapfile (with -EBUSY).  And, on the other error
    cases, it does not lock the inode.
    This inconsistency of the lock state and return value is quite confusing
    and actually causing a bad unlock balance as below in the "bad_swap"
    section of __do_sys_swapon().
    This commit fixes this issue by moving the inode_lock() and IS_SWAPFILE
    check out of claim_swapfile().  The inode is unlocked in
    "bad_swap_unlock_inode" section, so that the inode is ensured to be
    unlocked at "bad_swap".  Thus, error handling codes after the locking now
    jumps to "bad_swap_unlock_inode" instead of "bad_swap".
        WARNING: bad unlock balance detected!
        5.5.0-rc7+ #176 Not tainted
        swapon/4294 is trying to release lock (&sb->s_type->i_mutex_key) at: __do_sys_swapon+0x94b/0x3550
        but there are no more locks to release!
        other info that might help us debug this:
        no locks held by swapon/4294.
        stack backtrace:
        CPU: 5 PID: 4294 Comm: swapon Not tainted 5.5.0-rc7-BTRFS-ZNS+ #176
        Hardware name: ASUS All Series/H87-PRO, BIOS 2102 07/29/2014
        Call Trace:
        RIP: 0033:0x7f15da0a0dc7
    Fixes: 1638045c
     ("mm: set S_SWAPFILE on blockdev swap devices")
    Signed-off-by: default avatarNaohiro Aota <naohiro.aota@wdc.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Tested-by: default avatarQais Youef <qais.yousef@arm.com>
    Reviewed-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Reviewed-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    Cc: Christoph Hellwig <hch@infradead.org>
    Cc: <stable@vger.kernel.org>
    Link: http://lkml.kernel.org/r/20200206090132.154869-1-naohiro.aota@wdc.com
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
swapfile.c 95.1 KB