dm vdo indexer-volume: fix missing mutex_lock in process_entry
authorMike Snitzer <snitzer@kernel.org>
Sun, 11 Feb 2024 19:49:42 +0000 (14:49 -0500)
committerMike Snitzer <snitzer@kernel.org>
Mon, 4 Mar 2024 20:07:55 +0000 (15:07 -0500)
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>
drivers/md/dm-vdo/volume.c

index 37c2ef0777e5d5e52cb2e80bb2671315f71cd824..60416dc8a9d70f34de695873c13ebcc1d89763b0 100644 (file)
@@ -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);