]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
rbd: flush dcache after zeroing page data
authorAlex Elder <elder@inktank.com>
Thu, 23 May 2013 01:54:25 +0000 (20:54 -0500)
committerSage Weil <sage@inktank.com>
Thu, 13 Jun 2013 15:46:21 +0000 (08:46 -0700)
Neither zero_bio_chain() nor zero_pages() contains a call to flush
caches after zeroing a portion of a page.  This can cause problems
on architectures that have caches that allow virtual address
aliasing.

This resolves:
    http://tracker.ceph.com/issues/4777

Signed-off-by: Alex Elder <elder@inktank.com>
Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
drivers/block/rbd.c

index c9486c8913d5eefa87ee96b45866a7a22c82b3ab..e975b36e1feabe18b3a0db7961a929f0672f1c68 100644 (file)
@@ -1128,6 +1128,7 @@ static void zero_bio_chain(struct bio *chain, int start_ofs)
                                buf = bvec_kmap_irq(bv, &flags);
                                memset(buf + remainder, 0,
                                       bv->bv_len - remainder);
+                               flush_dcache_page(bv->bv_page);
                                bvec_kunmap_irq(buf, &flags);
                        }
                        pos += bv->bv_len;
@@ -1160,6 +1161,7 @@ static void zero_pages(struct page **pages, u64 offset, u64 end)
                local_irq_save(flags);
                kaddr = kmap_atomic(*page);
                memset(kaddr + page_offset, 0, length);
+               flush_dcache_page(*page);
                kunmap_atomic(kaddr);
                local_irq_restore(flags);