|
@@ -2190,6 +2190,8 @@ SYSCALL_DEFINE1(swapoff, const char __user *, specialfile)
|
|
spin_unlock(&p->lock);
|
|
spin_unlock(&p->lock);
|
|
spin_unlock(&swap_lock);
|
|
spin_unlock(&swap_lock);
|
|
|
|
|
|
|
|
+ disable_swap_slots_cache_lock();
|
|
|
|
+
|
|
set_current_oom_origin();
|
|
set_current_oom_origin();
|
|
err = try_to_unuse(p->type, false, 0); /* force unuse all pages */
|
|
err = try_to_unuse(p->type, false, 0); /* force unuse all pages */
|
|
clear_current_oom_origin();
|
|
clear_current_oom_origin();
|
|
@@ -2197,9 +2199,12 @@ SYSCALL_DEFINE1(swapoff, const char __user *, specialfile)
|
|
if (err) {
|
|
if (err) {
|
|
/* re-insert swap space back into swap_list */
|
|
/* re-insert swap space back into swap_list */
|
|
reinsert_swap_info(p);
|
|
reinsert_swap_info(p);
|
|
|
|
+ reenable_swap_slots_cache_unlock();
|
|
goto out_dput;
|
|
goto out_dput;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ reenable_swap_slots_cache_unlock();
|
|
|
|
+
|
|
flush_work(&p->discard_work);
|
|
flush_work(&p->discard_work);
|
|
|
|
|
|
destroy_swap_extents(p);
|
|
destroy_swap_extents(p);
|
|
@@ -2886,6 +2891,8 @@ out:
|
|
putname(name);
|
|
putname(name);
|
|
if (inode && S_ISREG(inode->i_mode))
|
|
if (inode && S_ISREG(inode->i_mode))
|
|
inode_unlock(inode);
|
|
inode_unlock(inode);
|
|
|
|
+ if (!error)
|
|
|
|
+ enable_swap_slots_cache();
|
|
return error;
|
|
return error;
|
|
}
|
|
}
|
|
|
|
|