dm integrity: improve discard in journal mode
authorMikulas Patocka <mpatocka@redhat.com>
Sun, 22 Mar 2020 19:42:27 +0000 (20:42 +0100)
committerMike Snitzer <snitzer@redhat.com>
Tue, 24 Mar 2020 17:09:49 +0000 (13:09 -0400)
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>
drivers/md/dm-integrity.c

index 21eb35c..b989d10 100644 (file)
@@ -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)) {