summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Snitzer <snitzer@kernel.org>2024-02-11 22:49:42 +0300
committerMike Snitzer <snitzer@kernel.org>2024-03-04 23:07:55 +0300
commit444d3f0bfd436cf28348a0a20d0b8ad0cdbb8be3 (patch)
treec855e538d058619d5636261d99f3d176f74dda8f
parentb259c1a60c379ad73d673d329892c7dc36313656 (diff)
downloadlinux-444d3f0bfd436cf28348a0a20d0b8ad0cdbb8be3.tar.xz
dm vdo indexer-volume: fix missing mutex_lock in process_entry
Must mutex_lock after dm_bufio_read, before dm_bufio_read error handling, otherwise process_entry error path will return without volume->read_threads_mutex held. This fixes potential double mutex_unlock. Reported-by: Dan Carpenter <dan.carpenter@linaro.org> Signed-off-by: Mike Snitzer <snitzer@kernel.org> Signed-off-by: Susan LeGendre-McGhee <slegendr@redhat.com> Signed-off-by: Matthew Sakai <msakai@redhat.com>
-rw-r--r--drivers/md/dm-vdo/volume.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/md/dm-vdo/volume.c b/drivers/md/dm-vdo/volume.c
index 37c2ef0777e5..60416dc8a9d7 100644
--- a/drivers/md/dm-vdo/volume.c
+++ b/drivers/md/dm-vdo/volume.c
@@ -556,6 +556,7 @@ static int process_entry(struct volume *volume, struct queued_read *entry)
mutex_unlock(&volume->read_threads_mutex);
page_data = dm_bufio_read(volume->client, page_number, &page->buffer);
+ mutex_lock(&volume->read_threads_mutex);
if (IS_ERR(page_data)) {
result = -PTR_ERR(page_data);
uds_log_warning_strerror(result,
@@ -564,7 +565,6 @@ static int process_entry(struct volume *volume, struct queued_read *entry)
cancel_page_in_cache(&volume->page_cache, page_number, page);
return result;
}
- mutex_lock(&volume->read_threads_mutex);
if (entry->invalid) {
uds_log_warning("Page %u invalidated after read", page_number);