|
|
@@ -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);
|