diff options
author | Alex Elder <elder@inktank.com> | 2013-05-22 21:54:25 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2014-01-09 15:24:24 -0500 |
commit | 350505e73f8c4d03dfef660f40a6f35d5ac12be6 (patch) | |
tree | e2febd71b68d16885ec2e9e3cb6f93f81c7cd745 | |
parent | 1d02ec7ffd7577d07c91d2cbb391386d9a129fda (diff) |
rbd: flush dcache after zeroing page data
commit e215605417b87732c6debf65da6d953016a1e5bc upstream.
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>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-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 8c7421af8f15..ccd3553a0474 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) | |||
1126 | buf = bvec_kmap_irq(bv, &flags); | 1126 | buf = bvec_kmap_irq(bv, &flags); |
1127 | memset(buf + remainder, 0, | 1127 | memset(buf + remainder, 0, |
1128 | bv->bv_len - remainder); | 1128 | bv->bv_len - remainder); |
1129 | flush_dcache_page(bv->bv_page); | ||
1129 | bvec_kunmap_irq(buf, &flags); | 1130 | bvec_kunmap_irq(buf, &flags); |
1130 | } | 1131 | } |
1131 | pos += bv->bv_len; | 1132 | pos += bv->bv_len; |
@@ -1158,6 +1159,7 @@ static void zero_pages(struct page **pages, u64 offset, u64 end) | |||
1158 | local_irq_save(flags); | 1159 | local_irq_save(flags); |
1159 | kaddr = kmap_atomic(*page); | 1160 | kaddr = kmap_atomic(*page); |
1160 | memset(kaddr + page_offset, 0, length); | 1161 | memset(kaddr + page_offset, 0, length); |
1162 | flush_dcache_page(*page); | ||
1161 | kunmap_atomic(kaddr); | 1163 | kunmap_atomic(kaddr); |
1162 | local_irq_restore(flags); | 1164 | local_irq_restore(flags); |
1163 | 1165 | ||