mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-19 11:43:40 +00:00
mm: fix nr_rotate_swap leak in swapon() error case
If swapon() fails after incrementing nr_rotate_swap, we don't decrement it and thus effectively leak it. Make sure we decrement it if we incremented it. Link: http://lkml.kernel.org/r/b6fe6b879f17fa68eee6cbd876f459f6e5e33495.1526491581.git.osandov@fb.com Fixes: 81a0298bdfab ("mm, swap: don't use VMA based swap readahead if HDD is used as swap") Signed-off-by: Omar Sandoval <osandov@fb.com> Reviewed-by: Rik van Riel <riel@surriel.com> Reviewed-by: "Huang, Ying" <ying.huang@intel.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
62d18ecfa6
commit
7cbf319234
@ -3112,6 +3112,7 @@ SYSCALL_DEFINE2(swapon, const char __user *, specialfile, int, swap_flags)
|
||||
unsigned long *frontswap_map = NULL;
|
||||
struct page *page = NULL;
|
||||
struct inode *inode = NULL;
|
||||
bool inced_nr_rotate_swap = false;
|
||||
|
||||
if (swap_flags & ~SWAP_FLAGS_VALID)
|
||||
return -EINVAL;
|
||||
@ -3215,8 +3216,10 @@ SYSCALL_DEFINE2(swapon, const char __user *, specialfile, int, swap_flags)
|
||||
cluster = per_cpu_ptr(p->percpu_cluster, cpu);
|
||||
cluster_set_null(&cluster->index);
|
||||
}
|
||||
} else
|
||||
} else {
|
||||
atomic_inc(&nr_rotate_swap);
|
||||
inced_nr_rotate_swap = true;
|
||||
}
|
||||
|
||||
error = swap_cgroup_swapon(p->type, maxpages);
|
||||
if (error)
|
||||
@ -3307,6 +3310,8 @@ bad_swap:
|
||||
vfree(swap_map);
|
||||
kvfree(cluster_info);
|
||||
kvfree(frontswap_map);
|
||||
if (inced_nr_rotate_swap)
|
||||
atomic_dec(&nr_rotate_swap);
|
||||
if (swap_file) {
|
||||
if (inode && S_ISREG(inode->i_mode)) {
|
||||
inode_unlock(inode);
|
||||
|
Loading…
x
Reference in New Issue
Block a user