From f90e73af5151f587e35664e4f6bc2c9a85b8265d Mon Sep 17 00:00:00 2001 From: Con Kolivas Date: Tue, 5 Jul 2011 10:47:47 +1000 Subject: [PATCH] Queue and pop precisely the same amount of work in flush_request to ensure all work is cleared and there isn't an uneven add/remove possible. --- main.c | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/main.c b/main.c index ddd3d7fe..1e22e746 100644 --- a/main.c +++ b/main.c @@ -719,27 +719,24 @@ static bool discard_request(void) static void flush_requests(void) { - unsigned int i; + int i, extra; - /* Queue a whole batch of new requests */ - for (i = 0; i < opt_queue; i++) { + extra = requests_queued(); + for (i = 0; i < extra; i++) { + /* Queue a whole batch of new requests */ if (unlikely(!queue_request())) { applog(LOG_ERR, "Failed to queue requests in flush_requests"); kill_work(); - return; + break; } - } - - /* Pop off the old requests. Cancelling the requests would be better - * but is tricky */ - while (requests_queued() > opt_queue) { + /* Pop off the old requests. Cancelling the requests would be better + * but is tricky */ if (unlikely(!discard_request())) { applog(LOG_ERR, "Failed to discard requests in flush_requests"); kill_work(); - return; + break; } } - } static bool get_work(struct work *work, bool queued)