dm snapshot: suspend merging snapshot when doing exception handover
authorMikulas Patocka <mpatocka@redhat.com>
Thu, 26 Feb 2015 16:41:28 +0000 (11:41 -0500)
committerMike Snitzer <snitzer@redhat.com>
Fri, 27 Feb 2015 19:53:16 +0000 (14:53 -0500)
commit09ee96b21456883e108c3b00597bb37ec512151b
tree76127a2e0766158b04c2b764e9e23fcd49127ccc
parentb735fede8d957d9d255e9c5cf3964cfa59799637
dm snapshot: suspend merging snapshot when doing exception handover

The "dm snapshot: suspend origin when doing exception handover" commit
fixed a exception store handover bug associated with pending exceptions
to the "snapshot-origin" target.

However, a similar problem exists in snapshot merging.  When snapshot
merging is in progress, we use the target "snapshot-merge" instead of
"snapshot-origin".  Consequently, during exception store handover, we
must find the snapshot-merge target and suspend its associated
mapped_device.

To avoid lockdep warnings, the target must be suspended and resumed
without holding _origins_lock.

Introduce a dm_hold() function that grabs a reference on a
mapped_device, but unlike dm_get(), it doesn't crash if the device has
the DMF_FREEING flag set, it returns an error in this case.

In snapshot_resume() we grab the reference to the origin device using
dm_hold() while holding _origins_lock (_origins_lock guarantees that the
device won't disappear).  Then we release _origins_lock, suspend the
device and grab _origins_lock again.

NOTE to stable@ people:
When backporting to kernels 3.18 and older, use dm_internal_suspend and
dm_internal_resume instead of dm_internal_suspend_fast and
dm_internal_resume_fast.

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
include/linux/device-mapper.h