Mikulas Patocka adc0daad36 dm: report suspended device during destroy
The function dm_suspended returns true if the target is suspended.
However, when the target is being suspended during unload, it returns
false.

An example where this is a problem: the test "!dm_suspended(wc->ti)" in
writecache_writeback is not sufficient, because dm_suspended returns
zero while writecache_suspend is in progress.  As is, without an
enhanced dm_suspended, simply switching from flush_workqueue to
drain_workqueue still emits warnings:
workqueue writecache-writeback: drain_workqueue() isn't complete after 10 tries
workqueue writecache-writeback: drain_workqueue() isn't complete after 100 tries
workqueue writecache-writeback: drain_workqueue() isn't complete after 200 tries
workqueue writecache-writeback: drain_workqueue() isn't complete after 300 tries
workqueue writecache-writeback: drain_workqueue() isn't complete after 400 tries

writecache_suspend calls flush_workqueue(wc->writeback_wq) - this function
flushes the current work. However, the workqueue may re-queue itself and
flush_workqueue doesn't wait for re-queued works to finish. Because of
this - the function writecache_writeback continues execution after the
device was suspended and then concurrently with writecache_dtr, causing
a crash in writecache_writeback.

We must use drain_workqueue - that waits until the work and all re-queued
works finish.

As a prereq for switching to drain_workqueue, this commit fixes
dm_suspended to return true after the presuspend hook and before the
postsuspend hook - just like during a normal suspend. It allows
simplifying the dm-integrity and dm-writecache targets so that they
don't have to maintain suspended flags on their own.

With this change use of drain_workqueue() can be used effectively.  This
change was tested with the lvm2 testsuite and cryptsetup testsuite and
the are no regressions.

Fixes: 48debafe4f2f ("dm: add writecache target")
Cc: stable@vger.kernel.org # 4.18+
Reported-by: Corey Marthaler <cmarthal@redhat.com>
Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
2020-02-27 16:40:58 -05:00
..
2020-01-03 12:11:30 -08:00
2019-12-01 18:43:25 -08:00
2019-12-27 11:02:48 -08:00
2019-12-10 23:15:09 +01:00
2019-12-15 14:58:13 -08:00
2019-12-20 10:42:25 -08:00
2019-11-30 14:35:43 -08:00
2019-12-01 18:42:02 -08:00
2020-01-04 10:41:08 -08:00
2019-12-06 08:28:51 -08:00
2019-12-03 13:58:22 -08:00
2019-12-03 14:37:12 -08:00
2019-12-21 06:17:05 -08:00
2019-12-03 14:09:14 -08:00
2019-12-01 18:43:25 -08:00
2019-12-13 14:27:19 -08:00
2019-12-05 11:43:31 -08:00
2019-11-25 19:40:40 -08:00
2019-12-05 11:43:31 -08:00
2020-01-04 14:16:57 -08:00
2019-12-05 11:28:14 -08:00
2019-12-17 13:08:41 -08:00
2019-12-01 18:39:24 -08:00
2019-12-03 13:31:08 -08:00
2019-12-27 17:28:41 -08:00
2019-12-17 13:06:31 -08:00
2020-01-04 10:41:08 -08:00
2019-12-27 17:28:41 -08:00
2019-12-05 13:18:54 -08:00
2019-12-07 14:51:04 -08:00
2019-12-03 13:58:22 -08:00
2019-11-14 13:06:33 +08:00
2019-12-01 18:01:03 -08:00
2019-12-21 06:24:56 -08:00