ceph: Avoid data inconsistency due to d-cache aliasing in readpage()
authorLi Wang <[email protected]>
Wed, 13 Nov 2013 07:22:14 +0000 (15:22 +0800)
committerSage Weil <[email protected]>
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 <[email protected]>
Signed-off-by: Sage Weil <[email protected]>
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);