Commit fae7d326 authored by NeilBrown's avatar NeilBrown

md/bitmap: merge bitmap_file_unmap and bitmap_file_put.

There functions really do one thing together: release the
'bitmap_storage'.  So make them just one function.

Since we removed the locking (previous patch), we don't need to zero
any fields before freeing them, so it all becomes a bit simpler.
Signed-off-by: default avatarNeilBrown <neilb@suse.de>
parent 62f82faa
...@@ -732,43 +732,25 @@ static int bitmap_storage_alloc(struct bitmap_storage *store, ...@@ -732,43 +732,25 @@ static int bitmap_storage_alloc(struct bitmap_storage *store,
return 0; return 0;
} }
static void bitmap_file_unmap(struct bitmap *bitmap) static void bitmap_file_unmap(struct bitmap_storage *store)
{ {
struct page **map, *sb_page; struct page **map, *sb_page;
unsigned long *attr;
int pages; int pages;
struct bitmap_storage *store = &bitmap->storage; struct file *file;
file = store->file;
map = store->filemap; map = store->filemap;
store->filemap = NULL;
attr = store->filemap_attr;
store->filemap_attr = NULL;
pages = store->file_pages; pages = store->file_pages;
store->file_pages = 0;
sb_page = store->sb_page; sb_page = store->sb_page;
store->sb_page = NULL;
while (pages--) while (pages--)
if (map[pages] != sb_page) /* 0 is sb_page, release it below */ if (map[pages] != sb_page) /* 0 is sb_page, release it below */
free_buffers(map[pages]); free_buffers(map[pages]);
kfree(map); kfree(map);
kfree(attr); kfree(store->filemap_attr);
if (sb_page) if (sb_page)
free_buffers(sb_page); free_buffers(sb_page);
}
static void bitmap_file_put(struct bitmap *bitmap)
{
struct file *file;
file = bitmap->storage.file;
bitmap->storage.file = NULL;
if (file)
wait_event(bitmap->write_wait,
atomic_read(&bitmap->pending_writes)==0);
bitmap_file_unmap(bitmap);
if (file) { if (file) {
struct inode *inode = file->f_path.dentry->d_inode; struct inode *inode = file->f_path.dentry->d_inode;
...@@ -1610,8 +1592,12 @@ static void bitmap_free(struct bitmap *bitmap) ...@@ -1610,8 +1592,12 @@ static void bitmap_free(struct bitmap *bitmap)
if (!bitmap) /* there was no bitmap */ if (!bitmap) /* there was no bitmap */
return; return;
/* release the bitmap file and kill the daemon */ /* Shouldn't be needed - but just in case.... */
bitmap_file_put(bitmap); wait_event(bitmap->write_wait,
atomic_read(&bitmap->pending_writes) == 0);
/* release the bitmap file */
bitmap_file_unmap(&bitmap->storage);
bp = bitmap->bp; bp = bitmap->bp;
pages = bitmap->pages; pages = bitmap->pages;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment