In some situations barrier counter may become negative. Calling lower_barrier with barrier=0 results barrier become negative. It is harm situation and may cause process hang when we call wait_barrier() This patch introduces additional condition in lower_barrier function- decrement barrier counter only if it is raised. It prevents to become barrier variable negative. Signed-off-by: Krzysztof Wojcik <krzysztof.wojcik@xxxxxxxxx> --- drivers/md/raid1.c | 3 ++- drivers/md/raid10.c | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index a23ffa3..fa7077b 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -660,7 +660,8 @@ static void lower_barrier(conf_t *conf) unsigned long flags; BUG_ON(conf->barrier <= 0); spin_lock_irqsave(&conf->resync_lock, flags); - conf->barrier--; + if (conf->barrier > 0) + conf->barrier--; spin_unlock_irqrestore(&conf->resync_lock, flags); wake_up(&conf->wait_barrier); } diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 3b607b2..c9e46a9 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -727,7 +727,8 @@ static void lower_barrier(conf_t *conf) { unsigned long flags; spin_lock_irqsave(&conf->resync_lock, flags); - conf->barrier--; + if (conf->barrier > 0) + conf->barrier--; spin_unlock_irqrestore(&conf->resync_lock, flags); wake_up(&conf->wait_barrier); } -- To unsubscribe from this list: send the line "unsubscribe linux-raid" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html