Commit 0a7a93d9 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'dm-6.7/dm-fixes-3' of...

Merge tag 'dm-6.7/dm-fixes-3' of git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm

Pull device mapper fixes from Mike Snitzer:

 - DM raid target (and MD raid) fix for reconfig_mutex MD deadlock that
   should have been merged along with recent v6.7-rc6 MD fixes (see MD
   related commits: f2d87a75^..b3911334)

 - DM integrity target fix to avoid modifying immutable biovec in the
   integrity_metadata() edge case where kmalloc fails.

 - Fix drivers/md/Kconfig so DM_AUDIT depends on BLK_DEV_DM.

 - Update DM entry in MAINTAINERS to remove stale info.

* tag 'dm-6.7/dm-fixes-3' of git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm:
  MAINTAINERS: remove stale info for DEVICE-MAPPER
  dm audit: fix Kconfig so DM_AUDIT depends on BLK_DEV_DM
  dm-integrity: don't modify bio's immutable bio_vec in integrity_metadata()
  dm-raid: delay flushing event_work() after reconfig_mutex is released
parents 55cb5f43 5d6f447b
...@@ -6050,10 +6050,8 @@ M: Mikulas Patocka <mpatocka@redhat.com> ...@@ -6050,10 +6050,8 @@ M: Mikulas Patocka <mpatocka@redhat.com>
M: dm-devel@lists.linux.dev M: dm-devel@lists.linux.dev
L: dm-devel@lists.linux.dev L: dm-devel@lists.linux.dev
S: Maintained S: Maintained
W: http://sources.redhat.com/dm
Q: http://patchwork.kernel.org/project/dm-devel/list/ Q: http://patchwork.kernel.org/project/dm-devel/list/
T: git git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm.git
T: quilt http://people.redhat.com/agk/patches/linux/editing/
F: Documentation/admin-guide/device-mapper/ F: Documentation/admin-guide/device-mapper/
F: drivers/md/Kconfig F: drivers/md/Kconfig
F: drivers/md/Makefile F: drivers/md/Makefile
......
...@@ -660,6 +660,7 @@ config DM_ZONED ...@@ -660,6 +660,7 @@ config DM_ZONED
config DM_AUDIT config DM_AUDIT
bool "DM audit events" bool "DM audit events"
depends on BLK_DEV_DM
depends on AUDIT depends on AUDIT
help help
Generate audit events for device-mapper. Generate audit events for device-mapper.
......
...@@ -1755,11 +1755,12 @@ static void integrity_metadata(struct work_struct *w) ...@@ -1755,11 +1755,12 @@ static void integrity_metadata(struct work_struct *w)
sectors_to_process = dio->range.n_sectors; sectors_to_process = dio->range.n_sectors;
__bio_for_each_segment(bv, bio, iter, dio->bio_details.bi_iter) { __bio_for_each_segment(bv, bio, iter, dio->bio_details.bi_iter) {
struct bio_vec bv_copy = bv;
unsigned int pos; unsigned int pos;
char *mem, *checksums_ptr; char *mem, *checksums_ptr;
again: again:
mem = bvec_kmap_local(&bv); mem = bvec_kmap_local(&bv_copy);
pos = 0; pos = 0;
checksums_ptr = checksums; checksums_ptr = checksums;
do { do {
...@@ -1768,7 +1769,7 @@ static void integrity_metadata(struct work_struct *w) ...@@ -1768,7 +1769,7 @@ static void integrity_metadata(struct work_struct *w)
sectors_to_process -= ic->sectors_per_block; sectors_to_process -= ic->sectors_per_block;
pos += ic->sectors_per_block << SECTOR_SHIFT; pos += ic->sectors_per_block << SECTOR_SHIFT;
sector += ic->sectors_per_block; sector += ic->sectors_per_block;
} while (pos < bv.bv_len && sectors_to_process && checksums != checksums_onstack); } while (pos < bv_copy.bv_len && sectors_to_process && checksums != checksums_onstack);
kunmap_local(mem); kunmap_local(mem);
r = dm_integrity_rw_tag(ic, checksums, &dio->metadata_block, &dio->metadata_offset, r = dm_integrity_rw_tag(ic, checksums, &dio->metadata_block, &dio->metadata_offset,
...@@ -1793,9 +1794,9 @@ static void integrity_metadata(struct work_struct *w) ...@@ -1793,9 +1794,9 @@ static void integrity_metadata(struct work_struct *w)
if (!sectors_to_process) if (!sectors_to_process)
break; break;
if (unlikely(pos < bv.bv_len)) { if (unlikely(pos < bv_copy.bv_len)) {
bv.bv_offset += pos; bv_copy.bv_offset += pos;
bv.bv_len -= pos; bv_copy.bv_len -= pos;
goto again; goto again;
} }
} }
......
...@@ -3317,6 +3317,9 @@ static void raid_dtr(struct dm_target *ti) ...@@ -3317,6 +3317,9 @@ static void raid_dtr(struct dm_target *ti)
mddev_lock_nointr(&rs->md); mddev_lock_nointr(&rs->md);
md_stop(&rs->md); md_stop(&rs->md);
mddev_unlock(&rs->md); mddev_unlock(&rs->md);
if (work_pending(&rs->md.event_work))
flush_work(&rs->md.event_work);
raid_set_free(rs); raid_set_free(rs);
} }
......
...@@ -82,6 +82,14 @@ static struct module *md_cluster_mod; ...@@ -82,6 +82,14 @@ static struct module *md_cluster_mod;
static DECLARE_WAIT_QUEUE_HEAD(resync_wait); static DECLARE_WAIT_QUEUE_HEAD(resync_wait);
static struct workqueue_struct *md_wq; static struct workqueue_struct *md_wq;
/*
* This workqueue is used for sync_work to register new sync_thread, and for
* del_work to remove rdev, and for event_work that is only set by dm-raid.
*
* Noted that sync_work will grab reconfig_mutex, hence never flush this
* workqueue whith reconfig_mutex grabbed.
*/
static struct workqueue_struct *md_misc_wq; static struct workqueue_struct *md_misc_wq;
struct workqueue_struct *md_bitmap_wq; struct workqueue_struct *md_bitmap_wq;
...@@ -6330,9 +6338,6 @@ static void __md_stop(struct mddev *mddev) ...@@ -6330,9 +6338,6 @@ static void __md_stop(struct mddev *mddev)
struct md_personality *pers = mddev->pers; struct md_personality *pers = mddev->pers;
md_bitmap_destroy(mddev); md_bitmap_destroy(mddev);
mddev_detach(mddev); mddev_detach(mddev);
/* Ensure ->event_work is done */
if (mddev->event_work.func)
flush_workqueue(md_misc_wq);
spin_lock(&mddev->lock); spin_lock(&mddev->lock);
mddev->pers = NULL; mddev->pers = NULL;
spin_unlock(&mddev->lock); spin_unlock(&mddev->lock);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment