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 <weijie.yang@xxxxxxxxxxx> --- 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 -- To unsubscribe from this list: send the line "unsubscribe stable" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html