md/bitmap: daemon_work cleanup.
[deliverable/linux.git] / drivers / md / bitmap.c
index 7878712721bf431a1315f44db1c3b2dcc9486245..048eec75147466666eb7f8579466734b5f9a0556 100644 (file)
@@ -1106,10 +1106,12 @@ void bitmap_write_all(struct bitmap *bitmap)
         */
        int i;
 
+       spin_lock_irq(&bitmap->lock);
        for (i = 0; i < bitmap->file_pages; i++)
                set_page_attr(bitmap, bitmap->filemap[i],
                              BITMAP_PAGE_NEEDWRITE);
        bitmap->allclean = 0;
+       spin_unlock_irq(&bitmap->lock);
 }
 
 static void bitmap_count_page(struct bitmap *bitmap, sector_t offset, int inc)
@@ -1147,12 +1149,12 @@ void bitmap_daemon_work(struct mddev *mddev)
                return;
        }
        if (time_before(jiffies, bitmap->daemon_lastrun
-                       + bitmap->mddev->bitmap_info.daemon_sleep))
+                       + mddev->bitmap_info.daemon_sleep))
                goto done;
 
        bitmap->daemon_lastrun = jiffies;
        if (bitmap->allclean) {
-               bitmap->mddev->thread->timeout = MAX_SCHEDULE_TIMEOUT;
+               mddev->thread->timeout = MAX_SCHEDULE_TIMEOUT;
                goto done;
        }
        bitmap->allclean = 1;
@@ -1204,7 +1206,7 @@ void bitmap_daemon_work(struct mddev *mddev)
                         * sure that events_cleared is up-to-date.
                         */
                        if (bitmap->need_sync &&
-                           bitmap->mddev->bitmap_info.external == 0) {
+                           mddev->bitmap_info.external == 0) {
                                bitmap_super_t *sb;
                                bitmap->need_sync = 0;
                                sb = kmap_atomic(bitmap->sb_page, KM_USER0);
@@ -1268,8 +1270,8 @@ void bitmap_daemon_work(struct mddev *mddev)
 
  done:
        if (bitmap->allclean == 0)
-               bitmap->mddev->thread->timeout =
-                       bitmap->mddev->bitmap_info.daemon_sleep;
+               mddev->thread->timeout =
+                       mddev->bitmap_info.daemon_sleep;
        mutex_unlock(&mddev->bitmap_info.mutex);
 }
 
@@ -1391,9 +1393,6 @@ void bitmap_endwrite(struct bitmap *bitmap, sector_t offset, unsigned long secto
                         atomic_read(&bitmap->behind_writes),
                         bitmap->mddev->bitmap_info.max_write_behind);
        }
-       if (bitmap->mddev->degraded)
-               /* Never clear bits or update events_cleared when degraded */
-               success = 0;
 
        while (sectors) {
                sector_t blocks;
@@ -1407,7 +1406,7 @@ void bitmap_endwrite(struct bitmap *bitmap, sector_t offset, unsigned long secto
                        return;
                }
 
-               if (success &&
+               if (success && !bitmap->mddev->degraded &&
                    bitmap->events_cleared < bitmap->mddev->events) {
                        bitmap->events_cleared = bitmap->mddev->events;
                        bitmap->need_sync = 1;
@@ -1605,7 +1604,9 @@ void bitmap_dirty_bits(struct bitmap *bitmap, unsigned long s, unsigned long e)
        for (chunk = s; chunk <= e; chunk++) {
                sector_t sec = (sector_t)chunk << CHUNK_BLOCK_SHIFT(bitmap);
                bitmap_set_memory_bits(bitmap, sec, 1);
+               spin_lock_irq(&bitmap->lock);
                bitmap_file_set_bit(bitmap, sec);
+               spin_unlock_irq(&bitmap->lock);
                if (sec < bitmap->mddev->recovery_cp)
                        /* We are asserting that the array is dirty,
                         * so move the recovery_cp address back so
This page took 0.024679 seconds and 5 git commands to generate.