From 50ed824ed556f107691ee08fff4826602fdaac6a Mon Sep 17 00:00:00 2001 From: Krzysztof Mazur Date: Fri, 1 Jul 2011 14:04:12 +0200 Subject: [PATCH 44/84] lsbd: fix mirroring with odd number of blocks When mirroring is used the number of blocks should be even; otherwise last sector is skipped by write logic but still used by read logic causing potential problems. --- drivers/block/lsbd.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/drivers/block/lsbd.c b/drivers/block/lsbd.c index d5346d2..ce7cdb4 100644 --- a/drivers/block/lsbd.c +++ b/drivers/block/lsbd.c @@ -910,8 +910,14 @@ static int lsbd_load_params(struct lsbd *p) } p->mirrored = 0; - if (be32_to_cpu(b->flags) & LSBD_MIRRORED) + if (be32_to_cpu(b->flags) & LSBD_MIRRORED) { + if (blocks & 1) { + lsbd_info(p, "mirrored device with odd number " + "of blocks\n"); + blocks &= ~1; + } p->mirrored = 1; + } if (blocks < p->blocks) { p->blocks = blocks; @@ -1848,8 +1854,7 @@ static int lsbd_write_block(struct lsbd *p) if (!(p->cur_block & 1) && p->mirrored) { mirrored = 1; - if (p->cur_block + 1 >= p->blocks) - p->cur_block = 0; + BUG_ON(p->cur_block + 1 >= p->blocks); } lsbd_debug(p, "writting block %d%s\n", p->cur_block, -- 1.8.4.652.g0d6e0ce