ceph: Avoid data inconsistency due to d-cache aliasing in readpage()
authorLi Wang <liwang@ubuntukylin.com>
Wed, 13 Nov 2013 07:22:14 +0000 (15:22 +0800)
committerSage Weil <sage@inktank.com>
Fri, 13 Dec 2013 17:11:38 +0000 (09:11 -0800)
If the length of data to be read in readpage() is exactly
PAGE_CACHE_SIZE, the original code does not flush d-cache
for data consistency after finishing reading. This patches fixes
this.

Signed-off-by: Li Wang <liwang@ubuntukylin.com>
Signed-off-by: Sage Weil <sage@inktank.com>
fs/ceph/addr.c

index 1e561c059539542e83a118edb003ffabca08506b..ec3ba43b9faae73fba6d6352da9515a812ec9f36 100644 (file)
@@ -210,9 +210,13 @@ static int readpage_nounlock(struct file *filp, struct page *page)
        if (err < 0) {
                SetPageError(page);
                goto out;
-       } else if (err < PAGE_CACHE_SIZE) {
+       } else {
+               if (err < PAGE_CACHE_SIZE) {
                /* zero fill remainder of page */
-               zero_user_segment(page, err, PAGE_CACHE_SIZE);
+                       zero_user_segment(page, err, PAGE_CACHE_SIZE);
+               } else {
+                       flush_dcache_page(page);
+               }
        }
        SetPageUptodate(page);