From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: From: Weijie Yang To: hughd@google.com Cc: 'Andrew Morton' , 'Minchan Kim' , shli@kernel.org, 'Bob Liu' , weijie.yang.kh@gmail.com, 'Seth Jennings' , 'Heesub Shin' , mquzik@redhat.com, 'Linux-MM' , 'linux-kernel' , stable@vger.kernel.org Subject: [PATCH 3/8] mm/swap: prevent concurrent swapon on the same S_ISBLK blockdev Date: Mon, 27 Jan 2014 18:03:04 +0800 Message-id: <000c01cf1b47$ce280170$6a780450$%yang@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=utf-8 Content-transfer-encoding: 7bit Content-language: zh-cn Sender: linux-kernel-owner@vger.kernel.org List-ID: When swapon the same S_ISBLK blockdev concurrent, the allocated two swap_info could hold the same block_device, because claim_swapfile() allow the same holder(here, it is sys_swapon function). To prevent this situation, This patch adds swap_lock protect to ensure we can find this situation and return -EBUSY for one swapon call. As for S_ISREG swapfile, claim_swapfile() already prevent this scenario by holding inode->i_mutex. This patch is just for a rare scenario, aim to correct of code. Signed-off-by: Weijie Yang --- mm/swapfile.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mm/swapfile.c b/mm/swapfile.c index 4d24158..413c213 100644 --- a/mm/swapfile.c +++ b/mm/swapfile.c @@ -2459,9 +2459,10 @@ SYSCALL_DEFINE2(swapon, const char __user *, specialfile, int, swap_flags) goto bad_swap; } + /* prevent concurrent swapon on the same S_ISBLK blockdev */ + spin_lock(&swap_lock); p->swap_file = swap_file; mapping = swap_file->f_mapping; - for (i = 0; i < nr_swapfiles; i++) { struct swap_info_struct *q = swap_info[i]; @@ -2472,6 +2473,7 @@ SYSCALL_DEFINE2(swapon, const char __user *, specialfile, int, swap_flags) goto bad_swap; } } + spin_unlock(&swap_lock); inode = mapping->host; /* If S_ISREG(inode->i_mode) will do mutex_lock(&inode->i_mutex); */ -- 1.7.10.4