]> git.kernelconcepts.de Git - karo-tx-linux.git/commit
dm snapshot: suspend origin when doing exception handover
authorMikulas Patocka <mpatocka@redhat.com>
Thu, 26 Feb 2015 16:40:35 +0000 (11:40 -0500)
committerMike Snitzer <snitzer@redhat.com>
Fri, 27 Feb 2015 19:49:47 +0000 (14:49 -0500)
commitb735fede8d957d9d255e9c5cf3964cfa59799637
treedc09f6c9db8d21128e1c5f793460eaaf5450c406
parentab7c7bb6f4ab95dbca96fcfc4463cd69843e3e24
dm snapshot: suspend origin when doing exception handover

In the function snapshot_resume we perform exception store handover.  If
there is another active snapshot target, the exception store is moved
from this target to the target that is being resumed.

The problem is that if there is some pending exception, it will point to
an incorrect exception store after that handover, causing a crash due to
dm-snap-persistent.c:get_exception()'s BUG_ON.

This bug can be triggered by repeatedly changing snapshot permissions
with "lvchange -p r" and "lvchange -p rw" while there are writes on the
associated origin device.

To fix this bug, we must suspend the origin device when doing the
exception store handover to make sure that there are no pending
exceptions:
- introduce _origin_hash that keeps track of dm_origin structures.
- introduce functions __lookup_dm_origin, __insert_dm_origin and
  __remove_dm_origin that manipulate the origin hash.
- modify snapshot_resume so that it calls dm_internal_suspend_fast() and
  dm_internal_resume_fast() on the origin device.

NOTE to stable@ people:

When backporting to kernels 3.12-3.18, use dm_internal_suspend and
dm_internal_resume instead of dm_internal_suspend_fast and
dm_internal_resume_fast.

When backporting to kernels older than 3.12, you need to pick functions
dm_internal_suspend and dm_internal_resume from the commit
fd2ed4d252701d3bbed4cd3e3d267ad469bb832a.

Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Cc: stable@vger.kernel.org
drivers/md/dm-snap.c
drivers/md/dm.c