sector_t offset, sector_t *blocks,
                                               int create);
 
+static void mddev_set_timeout(struct mddev *mddev, unsigned long timeout,
+                             bool force)
+{
+       struct md_thread *thread = mddev->thread;
+
+       if (!thread)
+               return;
+
+       if (force || thread->timeout < MAX_SCHEDULE_TIMEOUT)
+               thread->timeout = timeout;
+}
+
 /*
  * bitmap daemon -- periodically wakes up to clean bits and flush pages
  *                     out to disk
  */
-
 void md_bitmap_daemon_work(struct mddev *mddev)
 {
        struct bitmap *bitmap;
 
        bitmap->daemon_lastrun = jiffies;
        if (bitmap->allclean) {
-               mddev->thread->timeout = MAX_SCHEDULE_TIMEOUT;
+               mddev_set_timeout(mddev, MAX_SCHEDULE_TIMEOUT, true);
                goto done;
        }
        bitmap->allclean = 1;
 
  done:
        if (bitmap->allclean == 0)
-               mddev->thread->timeout =
-                       mddev->bitmap_info.daemon_sleep;
+               mddev_set_timeout(mddev, mddev->bitmap_info.daemon_sleep, true);
        mutex_unlock(&mddev->bitmap_info.mutex);
 }
 
        mddev->bitmap = NULL; /* disconnect from the md device */
        spin_unlock(&mddev->lock);
        mutex_unlock(&mddev->bitmap_info.mutex);
-       if (mddev->thread)
-               mddev->thread->timeout = MAX_SCHEDULE_TIMEOUT;
+       mddev_set_timeout(mddev, MAX_SCHEDULE_TIMEOUT, true);
 
        md_bitmap_free(bitmap);
 }
        /* Kick recovery in case any bits were set */
        set_bit(MD_RECOVERY_NEEDED, &bitmap->mddev->recovery);
 
-       mddev->thread->timeout = mddev->bitmap_info.daemon_sleep;
+       mddev_set_timeout(mddev, mddev->bitmap_info.daemon_sleep, true);
        md_wakeup_thread(mddev->thread);
 
        md_bitmap_update_sb(bitmap);
                timeout = MAX_SCHEDULE_TIMEOUT-1;
        if (timeout < 1)
                timeout = 1;
-       mddev->bitmap_info.daemon_sleep = timeout;
-       if (mddev->thread) {
-               /* if thread->timeout is MAX_SCHEDULE_TIMEOUT, then
-                * the bitmap is all clean and we don't need to
-                * adjust the timeout right now
-                */
-               if (mddev->thread->timeout < MAX_SCHEDULE_TIMEOUT)
-                       mddev->thread->timeout = timeout;
-       }
 
+       mddev->bitmap_info.daemon_sleep = timeout;
+       mddev_set_timeout(mddev, timeout, false);
        md_wakeup_thread(mddev->thread);
+
        return len;
 }