From 7c3a22ff004eabaac4d9e3eba4d3f74fa084d2a1 Mon Sep 17 00:00:00 2001 From: Krzysztof Mazur Date: Sat, 18 Dec 2010 23:22:18 +0100 Subject: [PATCH 10/84] lsbd: fix potential cleaning infinite loop --- drivers/block/lsbd.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/drivers/block/lsbd.c b/drivers/block/lsbd.c index bdc26b1..3fee0a3 100644 --- a/drivers/block/lsbd.c +++ b/drivers/block/lsbd.c @@ -1380,6 +1380,7 @@ static int lsbd_thread(void *data) int ret; int want_write; int want_clean; + unsigned int i; lock_kernel(); daemonize(); @@ -1430,8 +1431,16 @@ static int lsbd_thread(void *data) if (p->stop) break; - if (want_clean) - lsbd_clean_block(p); + /* + * to avoid 1:1 block copying that could cause constant + * walk trough all device more than one block should + * be cleaned at once to allow merging many blocks + * into one. + */ + if (want_clean) { + for (i = 0; i < 4; i++) + lsbd_clean_block(p); + } while (want_write && (block_diff(p, p->clean_block, p->cur_block) > 1)) { -- 1.8.4.652.g0d6e0ce