With an external metadata device, flush requests aren't passed down to the data device. Fix this by issuing flush in the right places: In integrity_commit when not in journal mode, in do_journal_write after writing the contents of the journal to the disk and in dm_integrity_postsuspend. Signed-off-by: Lukas Straub --- drivers/md/dm-integrity.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/md/dm-integrity.c b/drivers/md/dm-integrity.c index 5a7a1b90e671..a26ed65869f6 100644 --- a/drivers/md/dm-integrity.c +++ b/drivers/md/dm-integrity.c @@ -2196,6 +2196,8 @@ static void integrity_commit(struct work_struct *w) if (unlikely(ic->mode != 'J')) { spin_unlock_irq(&ic->endio_wait.lock); dm_integrity_flush_buffers(ic); + if (ic->meta_dev) + blkdev_issue_flush(ic->dev->bdev, GFP_NOIO); goto release_flush_bios; } @@ -2410,6 +2412,9 @@ static void do_journal_write(struct dm_integrity_c *ic, unsigned write_start, wait_for_completion_io(&comp.comp); dm_integrity_flush_buffers(ic); + if (ic->meta_dev) + blkdev_issue_flush(ic->dev->bdev, GFP_NOIO); + } static void integrity_writer(struct work_struct *w) @@ -2949,6 +2954,9 @@ static void dm_integrity_postsuspend(struct dm_target *ti) #endif } + if (ic->meta_dev) + blkdev_issue_flush(ic->dev->bdev, GFP_NOIO); + BUG_ON(!RB_EMPTY_ROOT(&ic->in_progress)); ic->journal_uptodate = true; -- 2.20.1