- Fix dm-raid transient device failure processing and other smaller
  tweaks.

- Add journal support to the DM raid target to close the 'write hole' on
  raid 4/5/6.

- Fix dm-cache corruption, due to rounding bug, when cache exceeds 2TB.

- Add 'metadata2' feature to dm-cache to separate the dirty bitset out
  from other cache metadata.  This improves speed of shutting down
  a large cache device (which implies writing out dirty bits).

- Fix a memory leak during dm-stats data structure destruction.

- Fix a DM multipath round-robin path selector performance regression
  that was caused by less precise balancing across all paths.

- Lastly, introduce a DM core fix for a long-standing DM snapshot
  deadlock that is rooted in the complexity of the device stack used in
  conjunction with block core maintaining bios on current->bio_list to
  manage recursion in generic_make_request().  A more comprehensive fix
  to block core (and its hook in the cpu scheduler) would be wonderful
  but this DM-specific fix is pragmatic considering how difficult it has
  been to make progress on a generic fix.
dm: flush queued bios when process blocks to avoid deadlock

Commit df2cb6daa4 ("block: Avoid deadlocks with bio allocation by
stacking drivers") created a workqueue for every bio set and code
in bio_alloc_bioset() that tries to resolve some low-memory deadlocks
by redirecting bios queued on current->bio_list to the workqueue if the
system is low on memory.  However other deadlocks (see below **) may
happen, without any low memory condition, because generic_make_request
is queuing bios to current->bio_list (rather than submitting them).

** the related dm-snapshot deadlock is detailed here:
https://www.redhat.com/archives/dm-devel/2016-July/msg00065.html

Fix this deadlock by redirecting any bios on current->bio_list to the
bio_set's rescue workqueue on every schedule() call.  Consequently,
when the process blocks on a mutex, the bios queued on
current->bio_list are dispatched to independent workqueus and they can
complete without waiting for the mutex to be available.

The structure blk_plug contains an entry cb_list and this list can contain
arbitrary callback functions that are called when the process blocks.
To implement this fix DM (ab)uses the onstack plug's cb_list interface
to get its flush_current_bio_list() called at schedule() time.

This fixes the snapshot deadlock - if the map method blocks,
flush_current_bio_list() will be called and it redirects bios waiting
on current->bio_list to appropriate workqueues.

Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1267650
Depends-on: df2cb6daa4 ("block: Avoid deadlocks with bio allocation by stacking drivers")
Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
1 file changed