writeback: fix uninitialized task_ratelimit
authorWu Fengguang <fengguang.wu@intel.com>
Mon, 7 Nov 2011 11:19:28 +0000 (19:19 +0800)
committerWu Fengguang <fengguang.wu@intel.com>
Mon, 7 Nov 2011 11:19:28 +0000 (19:19 +0800)
In balance_dirty_pages() task_ratelimit may be not initialized
(initialization skiped by goto pause), and then used when calling
tracing hook.

Fix it by moving the task_ratelimit assignment before goto pause.

Reported-by: Witold Baryluk <baryluk@smp.if.uj.edu.pl>
Signed-off-by: Wu Fengguang <fengguang.wu@intel.com>
mm/page-writeback.c

index 0360d1b5a1ddd5bc68eb55a1dd1c24f453218aa4..a3278f005230a07ac5bf42717ae55bfb114f0239 100644 (file)
@@ -1097,13 +1097,13 @@ static void balance_dirty_pages(struct address_space *mapping,
                pos_ratio = bdi_position_ratio(bdi, dirty_thresh,
                                               background_thresh, nr_dirty,
                                               bdi_thresh, bdi_dirty);
-               if (unlikely(pos_ratio == 0)) {
+               task_ratelimit = ((u64)dirty_ratelimit * pos_ratio) >>
+                                                       RATELIMIT_CALC_SHIFT;
+               if (unlikely(task_ratelimit == 0)) {
                        pause = max_pause;
                        goto pause;
                }
-               task_ratelimit = (u64)dirty_ratelimit *
-                                       pos_ratio >> RATELIMIT_CALC_SHIFT;
-               pause = (HZ * pages_dirtied) / (task_ratelimit | 1);
+               pause = HZ * pages_dirtied / task_ratelimit;
                if (unlikely(pause <= 0)) {
                        trace_balance_dirty_pages(bdi,
                                                  dirty_thresh,