[PATCH] md: don't skip bitmap pages due to lack of bit that we just cleared.
authorNeilBrown <neilb@cse.unsw.edu.au>
Wed, 22 Jun 2005 00:17:22 +0000 (17:17 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Wed, 22 Jun 2005 02:07:45 +0000 (19:07 -0700)
When looking for pages that need cleaning we skip pages that don't have
BITMAP_PAGE_CLEAN set.  But if it is the 'current' page we will have cleared
that bit ourselves, so skipping it is wrong.  So: move the 'skip this page'
inside 'if page != lastpage'.

Also fold call of file_page_offset into the one place where the value (bit) is
used.

Signed-off-by: Neil Brown <neilb@cse.unsw.edu.au>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
drivers/md/bitmap.c

index 86b6b037fa442bb3b893c712e9bba532c710a331..204564dc6a0d9f111d73bfe04e00a5154122b89e 100644 (file)
@@ -897,7 +897,7 @@ static bitmap_counter_t *bitmap_get_counter(struct bitmap *bitmap,
 
 int bitmap_daemon_work(struct bitmap *bitmap)
 {
-       unsigned long bit, j;
+       unsigned long j;
        unsigned long flags;
        struct page *page = NULL, *lastpage = NULL;
        int err = 0;
@@ -920,24 +920,23 @@ int bitmap_daemon_work(struct bitmap *bitmap)
                }
 
                page = filemap_get_page(bitmap, j);
-               /* skip this page unless it's marked as needing cleaning */
-               if (!((attr=get_page_attr(bitmap, page)) & BITMAP_PAGE_CLEAN)) {
-                       if (attr & BITMAP_PAGE_NEEDWRITE) {
-                               page_cache_get(page);
-                               clear_page_attr(bitmap, page, BITMAP_PAGE_NEEDWRITE);
-                       }
-                       spin_unlock_irqrestore(&bitmap->lock, flags);
-                       if (attr & BITMAP_PAGE_NEEDWRITE) {
-                               if (write_page(bitmap, page, 0))
-                                       bitmap_file_kick(bitmap);
-                               page_cache_release(page);
-                       }
-                       continue;
-               }
-
-               bit = file_page_offset(j);
 
                if (page != lastpage) {
+                       /* skip this page unless it's marked as needing cleaning */
+                       if (!((attr=get_page_attr(bitmap, page)) & BITMAP_PAGE_CLEAN)) {
+                               if (attr & BITMAP_PAGE_NEEDWRITE) {
+                                       page_cache_get(page);
+                                       clear_page_attr(bitmap, page, BITMAP_PAGE_NEEDWRITE);
+                               }
+                               spin_unlock_irqrestore(&bitmap->lock, flags);
+                               if (attr & BITMAP_PAGE_NEEDWRITE) {
+                                       if (write_page(bitmap, page, 0))
+                                               bitmap_file_kick(bitmap);
+                                       page_cache_release(page);
+                               }
+                               continue;
+                       }
+
                        /* grab the new page, sync and release the old */
                        page_cache_get(page);
                        if (lastpage != NULL) {
@@ -979,7 +978,7 @@ int bitmap_daemon_work(struct bitmap *bitmap)
                                                  -1);
 
                                /* clear the bit */
-                               clear_bit(bit, page_address(page));
+                               clear_bit(file_page_offset(j), page_address(page));
                        }
                }
                spin_unlock_irqrestore(&bitmap->lock, flags);