Skip to content

Commit 5556a78

Browse files
committed
Merge tag 'for-6.1/dm-fixes-2' of git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm
Pull device mapper fixes from Mike Snitzer: - Fix misbehavior if list_versions DM ioctl races with module loading - Fix missing decrement of no_sleep_enabled if dm_bufio_client_create failed - Allow DM integrity devices to be activated in read-only mode * tag 'for-6.1/dm-fixes-2' of git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm: dm integrity: clear the journal on suspend dm integrity: flush the journal on suspend dm bufio: Fix missing decrement of no_sleep_enabled if dm_bufio_client_create failed dm ioctl: fix misbehavior if list_versions races with module loading
2 parents 950a9f5 + 984bf2c commit 5556a78

File tree

3 files changed

+18
-8
lines changed

3 files changed

+18
-8
lines changed

drivers/md/dm-bufio.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1858,6 +1858,8 @@ struct dm_bufio_client *dm_bufio_client_create(struct block_device *bdev, unsign
18581858
dm_io_client_destroy(c->dm_io);
18591859
bad_dm_io:
18601860
mutex_destroy(&c->lock);
1861+
if (c->no_sleep)
1862+
static_branch_dec(&no_sleep_enabled);
18611863
kfree(c);
18621864
bad_client:
18631865
return ERR_PTR(r);

drivers/md/dm-integrity.c

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,7 @@ struct dm_integrity_c {
263263

264264
struct completion crypto_backoff;
265265

266+
bool wrote_to_journal;
266267
bool journal_uptodate;
267268
bool just_formatted;
268269
bool recalculate_flag;
@@ -2375,6 +2376,8 @@ static void integrity_commit(struct work_struct *w)
23752376
if (!commit_sections)
23762377
goto release_flush_bios;
23772378

2379+
ic->wrote_to_journal = true;
2380+
23782381
i = commit_start;
23792382
for (n = 0; n < commit_sections; n++) {
23802383
for (j = 0; j < ic->journal_section_entries; j++) {
@@ -2591,10 +2594,6 @@ static void integrity_writer(struct work_struct *w)
25912594

25922595
unsigned prev_free_sectors;
25932596

2594-
/* the following test is not needed, but it tests the replay code */
2595-
if (unlikely(dm_post_suspending(ic->ti)) && !ic->meta_dev)
2596-
return;
2597-
25982597
spin_lock_irq(&ic->endio_wait.lock);
25992598
write_start = ic->committed_section;
26002599
write_sections = ic->n_committed_sections;
@@ -3101,10 +3100,17 @@ static void dm_integrity_postsuspend(struct dm_target *ti)
31013100
drain_workqueue(ic->commit_wq);
31023101

31033102
if (ic->mode == 'J') {
3104-
if (ic->meta_dev)
3105-
queue_work(ic->writer_wq, &ic->writer_work);
3103+
queue_work(ic->writer_wq, &ic->writer_work);
31063104
drain_workqueue(ic->writer_wq);
31073105
dm_integrity_flush_buffers(ic, true);
3106+
if (ic->wrote_to_journal) {
3107+
init_journal(ic, ic->free_section,
3108+
ic->journal_sections - ic->free_section, ic->commit_seq);
3109+
if (ic->free_section) {
3110+
init_journal(ic, 0, ic->free_section,
3111+
next_commit_seq(ic->commit_seq));
3112+
}
3113+
}
31083114
}
31093115

31103116
if (ic->mode == 'B') {
@@ -3132,6 +3138,8 @@ static void dm_integrity_resume(struct dm_target *ti)
31323138

31333139
DEBUG_print("resume\n");
31343140

3141+
ic->wrote_to_journal = false;
3142+
31353143
if (ic->provided_data_sectors != old_provided_data_sectors) {
31363144
if (ic->provided_data_sectors > old_provided_data_sectors &&
31373145
ic->mode == 'B' &&

drivers/md/dm-ioctl.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -655,7 +655,7 @@ static void list_version_get_needed(struct target_type *tt, void *needed_param)
655655
size_t *needed = needed_param;
656656

657657
*needed += sizeof(struct dm_target_versions);
658-
*needed += strlen(tt->name);
658+
*needed += strlen(tt->name) + 1;
659659
*needed += ALIGN_MASK;
660660
}
661661

@@ -720,7 +720,7 @@ static int __list_versions(struct dm_ioctl *param, size_t param_size, const char
720720
iter_info.old_vers = NULL;
721721
iter_info.vers = vers;
722722
iter_info.flags = 0;
723-
iter_info.end = (char *)vers+len;
723+
iter_info.end = (char *)vers + needed;
724724

725725
/*
726726
* Now loop through filling out the names & versions.

0 commit comments

Comments
 (0)