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>
This commit is contained in:
Mike Snitzer 2024-02-11 14:49:42 -05:00
parent b259c1a60c
commit 444d3f0bfd

View file

@ -556,6 +556,7 @@ static int process_entry(struct volume *volume, struct queued_read *entry)
mutex_unlock(&volume->read_threads_mutex); mutex_unlock(&volume->read_threads_mutex);
page_data = dm_bufio_read(volume->client, page_number, &page->buffer); page_data = dm_bufio_read(volume->client, page_number, &page->buffer);
mutex_lock(&volume->read_threads_mutex);
if (IS_ERR(page_data)) { if (IS_ERR(page_data)) {
result = -PTR_ERR(page_data); result = -PTR_ERR(page_data);
uds_log_warning_strerror(result, 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); cancel_page_in_cache(&volume->page_cache, page_number, page);
return result; return result;
} }
mutex_lock(&volume->read_threads_mutex);
if (entry->invalid) { if (entry->invalid) {
uds_log_warning("Page %u invalidated after read", page_number); uds_log_warning("Page %u invalidated after read", page_number);