Skip to content

Commit

Permalink
[PATCH] md: don't skip bitmap pages due to lack of bit that we just c…
Browse files Browse the repository at this point in the history
…leared.

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>
  • Loading branch information
NeilBrown authored and Linus Torvalds committed Jun 22, 2005
1 parent 77ad4bc commit aa3163f
Showing 1 changed file with 17 additions and 18 deletions.
35 changes: 17 additions & 18 deletions drivers/md/bitmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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) {
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit aa3163f

Please sign in to comment.