aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/md/bitmap.c20
1 files changed, 2 insertions, 18 deletions
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)
332 /* add to list to be waited for */ 332 /* add to list to be waited for */
333 struct page_list *item = mempool_alloc(bitmap->write_pool, GFP_NOIO); 333 struct page_list *item = mempool_alloc(bitmap->write_pool, GFP_NOIO);
334 item->page = page; 334 item->page = page;
335 get_page(page);
336 spin_lock(&bitmap->write_lock); 335 spin_lock(&bitmap->write_lock);
337 list_add(&item->list, &bitmap->complete_pages); 336 list_add(&item->list, &bitmap->complete_pages);
338 spin_unlock(&bitmap->write_lock); 337 spin_unlock(&bitmap->write_lock);
@@ -548,7 +547,6 @@ static void bitmap_mask_state(struct bitmap *bitmap, enum bitmap_state bits,
548 spin_unlock_irqrestore(&bitmap->lock, flags); 547 spin_unlock_irqrestore(&bitmap->lock, flags);
549 return; 548 return;
550 } 549 }
551 get_page(bitmap->sb_page);
552 spin_unlock_irqrestore(&bitmap->lock, flags); 550 spin_unlock_irqrestore(&bitmap->lock, flags);
553 sb = (bitmap_super_t *)kmap_atomic(bitmap->sb_page, KM_USER0); 551 sb = (bitmap_super_t *)kmap_atomic(bitmap->sb_page, KM_USER0);
554 switch (op) { 552 switch (op) {
@@ -559,7 +557,6 @@ static void bitmap_mask_state(struct bitmap *bitmap, enum bitmap_state bits,
559 default: BUG(); 557 default: BUG();
560 } 558 }
561 kunmap_atomic(sb, KM_USER0); 559 kunmap_atomic(sb, KM_USER0);
562 put_page(bitmap->sb_page);
563} 560}
564 561
565/* 562/*
@@ -641,7 +638,6 @@ static void drain_write_queues(struct bitmap *bitmap)
641 638
642 while ((item = dequeue_page(bitmap))) { 639 while ((item = dequeue_page(bitmap))) {
643 /* don't bother to wait */ 640 /* don't bother to wait */
644 put_page(item->page);
645 mempool_free(item, bitmap->write_pool); 641 mempool_free(item, bitmap->write_pool);
646 } 642 }
647} 643}
@@ -744,11 +740,6 @@ static void bitmap_file_set_bit(struct bitmap *bitmap, sector_t block)
744 page = filemap_get_page(bitmap, chunk); 740 page = filemap_get_page(bitmap, chunk);
745 bit = file_page_offset(chunk); 741 bit = file_page_offset(chunk);
746 742
747
748 /* make sure the page stays cached until it gets written out */
749 if (! test_page_attr(bitmap, page, BITMAP_PAGE_DIRTY))
750 get_page(page);
751
752 /* set the bit */ 743 /* set the bit */
753 kaddr = kmap_atomic(page, KM_USER0); 744 kaddr = kmap_atomic(page, KM_USER0);
754 if (bitmap->flags & BITMAP_HOSTENDIAN) 745 if (bitmap->flags & BITMAP_HOSTENDIAN)
@@ -1028,10 +1019,9 @@ int bitmap_daemon_work(struct bitmap *bitmap)
1028 if (!test_page_attr(bitmap, page, BITMAP_PAGE_CLEAN)) { 1019 if (!test_page_attr(bitmap, page, BITMAP_PAGE_CLEAN)) {
1029 int need_write = test_page_attr(bitmap, page, 1020 int need_write = test_page_attr(bitmap, page,
1030 BITMAP_PAGE_NEEDWRITE); 1021 BITMAP_PAGE_NEEDWRITE);
1031 if (need_write) { 1022 if (need_write)
1032 get_page(page);
1033 clear_page_attr(bitmap, page, BITMAP_PAGE_NEEDWRITE); 1023 clear_page_attr(bitmap, page, BITMAP_PAGE_NEEDWRITE);
1034 } 1024
1035 spin_unlock_irqrestore(&bitmap->lock, flags); 1025 spin_unlock_irqrestore(&bitmap->lock, flags);
1036 if (need_write) { 1026 if (need_write) {
1037 switch (write_page(bitmap, page, 0)) { 1027 switch (write_page(bitmap, page, 0)) {
@@ -1043,13 +1033,11 @@ int bitmap_daemon_work(struct bitmap *bitmap)
1043 default: 1033 default:
1044 bitmap_file_kick(bitmap); 1034 bitmap_file_kick(bitmap);
1045 } 1035 }
1046 put_page(page);
1047 } 1036 }
1048 continue; 1037 continue;
1049 } 1038 }
1050 1039
1051 /* grab the new page, sync and release the old */ 1040 /* grab the new page, sync and release the old */
1052 get_page(page);
1053 if (lastpage != NULL) { 1041 if (lastpage != NULL) {
1054 if (test_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE)) { 1042 if (test_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE)) {
1055 clear_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE); 1043 clear_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE);
@@ -1063,7 +1051,6 @@ int bitmap_daemon_work(struct bitmap *bitmap)
1063 set_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE); 1051 set_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE);
1064 spin_unlock_irqrestore(&bitmap->lock, flags); 1052 spin_unlock_irqrestore(&bitmap->lock, flags);
1065 } 1053 }
1066 put_page(lastpage);
1067 if (err) 1054 if (err)
1068 bitmap_file_kick(bitmap); 1055 bitmap_file_kick(bitmap);
1069 } else 1056 } else
@@ -1117,8 +1104,6 @@ int bitmap_daemon_work(struct bitmap *bitmap)
1117 set_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE); 1104 set_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE);
1118 spin_unlock_irqrestore(&bitmap->lock, flags); 1105 spin_unlock_irqrestore(&bitmap->lock, flags);
1119 } 1106 }
1120
1121 put_page(lastpage);
1122 } 1107 }
1123 1108
1124 return err; 1109 return err;
@@ -1140,7 +1125,6 @@ static void bitmap_writeback(struct bitmap *bitmap)
1140 PRINTK("finished page writeback: %p\n", page); 1125 PRINTK("finished page writeback: %p\n", page);
1141 1126
1142 err = PageError(page); 1127 err = PageError(page);
1143 put_page(page);
1144 if (err) { 1128 if (err) {
1145 printk(KERN_WARNING "%s: bitmap file writeback " 1129 printk(KERN_WARNING "%s: bitmap file writeback "
1146 "failed (page %lu): %d\n", 1130 "failed (page %lu): %d\n",