Add repin_hibernation_swap_type(), which looks up the new device, clears the old SWP_HIBERNATION flag and sets the new one under a single swap_lock acquisition. The same-device case is short- circuited so userspace can re-select the same swap area without tripping WARN_ON_ONCE and -EBUSY. Switch snapshot_set_swap_area() to the new helper.
A failed lookup now preserves the previous pin instead of dropping it, so a bad SNAPSHOT_SET_SWAP_AREA leaves the prior selection intact. The open and release paths keep using pin_hibernation_swap_type() and unpin_hibernation_swap_type(). The race was identified during AI-assisted review of the SWP_HIBERNATION pinning series. SJ Park (7): mm/damon/core: introduce damos_quota_goal->complement mm/damon/core: add complement argument to damos_new_quota_goal() mm/damon/sysfs-schemes: support quota goal complement flag mm/damon/tests/core-kunit: test quota_goal->complement commit Docs/mm/damon/design: document damos quota goal complement flag Docs/admin-guide/mm/damon/usage: update for quota goal complement file Docs/ABI/damon: update for quota goal metric complement sysfs file .../ABI/testing/sysfs-kernel-mm-damon | 6 ++++ Documentation/admin-guide/mm/damon/usage.rst | 15 +++++---- Documentation/mm/damon/design.rst | 15 ++++++--- include/linux/damon.h | 4 ++- mm/damon/core.c | 33 ++++++++++++++++--- mm/damon/lru_sort.c | 5 +-- mm/damon/reclaim.c | 5 +-- mm/damon/sysfs-schemes.c | 30 +++++++++++++++++ mm/damon/tests/core-kunit.h | 3 ++ samples/damon/mtier.c | 2 +- 10 files changed, 97 insertions(+), 21 deletions(-) base-commit: 1c2b8d2725f84b43fabe3b3e9628c91db8ca6c65 -- 2.47.3

