diff options
author | Alex Elder <elder@inktank.com> | 2013-05-22 20:54:25 -0500 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-07-03 15:32:37 -0700 |
commit | e215605417b87732c6debf65da6d953016a1e5bc (patch) | |
tree | 7dac549a47e7263d68d7351d38cebb7b3a861e35 /drivers/block/rbd.c | |
parent | 96e4dac66f69d28af2b736e723364efbbdf9fdee (diff) | |
download | lwn-e215605417b87732c6debf65da6d953016a1e5bc.tar.gz lwn-e215605417b87732c6debf65da6d953016a1e5bc.zip |
rbd: flush dcache after zeroing page data
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>
Diffstat (limited to 'drivers/block/rbd.c')
-rw-r--r-- | drivers/block/rbd.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index 291802c52c65..cb728a01a19f 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c @@ -1126,6 +1126,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; @@ -1158,6 +1159,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); |