diff --git a/patches.suse/dm-crypt-avoid-accessing-uninitialized-tasklet-d9a0.patch b/patches.suse/dm-crypt-avoid-accessing-uninitialized-tasklet-d9a0.patch new file mode 100644 index 0000000..ebc2929 --- /dev/null +++ b/patches.suse/dm-crypt-avoid-accessing-uninitialized-tasklet-d9a0.patch @@ -0,0 +1,86 @@ +From d9a02e016aaf5a57fb44e9a5e6da8ccd3b9e2e70 Mon Sep 17 00:00:00 2001 +From: Mike Snitzer +Date: Wed, 8 Mar 2023 14:39:54 -0500 +Subject: [PATCH] dm crypt: avoid accessing uninitialized tasklet +Git-commit: d9a02e016aaf5a57fb44e9a5e6da8ccd3b9e2e70 +Patch-mainline: v6.3-rc4 +References: git-fixes + +When neither "no_read_workqueue" nor "no_write_workqueue" are enabled, +tasklet_trylock() in crypt_dec_pending() may still return false due to +an uninitialized state, and dm-crypt will unnecessarily do io completion +in io_queue workqueue instead of current context. + +Fix this by adding an 'in_tasklet' flag to dm_crypt_io struct and +initialize it to false in crypt_io_init(). Set this flag to true in +kcryptd_queue_crypt() before calling tasklet_schedule(). If set +crypt_dec_pending() will punt io completion to a workqueue. + +This also nicely avoids the tasklet_trylock/unlock hack when tasklets +aren't in use. + +Fixes: 8e14f610159d ("dm crypt: do not call bio_endio() from the dm-crypt tasklet") +Cc: stable@vger.kernel.org +Reported-by: Hou Tao +Suggested-by: Ignat Korchagin +Reviewed-by: Ignat Korchagin +Signed-off-by: Mike Snitzer +Signed-off-by: Coly Li + +--- + drivers/md/dm-crypt.c | 15 +++++++++------ + 1 file changed, 9 insertions(+), 6 deletions(-) + +diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c +index faba1be572f9..2764b4ea18a3 100644 +--- a/drivers/md/dm-crypt.c ++++ b/drivers/md/dm-crypt.c +@@ -72,7 +72,9 @@ struct dm_crypt_io { + struct crypt_config *cc; + struct bio *base_bio; + u8 *integrity_metadata; +- bool integrity_metadata_from_pool; ++ bool integrity_metadata_from_pool:1; ++ bool in_tasklet:1; ++ + struct work_struct work; + struct tasklet_struct tasklet; + +@@ -1731,6 +1733,7 @@ static void crypt_io_init(struct dm_crypt_io *io, struct crypt_config *cc, + io->ctx.r.req = NULL; + io->integrity_metadata = NULL; + io->integrity_metadata_from_pool = false; ++ io->in_tasklet = false; + atomic_set(&io->io_pending, 0); + } + +@@ -1777,14 +1780,13 @@ static void crypt_dec_pending(struct dm_crypt_io *io) + * our tasklet. In this case we need to delay bio_endio() + * execution to after the tasklet is done and dequeued. + */ +- if (tasklet_trylock(&io->tasklet)) { +- tasklet_unlock(&io->tasklet); +- bio_endio(base_bio); ++ if (io->in_tasklet) { ++ INIT_WORK(&io->work, kcryptd_io_bio_endio); ++ queue_work(cc->io_queue, &io->work); + return; + } + +- INIT_WORK(&io->work, kcryptd_io_bio_endio); +- queue_work(cc->io_queue, &io->work); ++ bio_endio(base_bio); + } + + /* +@@ -2233,6 +2235,7 @@ static void kcryptd_queue_crypt(struct dm_crypt_io *io) + * it is being executed with irqs disabled. + */ + if (in_hardirq() || irqs_disabled()) { ++ io->in_tasklet = true; + tasklet_init(&io->tasklet, kcryptd_crypt_tasklet, (unsigned long)&io->work); + tasklet_schedule(&io->tasklet); + return; +-- +2.35.3 + diff --git a/series.conf b/series.conf index 3caf8ba..3aa9b06 100644 --- a/series.conf +++ b/series.conf @@ -40906,6 +40906,7 @@ patches.suse/nvme-send-Identify-with-CNS-06h-only-to-I-O-controll.patch patches.suse/dm-thin-fix-deadlock-when-swapping-to-thin-device-9bbf.patch patches.suse/dm-crypt-add-cond_resched-to-dmcrypt_write-fb29.patch + patches.suse/dm-crypt-avoid-accessing-uninitialized-tasklet-d9a0.patch patches.suse/drm-panel-orientation-quirks-Add-quirk-for-Lenovo-Yo.patch patches.suse/drm-meson-fix-missing-component-unbind-on-bind-error.patch patches.suse/drm-bridge-lt8912b-return-EPROBE_DEFER-if-bridge-is-.patch