dm integrity: improve discard in journal mode
When we discard something that is present in the journal, we flush the journal first, so that discarded blocks are not overwritten by the journal content. Signed-off-by: Mikulas Patocka <mpatocka@redhat.com> Signed-off-by: Mike Snitzer <snitzer@redhat.com>
This commit is contained in:
parent
84597a44a9
commit
31843edab7
@ -1943,6 +1943,7 @@ static void dm_integrity_map_continue(struct dm_integrity_io *dio, bool from_map
|
||||
unsigned journal_section, journal_entry;
|
||||
unsigned journal_read_pos;
|
||||
struct completion read_comp;
|
||||
bool discard_retried = false;
|
||||
bool need_sync_io = ic->internal_hash && dio->op == REQ_OP_READ;
|
||||
if (unlikely(dio->op == REQ_OP_DISCARD) && ic->mode != 'D')
|
||||
need_sync_io = true;
|
||||
@ -2059,6 +2060,21 @@ offload_to_thread:
|
||||
}
|
||||
}
|
||||
}
|
||||
if (ic->mode == 'J' && likely(dio->op == REQ_OP_DISCARD) && !discard_retried) {
|
||||
sector_t next_sector;
|
||||
unsigned new_pos = find_journal_node(ic, dio->range.logical_sector, &next_sector);
|
||||
if (unlikely(new_pos != NOT_FOUND) ||
|
||||
unlikely(next_sector < dio->range.logical_sector - dio->range.n_sectors)) {
|
||||
remove_range_unlocked(ic, &dio->range);
|
||||
spin_unlock_irq(&ic->endio_wait.lock);
|
||||
queue_work(ic->commit_wq, &ic->commit_work);
|
||||
flush_workqueue(ic->commit_wq);
|
||||
queue_work(ic->writer_wq, &ic->writer_work);
|
||||
flush_workqueue(ic->writer_wq);
|
||||
discard_retried = true;
|
||||
goto lock_retry;
|
||||
}
|
||||
}
|
||||
spin_unlock_irq(&ic->endio_wait.lock);
|
||||
|
||||
if (unlikely(journal_read_pos != NOT_FOUND)) {
|
||||
|
Loading…
Reference in New Issue
Block a user