summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorManuel Bentele2019-08-07 23:53:30 +0200
committerManuel Bentele2019-08-21 22:03:59 +0200
commit318eaaaf40b2b48791de159d0a3813666e265be2 (patch)
treedaf87ee9164084ce01ef6ecbd5301d10f76ce92a
parentblock: loop: file_fmt_qcow: increment read position for each bvec (diff)
downloadkernel-qcow2-linux-318eaaaf40b2b48791de159d0a3813666e265be2.tar.gz
kernel-qcow2-linux-318eaaaf40b2b48791de159d0a3813666e265be2.tar.xz
kernel-qcow2-linux-318eaaaf40b2b48791de159d0a3813666e265be2.zip
block: loop: file_fmt_qcow: fix offset during the read of a cache miss
The wrong offset after reading the missing QCOW2 L2 table from the disk file format is saved in the metadata of the QCOW2 cache. This patch fixes the wrong metadata by saving the correct offset of the loaded L2 cache table. Signed-off-by: Manuel Bentele <development@manuel-bentele.de>
-rw-r--r--drivers/block/loop/loop_file_fmt_qcow_cache.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/block/loop/loop_file_fmt_qcow_cache.c b/drivers/block/loop/loop_file_fmt_qcow_cache.c
index 658c8582ef56..7d3af7398f04 100644
--- a/drivers/block/loop/loop_file_fmt_qcow_cache.c
+++ b/drivers/block/loop/loop_file_fmt_qcow_cache.c
@@ -124,6 +124,7 @@ static int __loop_file_fmt_qcow_cache_do_get(struct loop_file_fmt *lo_fmt,
int lookup_index;
u64 min_lru_counter = U64_MAX;
int min_lru_index = -1;
+ u64 read_offset;
size_t len;
ASSERT(offset != 0);
@@ -170,9 +171,10 @@ static int __loop_file_fmt_qcow_cache_do_get(struct loop_file_fmt *lo_fmt,
c->entries[i].offset = 0;
if (read_from_disk) {
+ read_offset = offset;
len = kernel_read(lo->lo_backing_file,
__loop_file_fmt_qcow_cache_get_table_addr(c, i),
- c->table_size, &offset);
+ c->table_size, &read_offset);
if (len < 0) {
len = ret;
return ret;