kcryptd_crypt_read_convert() can be invoked from atomic context (softirq/tasklet) and preemptible context (the workqueue). Add an argument `atomic' to kcryptd_crypt_read_convert(). This argument can be passed to crypt_convert() replacing the test for DM_CRYPT_NO_READ_WORKQUEUE. Signed-off-by: Sebastian Andrzej Siewior <bigeasy@xxxxxxxxxxxxx> --- drivers/md/dm-crypt.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c index a498de3604a67..f5eafc32d32c5 100644 --- a/drivers/md/dm-crypt.c +++ b/drivers/md/dm-crypt.c @@ -2120,7 +2120,7 @@ static void kcryptd_crypt_read_continue(struct work_struct *work) crypt_dec_pending(io); } -static void kcryptd_crypt_read_convert(struct dm_crypt_io *io) +static void kcryptd_crypt_read_convert(struct dm_crypt_io *io, bool atomic) { struct crypt_config *cc = io->cc; blk_status_t r; @@ -2130,8 +2130,7 @@ static void kcryptd_crypt_read_convert(struct dm_crypt_io *io) crypt_convert_init(cc, &io->ctx, io->base_bio, io->base_bio, io->sector); - r = crypt_convert(cc, &io->ctx, - test_bit(DM_CRYPT_NO_READ_WORKQUEUE, &cc->flags), true); + r = crypt_convert(cc, &io->ctx, atomic, true); /* * Crypto API backlogged the request, because its queue was full * and we're in softirq context, so continue from a workqueue @@ -2206,7 +2205,7 @@ static void kcryptd_crypt(struct work_struct *work) struct dm_crypt_io *io = container_of(work, struct dm_crypt_io, work); if (bio_data_dir(io->base_bio) == READ) - kcryptd_crypt_read_convert(io); + kcryptd_crypt_read_convert(io, false); else kcryptd_crypt_write_convert(io); } @@ -2215,7 +2214,7 @@ static void kcryptd_crypt_tasklet(struct tasklet_struct *t) { struct dm_crypt_io *io = from_tasklet(io, t, tasklet); - kcryptd_crypt_read_convert(io); + kcryptd_crypt_read_convert(io, true); } static void kcryptd_queue_crypt(struct dm_crypt_io *io) -- 2.30.0 -- dm-devel mailing list dm-devel@xxxxxxxxxx https://listman.redhat.com/mailman/listinfo/dm-devel