md/bitmap: remove async freeing of bitmap file.
There is no real value in freeing things the moment there is an error.
It is just as good to free the bitmap file and pages when the bitmap
is explicitly removed (and replaced?) or at shutdown.
With this gone, the bitmap will only disappear when the array is
quiescent, so we can remove some locking.
As the 'filemap' doesn't disappear now, include extra checks before
trying to write any of it out.
Also remove the check for "has it disappeared" in
bitmap_daemon_write().
Signed-off-by: NeilBrown <neilb@suse.de>
diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c
index a1862d9..7e015c9 100644
--- a/drivers/md/bitmap.c
+++ b/drivers/md/bitmap.c
@@ -739,7 +739,6 @@
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 @@
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 @@
{
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 @@
"%s: disabling internal bitmap due to errors\n",
bmname(bitmap));
}
-
- bitmap_file_put(bitmap);
-
- return;
}
enum bitmap_page_attr {
@@ -903,7 +895,8 @@
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 @@
* 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 @@
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);