diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c index 2e257d5998bc..609e68d3e1bc 100644 --- a/drivers/md/bitmap.c +++ b/drivers/md/bitmap.c @@ -332,7 +332,6 @@ static int write_page(struct bitmap *bitmap, struct page *page, int wait) /* add to list to be waited for */ struct page_list *item = mempool_alloc(bitmap->write_pool, GFP_NOIO); item->page = page; - get_page(page); spin_lock(&bitmap->write_lock); list_add(&item->list, &bitmap->complete_pages); spin_unlock(&bitmap->write_lock); @@ -548,7 +547,6 @@ static void bitmap_mask_state(struct bitmap *bitmap, enum bitmap_state bits, spin_unlock_irqrestore(&bitmap->lock, flags); return; } - get_page(bitmap->sb_page); spin_unlock_irqrestore(&bitmap->lock, flags); sb = (bitmap_super_t *)kmap_atomic(bitmap->sb_page, KM_USER0); switch (op) { @@ -559,7 +557,6 @@ static void bitmap_mask_state(struct bitmap *bitmap, enum bitmap_state bits, default: BUG(); } kunmap_atomic(sb, KM_USER0); - put_page(bitmap->sb_page); } /* @@ -641,7 +638,6 @@ static void drain_write_queues(struct bitmap *bitmap) while ((item = dequeue_page(bitmap))) { /* don't bother to wait */ - put_page(item->page); mempool_free(item, bitmap->write_pool); } } @@ -744,11 +740,6 @@ static void bitmap_file_set_bit(struct bitmap *bitmap, sector_t block) page = filemap_get_page(bitmap, chunk); bit = file_page_offset(chunk); - - /* make sure the page stays cached until it gets written out */ - if (! test_page_attr(bitmap, page, BITMAP_PAGE_DIRTY)) - get_page(page); - /* set the bit */ kaddr = kmap_atomic(page, KM_USER0); if (bitmap->flags & BITMAP_HOSTENDIAN) @@ -1028,10 +1019,9 @@ int bitmap_daemon_work(struct bitmap *bitmap) if (!test_page_attr(bitmap, page, BITMAP_PAGE_CLEAN)) { int need_write = test_page_attr(bitmap, page, BITMAP_PAGE_NEEDWRITE); - if (need_write) { - get_page(page); + if (need_write) clear_page_attr(bitmap, page, BITMAP_PAGE_NEEDWRITE); - } + spin_unlock_irqrestore(&bitmap->lock, flags); if (need_write) { switch (write_page(bitmap, page, 0)) { @@ -1043,13 +1033,11 @@ int bitmap_daemon_work(struct bitmap *bitmap) default: bitmap_file_kick(bitmap); } - put_page(page); } continue; } /* grab the new page, sync and release the old */ - get_page(page); if (lastpage != NULL) { if (test_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE)) { clear_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE); @@ -1063,7 +1051,6 @@ int bitmap_daemon_work(struct bitmap *bitmap) set_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE); spin_unlock_irqrestore(&bitmap->lock, flags); } - put_page(lastpage); if (err) bitmap_file_kick(bitmap); } else @@ -1117,8 +1104,6 @@ int bitmap_daemon_work(struct bitmap *bitmap) set_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE); spin_unlock_irqrestore(&bitmap->lock, flags); } - - put_page(lastpage); } return err; @@ -1140,7 +1125,6 @@ static void bitmap_writeback(struct bitmap *bitmap) PRINTK("finished page writeback: %p\n", page); err = PageError(page); - put_page(page); if (err) { printk(KERN_WARNING "%s: bitmap file writeback " "failed (page %lu): %d\n",