aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/bitmap.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/md/bitmap.c')
-rw-r--r--drivers/md/bitmap.c44
1 files changed, 21 insertions, 23 deletions
diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c
index c3faa6a43de1..519b1bf7a09a 100644
--- a/drivers/md/bitmap.c
+++ b/drivers/md/bitmap.c
@@ -406,11 +406,11 @@ int bitmap_update_sb(struct bitmap *bitmap)
406 return 0; 406 return 0;
407 } 407 }
408 spin_unlock_irqrestore(&bitmap->lock, flags); 408 spin_unlock_irqrestore(&bitmap->lock, flags);
409 sb = (bitmap_super_t *)kmap(bitmap->sb_page); 409 sb = (bitmap_super_t *)kmap_atomic(bitmap->sb_page, KM_USER0);
410 sb->events = cpu_to_le64(bitmap->mddev->events); 410 sb->events = cpu_to_le64(bitmap->mddev->events);
411 if (!bitmap->mddev->degraded) 411 if (!bitmap->mddev->degraded)
412 sb->events_cleared = cpu_to_le64(bitmap->mddev->events); 412 sb->events_cleared = cpu_to_le64(bitmap->mddev->events);
413 kunmap(bitmap->sb_page); 413 kunmap_atomic(sb, KM_USER0);
414 return write_page(bitmap, bitmap->sb_page, 1); 414 return write_page(bitmap, bitmap->sb_page, 1);
415} 415}
416 416
@@ -421,7 +421,7 @@ void bitmap_print_sb(struct bitmap *bitmap)
421 421
422 if (!bitmap || !bitmap->sb_page) 422 if (!bitmap || !bitmap->sb_page)
423 return; 423 return;
424 sb = (bitmap_super_t *)kmap(bitmap->sb_page); 424 sb = (bitmap_super_t *)kmap_atomic(bitmap->sb_page, KM_USER0);
425 printk(KERN_DEBUG "%s: bitmap file superblock:\n", bmname(bitmap)); 425 printk(KERN_DEBUG "%s: bitmap file superblock:\n", bmname(bitmap));
426 printk(KERN_DEBUG " magic: %08x\n", le32_to_cpu(sb->magic)); 426 printk(KERN_DEBUG " magic: %08x\n", le32_to_cpu(sb->magic));
427 printk(KERN_DEBUG " version: %d\n", le32_to_cpu(sb->version)); 427 printk(KERN_DEBUG " version: %d\n", le32_to_cpu(sb->version));
@@ -440,7 +440,7 @@ void bitmap_print_sb(struct bitmap *bitmap)
440 printk(KERN_DEBUG " sync size: %llu KB\n", 440 printk(KERN_DEBUG " sync size: %llu KB\n",
441 (unsigned long long)le64_to_cpu(sb->sync_size)/2); 441 (unsigned long long)le64_to_cpu(sb->sync_size)/2);
442 printk(KERN_DEBUG "max write behind: %d\n", le32_to_cpu(sb->write_behind)); 442 printk(KERN_DEBUG "max write behind: %d\n", le32_to_cpu(sb->write_behind));
443 kunmap(bitmap->sb_page); 443 kunmap_atomic(sb, KM_USER0);
444} 444}
445 445
446/* read the superblock from the bitmap file and initialize some bitmap fields */ 446/* read the superblock from the bitmap file and initialize some bitmap fields */
@@ -466,7 +466,7 @@ static int bitmap_read_sb(struct bitmap *bitmap)
466 return err; 466 return err;
467 } 467 }
468 468
469 sb = (bitmap_super_t *)kmap(bitmap->sb_page); 469 sb = (bitmap_super_t *)kmap_atomic(bitmap->sb_page, KM_USER0);
470 470
471 if (bytes_read < sizeof(*sb)) { /* short read */ 471 if (bytes_read < sizeof(*sb)) { /* short read */
472 printk(KERN_INFO "%s: bitmap file superblock truncated\n", 472 printk(KERN_INFO "%s: bitmap file superblock truncated\n",
@@ -535,7 +535,7 @@ success:
535 bitmap->events_cleared = bitmap->mddev->events; 535 bitmap->events_cleared = bitmap->mddev->events;
536 err = 0; 536 err = 0;
537out: 537out:
538 kunmap(bitmap->sb_page); 538 kunmap_atomic(sb, KM_USER0);
539 if (err) 539 if (err)
540 bitmap_print_sb(bitmap); 540 bitmap_print_sb(bitmap);
541 return err; 541 return err;
@@ -560,7 +560,7 @@ static void bitmap_mask_state(struct bitmap *bitmap, enum bitmap_state bits,
560 } 560 }
561 get_page(bitmap->sb_page); 561 get_page(bitmap->sb_page);
562 spin_unlock_irqrestore(&bitmap->lock, flags); 562 spin_unlock_irqrestore(&bitmap->lock, flags);
563 sb = (bitmap_super_t *)kmap(bitmap->sb_page); 563 sb = (bitmap_super_t *)kmap_atomic(bitmap->sb_page, KM_USER0);
564 switch (op) { 564 switch (op) {
565 case MASK_SET: sb->state |= bits; 565 case MASK_SET: sb->state |= bits;
566 break; 566 break;
@@ -568,7 +568,7 @@ static void bitmap_mask_state(struct bitmap *bitmap, enum bitmap_state bits,
568 break; 568 break;
569 default: BUG(); 569 default: BUG();
570 } 570 }
571 kunmap(bitmap->sb_page); 571 kunmap_atomic(sb, KM_USER0);
572 put_page(bitmap->sb_page); 572 put_page(bitmap->sb_page);
573} 573}
574 574
@@ -854,6 +854,7 @@ static int bitmap_init_from_disk(struct bitmap *bitmap, sector_t start)
854 unsigned long bytes, offset, dummy; 854 unsigned long bytes, offset, dummy;
855 int outofdate; 855 int outofdate;
856 int ret = -ENOSPC; 856 int ret = -ENOSPC;
857 void *paddr;
857 858
858 chunks = bitmap->chunks; 859 chunks = bitmap->chunks;
859 file = bitmap->file; 860 file = bitmap->file;
@@ -899,8 +900,6 @@ static int bitmap_init_from_disk(struct bitmap *bitmap, sector_t start)
899 bit = file_page_offset(i); 900 bit = file_page_offset(i);
900 if (index != oldindex) { /* this is a new page, read it in */ 901 if (index != oldindex) { /* this is a new page, read it in */
901 /* unmap the old page, we're done with it */ 902 /* unmap the old page, we're done with it */
902 if (oldpage != NULL)
903 kunmap(oldpage);
904 if (index == 0) { 903 if (index == 0) {
905 /* 904 /*
906 * if we're here then the superblock page 905 * if we're here then the superblock page
@@ -923,18 +922,18 @@ static int bitmap_init_from_disk(struct bitmap *bitmap, sector_t start)
923 922
924 oldindex = index; 923 oldindex = index;
925 oldpage = page; 924 oldpage = page;
926 kmap(page);
927 925
928 if (outofdate) { 926 if (outofdate) {
929 /* 927 /*
930 * if bitmap is out of date, dirty the 928 * if bitmap is out of date, dirty the
931 * whole page and write it out 929 * whole page and write it out
932 */ 930 */
933 memset(page_address(page) + offset, 0xff, 931 paddr = kmap_atomic(page, KM_USER0);
932 memset(paddr + offset, 0xff,
934 PAGE_SIZE - offset); 933 PAGE_SIZE - offset);
934 kunmap_atomic(paddr, KM_USER0);
935 ret = write_page(bitmap, page, 1); 935 ret = write_page(bitmap, page, 1);
936 if (ret) { 936 if (ret) {
937 kunmap(page);
938 /* release, page not in filemap yet */ 937 /* release, page not in filemap yet */
939 put_page(page); 938 put_page(page);
940 goto out; 939 goto out;
@@ -943,10 +942,12 @@ static int bitmap_init_from_disk(struct bitmap *bitmap, sector_t start)
943 942
944 bitmap->filemap[bitmap->file_pages++] = page; 943 bitmap->filemap[bitmap->file_pages++] = page;
945 } 944 }
945 paddr = kmap_atomic(page, KM_USER0);
946 if (bitmap->flags & BITMAP_HOSTENDIAN) 946 if (bitmap->flags & BITMAP_HOSTENDIAN)
947 b = test_bit(bit, page_address(page)); 947 b = test_bit(bit, paddr);
948 else 948 else
949 b = ext2_test_bit(bit, page_address(page)); 949 b = ext2_test_bit(bit, paddr);
950 kunmap_atomic(paddr, KM_USER0);
950 if (b) { 951 if (b) {
951 /* if the disk bit is set, set the memory bit */ 952 /* if the disk bit is set, set the memory bit */
952 bitmap_set_memory_bits(bitmap, i << CHUNK_BLOCK_SHIFT(bitmap), 953 bitmap_set_memory_bits(bitmap, i << CHUNK_BLOCK_SHIFT(bitmap),
@@ -961,9 +962,6 @@ static int bitmap_init_from_disk(struct bitmap *bitmap, sector_t start)
961 ret = 0; 962 ret = 0;
962 bitmap_mask_state(bitmap, BITMAP_STALE, MASK_UNSET); 963 bitmap_mask_state(bitmap, BITMAP_STALE, MASK_UNSET);
963 964
964 if (page) /* unmap the last page */
965 kunmap(page);
966
967 if (bit_cnt) { /* Kick recovery if any bits were set */ 965 if (bit_cnt) { /* Kick recovery if any bits were set */
968 set_bit(MD_RECOVERY_NEEDED, &bitmap->mddev->recovery); 966 set_bit(MD_RECOVERY_NEEDED, &bitmap->mddev->recovery);
969 md_wakeup_thread(bitmap->mddev->thread); 967 md_wakeup_thread(bitmap->mddev->thread);
@@ -1019,6 +1017,7 @@ int bitmap_daemon_work(struct bitmap *bitmap)
1019 int err = 0; 1017 int err = 0;
1020 int blocks; 1018 int blocks;
1021 int attr; 1019 int attr;
1020 void *paddr;
1022 1021
1023 if (bitmap == NULL) 1022 if (bitmap == NULL)
1024 return 0; 1023 return 0;
@@ -1075,14 +1074,12 @@ int bitmap_daemon_work(struct bitmap *bitmap)
1075 set_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE); 1074 set_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE);
1076 spin_unlock_irqrestore(&bitmap->lock, flags); 1075 spin_unlock_irqrestore(&bitmap->lock, flags);
1077 } 1076 }
1078 kunmap(lastpage);
1079 put_page(lastpage); 1077 put_page(lastpage);
1080 if (err) 1078 if (err)
1081 bitmap_file_kick(bitmap); 1079 bitmap_file_kick(bitmap);
1082 } else 1080 } else
1083 spin_unlock_irqrestore(&bitmap->lock, flags); 1081 spin_unlock_irqrestore(&bitmap->lock, flags);
1084 lastpage = page; 1082 lastpage = page;
1085 kmap(page);
1086/* 1083/*
1087 printk("bitmap clean at page %lu\n", j); 1084 printk("bitmap clean at page %lu\n", j);
1088*/ 1085*/
@@ -1105,10 +1102,12 @@ int bitmap_daemon_work(struct bitmap *bitmap)
1105 -1); 1102 -1);
1106 1103
1107 /* clear the bit */ 1104 /* clear the bit */
1105 paddr = kmap_atomic(page, KM_USER0);
1108 if (bitmap->flags & BITMAP_HOSTENDIAN) 1106 if (bitmap->flags & BITMAP_HOSTENDIAN)
1109 clear_bit(file_page_offset(j), page_address(page)); 1107 clear_bit(file_page_offset(j), paddr);
1110 else 1108 else
1111 ext2_clear_bit(file_page_offset(j), page_address(page)); 1109 ext2_clear_bit(file_page_offset(j), paddr);
1110 kunmap_atomic(paddr, KM_USER0);
1112 } 1111 }
1113 } 1112 }
1114 spin_unlock_irqrestore(&bitmap->lock, flags); 1113 spin_unlock_irqrestore(&bitmap->lock, flags);
@@ -1116,7 +1115,6 @@ int bitmap_daemon_work(struct bitmap *bitmap)
1116 1115
1117 /* now sync the final page */ 1116 /* now sync the final page */
1118 if (lastpage != NULL) { 1117 if (lastpage != NULL) {
1119 kunmap(lastpage);
1120 spin_lock_irqsave(&bitmap->lock, flags); 1118 spin_lock_irqsave(&bitmap->lock, flags);
1121 if (get_page_attr(bitmap, lastpage) &BITMAP_PAGE_NEEDWRITE) { 1119 if (get_page_attr(bitmap, lastpage) &BITMAP_PAGE_NEEDWRITE) {
1122 clear_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE); 1120 clear_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE);