freezer: restructure __refrigerator()
authorTejun Heo <tj@kernel.org>
Mon, 21 Nov 2011 20:32:26 +0000 (12:32 -0800)
committerTejun Heo <tj@kernel.org>
Mon, 21 Nov 2011 20:32:26 +0000 (12:32 -0800)
commit5ece3eae4cdb968c269e0bc7e2c0e2b223552025
tree8e38ac6fc88864eff7fbbe3fa3671a4b76cfd8e9
parent96ee6d8539c9fc6742908d85eb9723abb5c91854
freezer: restructure __refrigerator()

If another freeze happens before all tasks leave FROZEN state after
being thawed, the freezer can see the existing FROZEN and consider the
tasks to be frozen but they can clear FROZEN without checking the new
freezing().

Oleg suggested restructuring __refrigerator() such that there's single
condition check section inside freezer_lock and sigpending is cleared
afterwards, which fixes the problem and simplifies the code.
Restructure accordingly.

-v2: Frozen loop exited without releasing freezer_lock.  Fixed.

Signed-off-by: Tejun Heo <tj@kernel.org>
Reported-by: Oleg Nesterov <oleg@redhat.com>
Acked-by: Oleg Nesterov <oleg@redhat.com>
Cc: "Rafael J. Wysocki" <rjw@sisk.pl>
kernel/freezer.c