|
@@ -1443,13 +1443,12 @@ static int setup_swap_extents(struct swap_info_struct *sis, sector_t *span)
|
|
|
return generic_swapfile_activate(sis, swap_file, span);
|
|
|
}
|
|
|
|
|
|
-static void enable_swap_info(struct swap_info_struct *p, int prio,
|
|
|
+static void _enable_swap_info(struct swap_info_struct *p, int prio,
|
|
|
unsigned char *swap_map,
|
|
|
unsigned long *frontswap_map)
|
|
|
{
|
|
|
int i, prev;
|
|
|
|
|
|
- spin_lock(&swap_lock);
|
|
|
if (prio >= 0)
|
|
|
p->prio = prio;
|
|
|
else
|
|
@@ -1473,6 +1472,21 @@ static void enable_swap_info(struct swap_info_struct *p, int prio,
|
|
|
else
|
|
|
swap_info[prev]->next = p->type;
|
|
|
frontswap_init(p->type);
|
|
|
+}
|
|
|
+
|
|
|
+static void enable_swap_info(struct swap_info_struct *p, int prio,
|
|
|
+ unsigned char *swap_map,
|
|
|
+ unsigned long *frontswap_map)
|
|
|
+{
|
|
|
+ spin_lock(&swap_lock);
|
|
|
+ _enable_swap_info(p, prio, swap_map, frontswap_map);
|
|
|
+ spin_unlock(&swap_lock);
|
|
|
+}
|
|
|
+
|
|
|
+static void reinsert_swap_info(struct swap_info_struct *p)
|
|
|
+{
|
|
|
+ spin_lock(&swap_lock);
|
|
|
+ _enable_swap_info(p, p->prio, p->swap_map, frontswap_map_get(p));
|
|
|
spin_unlock(&swap_lock);
|
|
|
}
|
|
|
|
|
@@ -1548,14 +1562,8 @@ SYSCALL_DEFINE1(swapoff, const char __user *, specialfile)
|
|
|
compare_swap_oom_score_adj(OOM_SCORE_ADJ_MAX, oom_score_adj);
|
|
|
|
|
|
if (err) {
|
|
|
- /*
|
|
|
- * reading p->prio and p->swap_map outside the lock is
|
|
|
- * safe here because only sys_swapon and sys_swapoff
|
|
|
- * change them, and there can be no other sys_swapon or
|
|
|
- * sys_swapoff for this swap_info_struct at this point.
|
|
|
- */
|
|
|
/* re-insert swap space back into swap_list */
|
|
|
- enable_swap_info(p, p->prio, p->swap_map, frontswap_map_get(p));
|
|
|
+ reinsert_swap_info(p);
|
|
|
goto out_dput;
|
|
|
}
|
|
|
|