dm integrity: clear the journal on suspend
[ Upstream commit 984bf2cc531e778e49298fdf6730e0396166aa21 ] There was a problem that a user burned a dm-integrity image on CDROM and could not activate it because it had a non-empty journal. Fix this problem by flushing the journal (done by the previous commit) and clearing the journal (done by this commit). Once the journal is cleared, dm-integrity won't attempt to replay it on the next activation. Signed-off-by: Mikulas Patocka <mpatocka@redhat.com> Signed-off-by: Mike Snitzer <snitzer@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
d306f73079
commit
64b7f9a7dd
@ -254,6 +254,7 @@ struct dm_integrity_c {
|
||||
|
||||
struct completion crypto_backoff;
|
||||
|
||||
bool wrote_to_journal;
|
||||
bool journal_uptodate;
|
||||
bool just_formatted;
|
||||
bool recalculate_flag;
|
||||
@ -2256,6 +2257,8 @@ static void integrity_commit(struct work_struct *w)
|
||||
if (!commit_sections)
|
||||
goto release_flush_bios;
|
||||
|
||||
ic->wrote_to_journal = true;
|
||||
|
||||
i = commit_start;
|
||||
for (n = 0; n < commit_sections; n++) {
|
||||
for (j = 0; j < ic->journal_section_entries; j++) {
|
||||
@ -2979,6 +2982,14 @@ static void dm_integrity_postsuspend(struct dm_target *ti)
|
||||
queue_work(ic->writer_wq, &ic->writer_work);
|
||||
drain_workqueue(ic->writer_wq);
|
||||
dm_integrity_flush_buffers(ic, true);
|
||||
if (ic->wrote_to_journal) {
|
||||
init_journal(ic, ic->free_section,
|
||||
ic->journal_sections - ic->free_section, ic->commit_seq);
|
||||
if (ic->free_section) {
|
||||
init_journal(ic, 0, ic->free_section,
|
||||
next_commit_seq(ic->commit_seq));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (ic->mode == 'B') {
|
||||
@ -3006,6 +3017,8 @@ static void dm_integrity_resume(struct dm_target *ti)
|
||||
|
||||
DEBUG_print("resume\n");
|
||||
|
||||
ic->wrote_to_journal = false;
|
||||
|
||||
if (ic->provided_data_sectors != old_provided_data_sectors) {
|
||||
if (ic->provided_data_sectors > old_provided_data_sectors &&
|
||||
ic->mode == 'B' &&
|
||||
|
Loading…
Reference in New Issue
Block a user