From 7f0821c71421fd838248bf2725a3f29ab80e49f7 Mon Sep 17 00:00:00 2001 From: Krzysztof Mazur Date: Wed, 16 Feb 2011 18:11:04 +0100 Subject: [PATCH 21/84] lsbd: fix logical size limits --- drivers/block/lsbd.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/drivers/block/lsbd.c b/drivers/block/lsbd.c index f4ac400..b223b9d 100644 --- a/drivers/block/lsbd.c +++ b/drivers/block/lsbd.c @@ -909,6 +909,17 @@ static int lsbd_load_params(struct lsbd *p) p->blocks * p->sectors_per_block * (p->sector_size >> 10), p->mirrored ? "(mirrored)" : ""); + + if (p->lsectors / 7 + p->sectors_per_block * 2 > + p->blocks * p->sectors_per_block + / (p->mirrored ? 16 : 8)) { + lsbd_error(p, "refusing to start with too high " + "logical size / physical size ratio\n"); + brelse(bh); + lsbd_put_buffer(p, bh); + return -EINVAL; + } + lsbd_sizes[p->id] = p->lsectors * (p->sector_size >> 10); p->blocks_to_write = 0; @@ -1077,16 +1088,16 @@ static int lsbd_partition(struct lsbd *p, struct lsbd_part_info *part) return -EINVAL; sectors = p->blocks * (p->sectors_per_block - 1); - if (sectors < 1024) - sectors += 128; - if (part->flags & LSBD_PART_MIRRORED) { mirrored = 1; sectors /= 2; } - /* don't allow more than 7/8 utilization */ - if (part->size / 7 > sectors / 8) + /* + * don't allow more than 7/8 utilization + * add also 16 blocks to avoid cleanup problems + */ + if (part->size / 7 + p->sectors_per_block * 2 > sectors / 8) return -EINVAL; p->mirrored = mirrored; @@ -1525,7 +1536,8 @@ void lsbd_clean_block(struct lsbd *p) rbh = lsbd_sread(p, block, i + 1); if (rbh == NULL) continue; - + + lsbd_debug(p, "rewritting sector %d\n", sector_id); lock_buffer(rbh); ret = lsbd_queue_bh(p, rbh, s, LSBD_QUEUE_MOVE); if (ret) { -- 1.8.4.652.g0d6e0ce