From c3c0acfe762cf6144960423394fceebd6598e696 Mon Sep 17 00:00:00 2001 From: Tikhomirov Pavel Date: Fri, 24 Jan 2014 15:50:24 +0400 Subject: [PATCH] deduplication: make seek_pagemap_page properly handle eof because eof in restore means that we don't have "must have" data, so it mean error exit, but in dedup, it's ok not to have data we seek, so we continue returning normally also it's used that if off < pr-cvaddr then no eof happened and if eof happened then off >= pr-cvaddr(then return of seek_pagemap_page is 0) Signed-off-by: Tikhomirov Pavel Signed-off-by: Pavel Emelyanov --- cr-dedup.c | 16 ++++++++-------- page-read.c | 10 +++++----- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/cr-dedup.c b/cr-dedup.c index d407974ea..b3b672114 100644 --- a/cr-dedup.c +++ b/cr-dedup.c @@ -114,14 +114,14 @@ int dedup_one_iovec(struct page_read *pr, struct iovec *iov) struct iovec piov; unsigned long piov_end; ret = seek_pagemap_page(pr, off, false); - if (ret == -1) { - if (off < pr->cvaddr) { - if (pr->cvaddr < iov_end) - off = pr->cvaddr; - else - return 0; - } else - return ret; + if (ret == -1) + return -1; + + if (ret == 0) { + if (off < pr->cvaddr && pr->cvaddr < iov_end) + off = pr->cvaddr; + else + return 0; } if (!pr->pe) diff --git a/page-read.c b/page-read.c index 1e22256b5..a499b2aff 100644 --- a/page-read.c +++ b/page-read.c @@ -105,7 +105,7 @@ int seek_pagemap_page(struct page_read *pr, unsigned long vaddr, bool warn) if (warn) pr_err("Missing %lu in parent pagemap, current iov: base=%lx,len=%zu\n", vaddr, (unsigned long)iov.iov_base, iov.iov_len); - return -1; + return 0; } iov_end = (unsigned long)iov.iov_base + iov.iov_len; @@ -115,13 +115,13 @@ int seek_pagemap_page(struct page_read *pr, unsigned long vaddr, bool warn) new_pagemap: ret = get_pagemap(pr, &iov); if (ret <= 0) - return -1; + return ret; continue; } skip_pagemap_pages(pr, vaddr - pr->cvaddr); - return 0; + return 1; } } @@ -132,8 +132,8 @@ static int read_pagemap_page(struct page_read *pr, unsigned long vaddr, void *bu if (pr->pe->in_parent) { pr_debug("\tpr%u Read page %lx from parent\n", pr->id, vaddr); ret = seek_pagemap_page(pr->parent, vaddr, true); - if (ret == -1) - return ret; + if (ret <= 0) + return -1; ret = read_pagemap_page(pr->parent, vaddr, buf); if (ret == -1) return ret;