summaryrefslogtreecommitdiffstats
path: root/drivers/md/bitmap.c
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2012-05-21 23:55:08 -0400
committerNeilBrown <neilb@suse.de>2012-05-21 23:55:08 -0400
commitef99bf480de9bde9d3b2afdf05324670fab4e571 (patch)
tree49afa5fd6e7e8060f3601c04bb25b96e14d14a39 /drivers/md/bitmap.c
parent6409bb05a9831f6af36a20b97cda13059c2ef1b6 (diff)
md/bitmap: allow a bitmap with no backing storage.
An md bitmap comprises two parts - internal counting of active writes per 'chunk'. - external storage of whether there are any active writes on each chunk The second requires the first, but the first doesn't require the second. Not having backing storage means that the bitmap cannot expedite resync after a crash, but it still allows us to expedite the recovery of a recently-removed device. So: allow a bitmap to exist even if there is no backing device. In that case we default to 128M chunks. A particular value of this is that we can remove and re-add a bitmap (possibly of a different granularity) on a degraded array, and not lose the information needed to fast-recover the missing device. We don't actually activate these bitmaps yet - that will come in a later patch. Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'drivers/md/bitmap.c')
-rw-r--r--drivers/md/bitmap.c136
1 files changed, 76 insertions, 60 deletions
diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c
index ac688fb54e1d..c042efd019c3 100644
--- a/drivers/md/bitmap.c
+++ b/drivers/md/bitmap.c
@@ -553,6 +553,14 @@ static int bitmap_read_sb(struct bitmap *bitmap)
553 unsigned long long events; 553 unsigned long long events;
554 int err = -EINVAL; 554 int err = -EINVAL;
555 555
556 if (!bitmap->file && !bitmap->mddev->bitmap_info.offset) {
557 chunksize = 128 * 1024 * 1024;
558 daemon_sleep = 5 * HZ;
559 write_behind = 0;
560 bitmap->flags = BITMAP_STALE;
561 err = 0;
562 goto out_no_sb;
563 }
556 /* page 0 is the superblock, read it... */ 564 /* page 0 is the superblock, read it... */
557 if (bitmap->file) { 565 if (bitmap->file) {
558 loff_t isize = i_size_read(bitmap->file->f_mapping->host); 566 loff_t isize = i_size_read(bitmap->file->f_mapping->host);
@@ -623,18 +631,19 @@ static int bitmap_read_sb(struct bitmap *bitmap)
623 } 631 }
624 632
625 /* assign fields using values from superblock */ 633 /* assign fields using values from superblock */
626 bitmap->mddev->bitmap_info.chunksize = chunksize;
627 bitmap->mddev->bitmap_info.daemon_sleep = daemon_sleep;
628 bitmap->mddev->bitmap_info.max_write_behind = write_behind;
629 bitmap->flags |= le32_to_cpu(sb->state); 634 bitmap->flags |= le32_to_cpu(sb->state);
630 if (le32_to_cpu(sb->version) == BITMAP_MAJOR_HOSTENDIAN) 635 if (le32_to_cpu(sb->version) == BITMAP_MAJOR_HOSTENDIAN)
631 bitmap->flags |= BITMAP_HOSTENDIAN; 636 bitmap->flags |= BITMAP_HOSTENDIAN;
632 bitmap->events_cleared = le64_to_cpu(sb->events_cleared); 637 bitmap->events_cleared = le64_to_cpu(sb->events_cleared);
633 if (bitmap->flags & BITMAP_STALE)
634 bitmap->events_cleared = bitmap->mddev->events;
635 err = 0; 638 err = 0;
636out: 639out:
637 kunmap_atomic(sb); 640 kunmap_atomic(sb);
641out_no_sb:
642 if (bitmap->flags & BITMAP_STALE)
643 bitmap->events_cleared = bitmap->mddev->events;
644 bitmap->mddev->bitmap_info.chunksize = chunksize;
645 bitmap->mddev->bitmap_info.daemon_sleep = daemon_sleep;
646 bitmap->mddev->bitmap_info.max_write_behind = write_behind;
638 if (err) 647 if (err)
639 bitmap_print_sb(bitmap); 648 bitmap_print_sb(bitmap);
640 return err; 649 return err;
@@ -837,9 +846,6 @@ static void bitmap_file_set_bit(struct bitmap *bitmap, sector_t block)
837 void *kaddr; 846 void *kaddr;
838 unsigned long chunk = block >> bitmap->chunkshift; 847 unsigned long chunk = block >> bitmap->chunkshift;
839 848
840 if (!bitmap->filemap)
841 return;
842
843 page = filemap_get_page(bitmap, chunk); 849 page = filemap_get_page(bitmap, chunk);
844 if (!page) 850 if (!page)
845 return; 851 return;
@@ -857,6 +863,29 @@ static void bitmap_file_set_bit(struct bitmap *bitmap, sector_t block)
857 set_page_attr(bitmap, page, BITMAP_PAGE_DIRTY); 863 set_page_attr(bitmap, page, BITMAP_PAGE_DIRTY);
858} 864}
859 865
866static void bitmap_file_clear_bit(struct bitmap *bitmap, sector_t block)
867{
868 unsigned long bit;
869 struct page *page;
870 void *paddr;
871 unsigned long chunk = block >> bitmap->chunkshift;
872
873 page = filemap_get_page(bitmap, chunk);
874 if (!page)
875 return;
876 bit = file_page_offset(bitmap, chunk);
877 paddr = kmap_atomic(page);
878 if (bitmap->flags & BITMAP_HOSTENDIAN)
879 clear_bit(bit, paddr);
880 else
881 __clear_bit_le(bit, paddr);
882 kunmap_atomic(paddr);
883 if (!test_page_attr(bitmap, page, BITMAP_PAGE_NEEDWRITE)) {
884 set_page_attr(bitmap, page, BITMAP_PAGE_PENDING);
885 bitmap->allclean = 0;
886 }
887}
888
860/* this gets called when the md device is ready to unplug its underlying 889/* this gets called when the md device is ready to unplug its underlying
861 * (slave) device queues -- before we let any writes go down, we need to 890 * (slave) device queues -- before we let any writes go down, we need to
862 * sync the dirty pages of the bitmap file to disk */ 891 * sync the dirty pages of the bitmap file to disk */
@@ -867,7 +896,7 @@ void bitmap_unplug(struct bitmap *bitmap)
867 struct page *page; 896 struct page *page;
868 int wait = 0; 897 int wait = 0;
869 898
870 if (!bitmap) 899 if (!bitmap || !bitmap->filemap)
871 return; 900 return;
872 901
873 /* look at each page to see if there are any set bits that need to be 902 /* look at each page to see if there are any set bits that need to be
@@ -930,7 +959,20 @@ static int bitmap_init_from_disk(struct bitmap *bitmap, sector_t start)
930 chunks = bitmap->chunks; 959 chunks = bitmap->chunks;
931 file = bitmap->file; 960 file = bitmap->file;
932 961
933 BUG_ON(!file && !bitmap->mddev->bitmap_info.offset); 962 if (!file && !bitmap->mddev->bitmap_info.offset) {
963 /* No permanent bitmap - fill with '1s'. */
964 bitmap->filemap = NULL;
965 bitmap->file_pages = 0;
966 for (i = 0; i < chunks ; i++) {
967 /* if the disk bit is set, set the memory bit */
968 int needed = ((sector_t)(i+1) << (bitmap->chunkshift)
969 >= start);
970 bitmap_set_memory_bits(bitmap,
971 (sector_t)i << bitmap->chunkshift,
972 needed);
973 }
974 return 0;
975 }
934 976
935 outofdate = bitmap->flags & BITMAP_STALE; 977 outofdate = bitmap->flags & BITMAP_STALE;
936 if (outofdate) 978 if (outofdate)
@@ -1045,15 +1087,6 @@ static int bitmap_init_from_disk(struct bitmap *bitmap, sector_t start)
1045 } 1087 }
1046 } 1088 }
1047 1089
1048 /* everything went OK */
1049 ret = 0;
1050 bitmap_mask_state(bitmap, BITMAP_STALE, MASK_UNSET);
1051
1052 if (bit_cnt) { /* Kick recovery if any bits were set */
1053 set_bit(MD_RECOVERY_NEEDED, &bitmap->mddev->recovery);
1054 md_wakeup_thread(bitmap->mddev->thread);
1055 }
1056
1057 printk(KERN_INFO "%s: bitmap initialized from disk: " 1090 printk(KERN_INFO "%s: bitmap initialized from disk: "
1058 "read %lu/%lu pages, set %lu of %lu bits\n", 1091 "read %lu/%lu pages, set %lu of %lu bits\n",
1059 bmname(bitmap), bitmap->file_pages, num_pages, bit_cnt, chunks); 1092 bmname(bitmap), bitmap->file_pages, num_pages, bit_cnt, chunks);
@@ -1073,6 +1106,12 @@ void bitmap_write_all(struct bitmap *bitmap)
1073 */ 1106 */
1074 int i; 1107 int i;
1075 1108
1109 if (!bitmap || !bitmap->filemap)
1110 return;
1111 if (bitmap->file)
1112 /* Only one copy, so nothing needed */
1113 return;
1114
1076 spin_lock_irq(&bitmap->lock); 1115 spin_lock_irq(&bitmap->lock);
1077 for (i = 0; i < bitmap->file_pages; i++) 1116 for (i = 0; i < bitmap->file_pages; i++)
1078 set_page_attr(bitmap, bitmap->filemap[i], 1117 set_page_attr(bitmap, bitmap->filemap[i],
@@ -1115,7 +1154,6 @@ void bitmap_daemon_work(struct mddev *mddev)
1115 unsigned long nextpage; 1154 unsigned long nextpage;
1116 unsigned long flags; 1155 unsigned long flags;
1117 sector_t blocks; 1156 sector_t blocks;
1118 void *paddr;
1119 1157
1120 /* Use a mutex to guard daemon_work against 1158 /* Use a mutex to guard daemon_work against
1121 * bitmap_destroy. 1159 * bitmap_destroy.
@@ -1142,10 +1180,6 @@ void bitmap_daemon_work(struct mddev *mddev)
1142 * we will write it. 1180 * we will write it.
1143 */ 1181 */
1144 spin_lock_irqsave(&bitmap->lock, flags); 1182 spin_lock_irqsave(&bitmap->lock, flags);
1145 if (!bitmap->filemap)
1146 /* error or shutdown */
1147 goto out;
1148
1149 for (j = 0; j < bitmap->file_pages; j++) 1183 for (j = 0; j < bitmap->file_pages; j++)
1150 if (test_page_attr(bitmap, bitmap->filemap[j], 1184 if (test_page_attr(bitmap, bitmap->filemap[j],
1151 BITMAP_PAGE_PENDING)) { 1185 BITMAP_PAGE_PENDING)) {
@@ -1161,11 +1195,14 @@ void bitmap_daemon_work(struct mddev *mddev)
1161 * other changes */ 1195 * other changes */
1162 bitmap_super_t *sb; 1196 bitmap_super_t *sb;
1163 bitmap->need_sync = 0; 1197 bitmap->need_sync = 0;
1164 sb = kmap_atomic(bitmap->sb_page); 1198 if (bitmap->filemap) {
1165 sb->events_cleared = 1199 sb = kmap_atomic(bitmap->sb_page);
1166 cpu_to_le64(bitmap->events_cleared); 1200 sb->events_cleared =
1167 kunmap_atomic(sb); 1201 cpu_to_le64(bitmap->events_cleared);
1168 set_page_attr(bitmap, bitmap->sb_page, BITMAP_PAGE_NEEDWRITE); 1202 kunmap_atomic(sb);
1203 set_page_attr(bitmap, bitmap->sb_page,
1204 BITMAP_PAGE_NEEDWRITE);
1205 }
1169 } 1206 }
1170 /* Now look at the bitmap counters and if any are '2' or '1', 1207 /* Now look at the bitmap counters and if any are '2' or '1',
1171 * decrement and handle accordingly. 1208 * decrement and handle accordingly.
@@ -1173,6 +1210,7 @@ void bitmap_daemon_work(struct mddev *mddev)
1173 nextpage = 0; 1210 nextpage = 0;
1174 for (j = 0; j < bitmap->chunks; j++) { 1211 for (j = 0; j < bitmap->chunks; j++) {
1175 bitmap_counter_t *bmc; 1212 bitmap_counter_t *bmc;
1213 sector_t block = (sector_t)j << bitmap->chunkshift;
1176 1214
1177 if (j == nextpage) { 1215 if (j == nextpage) {
1178 nextpage += PAGE_COUNTER_RATIO; 1216 nextpage += PAGE_COUNTER_RATIO;
@@ -1183,7 +1221,7 @@ void bitmap_daemon_work(struct mddev *mddev)
1183 bitmap->bp[j >> PAGE_COUNTER_SHIFT].pending = 0; 1221 bitmap->bp[j >> PAGE_COUNTER_SHIFT].pending = 0;
1184 } 1222 }
1185 bmc = bitmap_get_counter(bitmap, 1223 bmc = bitmap_get_counter(bitmap,
1186 (sector_t)j << bitmap->chunkshift, 1224 block,
1187 &blocks, 0); 1225 &blocks, 0);
1188 1226
1189 if (!bmc) { 1227 if (!bmc) {
@@ -1192,33 +1230,12 @@ void bitmap_daemon_work(struct mddev *mddev)
1192 } 1230 }
1193 if (*bmc == 1 && !bitmap->need_sync) { 1231 if (*bmc == 1 && !bitmap->need_sync) {
1194 /* We can clear the bit */ 1232 /* We can clear the bit */
1195 struct page *page;
1196 *bmc = 0; 1233 *bmc = 0;
1197 bitmap_count_page( 1234 bitmap_count_page(bitmap, block, -1);
1198 bitmap, 1235 bitmap_file_clear_bit(bitmap, block);
1199 (sector_t)j << bitmap->chunkshift,
1200 -1);
1201
1202 page = filemap_get_page(bitmap, j);
1203 paddr = kmap_atomic(page);
1204 if (bitmap->flags & BITMAP_HOSTENDIAN)
1205 clear_bit(file_page_offset(bitmap, j),
1206 paddr);
1207 else
1208 __clear_bit_le(file_page_offset(bitmap, j),
1209 paddr);
1210 kunmap_atomic(paddr);
1211 if (!test_page_attr(bitmap, page,
1212 BITMAP_PAGE_NEEDWRITE)) {
1213 set_page_attr(bitmap, page,
1214 BITMAP_PAGE_PENDING);
1215 bitmap->allclean = 0;
1216 }
1217 } else if (*bmc && *bmc <= 2) { 1236 } else if (*bmc && *bmc <= 2) {
1218 *bmc = 1; 1237 *bmc = 1;
1219 bitmap_set_pending( 1238 bitmap_set_pending(bitmap, block);
1220 bitmap,
1221 (sector_t)j << bitmap->chunkshift);
1222 bitmap->allclean = 0; 1239 bitmap->allclean = 0;
1223 } 1240 }
1224 } 1241 }
@@ -1249,7 +1266,6 @@ void bitmap_daemon_work(struct mddev *mddev)
1249 break; 1266 break;
1250 } 1267 }
1251 } 1268 }
1252out:
1253 spin_unlock_irqrestore(&bitmap->lock, flags); 1269 spin_unlock_irqrestore(&bitmap->lock, flags);
1254 1270
1255 done: 1271 done:
@@ -1551,7 +1567,7 @@ EXPORT_SYMBOL(bitmap_cond_end_sync);
1551static void bitmap_set_memory_bits(struct bitmap *bitmap, sector_t offset, int needed) 1567static void bitmap_set_memory_bits(struct bitmap *bitmap, sector_t offset, int needed)
1552{ 1568{
1553 /* For each chunk covered by any of these sectors, set the 1569 /* For each chunk covered by any of these sectors, set the
1554 * counter to 1 and set resync_needed. They should all 1570 * counter to 2 and possibly set resync_needed. They should all
1555 * be 0 at this point 1571 * be 0 at this point
1556 */ 1572 */
1557 1573
@@ -1678,10 +1694,6 @@ int bitmap_create(struct mddev *mddev)
1678 1694
1679 BUILD_BUG_ON(sizeof(bitmap_super_t) != 256); 1695 BUILD_BUG_ON(sizeof(bitmap_super_t) != 256);
1680 1696
1681 if (!file
1682 && !mddev->bitmap_info.offset) /* bitmap disabled, nothing to do */
1683 return 0;
1684
1685 BUG_ON(file && mddev->bitmap_info.offset); 1697 BUG_ON(file && mddev->bitmap_info.offset);
1686 1698
1687 bitmap = kzalloc(sizeof(*bitmap), GFP_KERNEL); 1699 bitmap = kzalloc(sizeof(*bitmap), GFP_KERNEL);
@@ -1801,6 +1813,10 @@ int bitmap_load(struct mddev *mddev)
1801 1813
1802 if (err) 1814 if (err)
1803 goto out; 1815 goto out;
1816 bitmap_mask_state(bitmap, BITMAP_STALE, MASK_UNSET);
1817
1818 /* Kick recovery in case any bits were set */
1819 set_bit(MD_RECOVERY_NEEDED, &bitmap->mddev->recovery);
1804 1820
1805 mddev->thread->timeout = mddev->bitmap_info.daemon_sleep; 1821 mddev->thread->timeout = mddev->bitmap_info.daemon_sleep;
1806 md_wakeup_thread(mddev->thread); 1822 md_wakeup_thread(mddev->thread);