mm: do not call frontswap_init() during swapoff
The call to frontswap_init() was added within enable_swap_info(), which was called not only during sys_swapon, but also to reinsert the swap_info into the swap_list in case of failure of try_to_unuse() within sys_swapoff. This means that frontswap_init() might be called more than once for the same swap area. While as far as I could see no frontswap implementation has any problem with it (and in fact, all the ones I found ignore the parameter passed to frontswap_init), this could change in the future. To prevent future problems, move the call to frontswap_init() to outside the code shared between sys_swapon and sys_swapoff. Signed-off-by: Cesar Eduardo Barros <cesarb@cesarb.net> Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> Acked-by: Dan Magenheimer <dan.magenheimer@oracle.com> Cc: Mel Gorman <mgorman@suse.de> Cc: Rik van Riel <riel@redhat.com> Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Hugh Dickins <hughd@google.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
cf0cac0a09
commit
6555bc0357
@ -1471,7 +1471,6 @@ static void _enable_swap_info(struct swap_info_struct *p, int prio,
|
||||
swap_list.head = swap_list.next = p->type;
|
||||
else
|
||||
swap_info[prev]->next = p->type;
|
||||
frontswap_init(p->type);
|
||||
}
|
||||
|
||||
static void enable_swap_info(struct swap_info_struct *p, int prio,
|
||||
@ -1480,6 +1479,7 @@ static void enable_swap_info(struct swap_info_struct *p, int prio,
|
||||
{
|
||||
spin_lock(&swap_lock);
|
||||
_enable_swap_info(p, prio, swap_map, frontswap_map);
|
||||
frontswap_init(p->type);
|
||||
spin_unlock(&swap_lock);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user