mm: clean up soft_offline_page()

Currently soft_offline_page() is hard to maintain because it has many
return points and goto statements. All of this mess come from get_any_page().
This function should only get page refcount as the name implies, but it does
some page isolating actions like SetPageHWPoison() and dequeuing hugepage.
This patch corrects it and introduces some internal subroutines to make
soft offlining code more readable and maintainable.

ChangeLog v2:
  - receive returned value from __soft_offline_page and soft_offline_huge_page
  - place __soft_offline_page after soft_offline_page to reduce the diff
  - rebased onto mmotm-2013-01-23-17-04
  - add comment on double checks of PageHWpoison

Signed-off-by: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>