From d959f8b95a7764b179a528615dbf5e730d4740cc Mon Sep 17 00:00:00 2001 From: Krzysztof Mazur Date: Sat, 4 Feb 2012 13:04:39 +0100 Subject: [PATCH 64/84] lsbd: check for checksum errors during rewrite Signed-off-by: Krzysztof Mazur --- drivers/block/lsbd.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/drivers/block/lsbd.c b/drivers/block/lsbd.c index eb5c4c2..1b9a0f5 100644 --- a/drivers/block/lsbd.c +++ b/drivers/block/lsbd.c @@ -1823,8 +1823,11 @@ static int lsbd_sector_eq(struct lsbd *p, unsigned int a, unsigned b) * the highest priority - so the LSBD_QUEUE_MOVE is used. */ static void lsbd_rewrite_sector(struct lsbd *p, unsigned int block, - unsigned int sector, unsigned int sector_id) + unsigned int sector, const struct lsbd_sect *sect) { + unsigned int sector_id = be32_to_cpu(sect->id); + u32 valid_cksum = be32_to_cpu(sect->data_checksum); + u32 cksum; struct buffer_head *rbh; int ret; @@ -1832,7 +1835,11 @@ static void lsbd_rewrite_sector(struct lsbd *p, unsigned int block, if (rbh == NULL) return; - lsbd_debug(p, "rewrite %d from block %ld\n", sector_id, block); + cksum = lsbd_checksum(rbh->b_data, p->sector_size); + if (cksum != valid_cksum) + lsbd_info(p, "sector %d checksum error\n", sector_id); + + lsbd_debug(p, "rewrite %d from block %d\n", sector_id, block); lock_buffer(rbh); ret = lsbd_queue_bh(p, rbh, sector_id, LSBD_QUEUE_MOVE); if (ret) { @@ -1944,7 +1951,7 @@ retry: block, i, sector_id, s, sector); if (lsbd_sector_eq(p, sector, s)) - lsbd_rewrite_sector(p, block, i + 1, sector_id); + lsbd_rewrite_sector(p, block, i + 1, §s[i]); } brelse(bh); -- 1.8.4.652.g0d6e0ce