From 1e71647cc00a4339109f61ada3b416672457f4ad Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Tue, 22 May 2012 13:55:21 +1000 Subject: [PATCH] --- yaml --- r: 305949 b: refs/heads/master c: 62f82faaceb483284ea938b3a092b9f0a4d2d029 h: refs/heads/master i: 305947: 5dc9e4951eb66ae626cd740dcc37473d3bab219e v: v3 --- [refs] | 2 +- trunk/drivers/md/bitmap.c | 18 ++++++------------ 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/[refs] b/[refs] index 7960595b268a..a3f88153b2ba 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 7466712347c58c367636cc875801c8703bc729e7 +refs/heads/master: 62f82faaceb483284ea938b3a092b9f0a4d2d029 diff --git a/trunk/drivers/md/bitmap.c b/trunk/drivers/md/bitmap.c index a1862d9e6d83..7e015c9ea73e 100644 --- a/trunk/drivers/md/bitmap.c +++ b/trunk/drivers/md/bitmap.c @@ -739,7 +739,6 @@ static void bitmap_file_unmap(struct bitmap *bitmap) int pages; struct bitmap_storage *store = &bitmap->storage; - spin_lock_irq(&bitmap->lock); map = store->filemap; store->filemap = NULL; attr = store->filemap_attr; @@ -748,7 +747,6 @@ static void bitmap_file_unmap(struct bitmap *bitmap) store->file_pages = 0; sb_page = store->sb_page; store->sb_page = NULL; - spin_unlock_irq(&bitmap->lock); while (pages--) if (map[pages] != sb_page) /* 0 is sb_page, release it below */ @@ -764,10 +762,8 @@ static void bitmap_file_put(struct bitmap *bitmap) { struct file *file; - spin_lock_irq(&bitmap->lock); file = bitmap->storage.file; bitmap->storage.file = NULL; - spin_unlock_irq(&bitmap->lock); if (file) wait_event(bitmap->write_wait, @@ -809,10 +805,6 @@ static void bitmap_file_kick(struct bitmap *bitmap) "%s: disabling internal bitmap due to errors\n", bmname(bitmap)); } - - bitmap_file_put(bitmap); - - return; } enum bitmap_page_attr { @@ -903,7 +895,8 @@ void bitmap_unplug(struct bitmap *bitmap) int dirty, need_write; int wait = 0; - if (!bitmap || !bitmap->storage.filemap) + if (!bitmap || !bitmap->storage.filemap || + test_bit(BITMAP_STALE, &bitmap->flags)) return; /* look at each page to see if there are any set bits that need to be @@ -1222,7 +1215,10 @@ void bitmap_daemon_work(struct mddev *mddev) * the first blocking holds the superblock and it has been updated. * We mustn't write any other blocks before the superblock. */ - for (j = 0; j < bitmap->storage.file_pages; j++) { + for (j = 0; + j < bitmap->storage.file_pages + && !test_bit(BITMAP_STALE, &bitmap->flags); + j++) { if (test_page_attr(bitmap, j, BITMAP_PAGE_DIRTY)) @@ -1235,8 +1231,6 @@ void bitmap_daemon_work(struct mddev *mddev) spin_unlock_irq(&bitmap->lock); write_page(bitmap, bitmap->storage.filemap[j], 0); spin_lock_irq(&bitmap->lock); - if (!bitmap->storage.filemap) - break; } } spin_unlock_irq(&bitmap->lock);