Skip to content

Commit

Permalink
md/bitmap: remove async freeing of bitmap file.
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
NeilBrown committed May 22, 2012
1 parent 7466712 commit 62f82fa
Showing 1 changed file with 6 additions and 12 deletions.
18 changes: 6 additions & 12 deletions drivers/md/bitmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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 */
Expand All @@ -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,
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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))
Expand All @@ -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);
Expand Down

0 comments on commit 62f82fa

Please sign in to comment.