diff options
| -rw-r--r-- | drivers/md/bitmap.c | 140 | ||||
| -rw-r--r-- | drivers/md/md.c | 3 | ||||
| -rw-r--r-- | drivers/md/raid1.c | 3 | ||||
| -rw-r--r-- | drivers/md/raid10.c | 3 | ||||
| -rw-r--r-- | include/linux/raid/bitmap.h | 6 |
5 files changed, 78 insertions, 77 deletions
diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c index ae94f3beb5fc..927cb34c4805 100644 --- a/drivers/md/bitmap.c +++ b/drivers/md/bitmap.c | |||
| @@ -305,10 +305,11 @@ static int write_sb_page(struct bitmap *bitmap, struct page *page, int wait) | |||
| 305 | return 0; | 305 | return 0; |
| 306 | } | 306 | } |
| 307 | 307 | ||
| 308 | static void bitmap_file_kick(struct bitmap *bitmap); | ||
| 308 | /* | 309 | /* |
| 309 | * write out a page to a file | 310 | * write out a page to a file |
| 310 | */ | 311 | */ |
| 311 | static int write_page(struct bitmap *bitmap, struct page *page, int wait) | 312 | static void write_page(struct bitmap *bitmap, struct page *page, int wait) |
| 312 | { | 313 | { |
| 313 | struct buffer_head *bh; | 314 | struct buffer_head *bh; |
| 314 | 315 | ||
| @@ -316,27 +317,26 @@ static int write_page(struct bitmap *bitmap, struct page *page, int wait) | |||
| 316 | switch (write_sb_page(bitmap, page, wait)) { | 317 | switch (write_sb_page(bitmap, page, wait)) { |
| 317 | case -EINVAL: | 318 | case -EINVAL: |
| 318 | bitmap->flags |= BITMAP_WRITE_ERROR; | 319 | bitmap->flags |= BITMAP_WRITE_ERROR; |
| 319 | return -EIO; | ||
| 320 | } | 320 | } |
| 321 | return 0; | 321 | } else { |
| 322 | } | ||
| 323 | 322 | ||
| 324 | bh = page_buffers(page); | 323 | bh = page_buffers(page); |
| 325 | 324 | ||
| 326 | while (bh && bh->b_blocknr) { | 325 | while (bh && bh->b_blocknr) { |
| 327 | atomic_inc(&bitmap->pending_writes); | 326 | atomic_inc(&bitmap->pending_writes); |
| 328 | set_buffer_locked(bh); | 327 | set_buffer_locked(bh); |
| 329 | set_buffer_mapped(bh); | 328 | set_buffer_mapped(bh); |
| 330 | submit_bh(WRITE, bh); | 329 | submit_bh(WRITE, bh); |
| 331 | bh = bh->b_this_page; | 330 | bh = bh->b_this_page; |
| 332 | } | 331 | } |
| 333 | 332 | ||
| 334 | if (wait) { | 333 | if (wait) { |
| 335 | wait_event(bitmap->write_wait, | 334 | wait_event(bitmap->write_wait, |
| 336 | atomic_read(&bitmap->pending_writes)==0); | 335 | atomic_read(&bitmap->pending_writes)==0); |
| 337 | return (bitmap->flags & BITMAP_WRITE_ERROR) ? -EIO : 0; | 336 | } |
| 338 | } | 337 | } |
| 339 | return 0; | 338 | if (bitmap->flags & BITMAP_WRITE_ERROR) |
| 339 | bitmap_file_kick(bitmap); | ||
| 340 | } | 340 | } |
| 341 | 341 | ||
| 342 | static void end_bitmap_write(struct buffer_head *bh, int uptodate) | 342 | static void end_bitmap_write(struct buffer_head *bh, int uptodate) |
| @@ -456,17 +456,17 @@ out: | |||
| 456 | */ | 456 | */ |
| 457 | 457 | ||
| 458 | /* update the event counter and sync the superblock to disk */ | 458 | /* update the event counter and sync the superblock to disk */ |
| 459 | int bitmap_update_sb(struct bitmap *bitmap) | 459 | void bitmap_update_sb(struct bitmap *bitmap) |
| 460 | { | 460 | { |
| 461 | bitmap_super_t *sb; | 461 | bitmap_super_t *sb; |
| 462 | unsigned long flags; | 462 | unsigned long flags; |
| 463 | 463 | ||
| 464 | if (!bitmap || !bitmap->mddev) /* no bitmap for this array */ | 464 | if (!bitmap || !bitmap->mddev) /* no bitmap for this array */ |
| 465 | return 0; | 465 | return; |
| 466 | spin_lock_irqsave(&bitmap->lock, flags); | 466 | spin_lock_irqsave(&bitmap->lock, flags); |
| 467 | if (!bitmap->sb_page) { /* no superblock */ | 467 | if (!bitmap->sb_page) { /* no superblock */ |
| 468 | spin_unlock_irqrestore(&bitmap->lock, flags); | 468 | spin_unlock_irqrestore(&bitmap->lock, flags); |
| 469 | return 0; | 469 | return; |
| 470 | } | 470 | } |
| 471 | spin_unlock_irqrestore(&bitmap->lock, flags); | 471 | spin_unlock_irqrestore(&bitmap->lock, flags); |
| 472 | sb = (bitmap_super_t *)kmap_atomic(bitmap->sb_page, KM_USER0); | 472 | sb = (bitmap_super_t *)kmap_atomic(bitmap->sb_page, KM_USER0); |
| @@ -474,7 +474,7 @@ int bitmap_update_sb(struct bitmap *bitmap) | |||
| 474 | if (!bitmap->mddev->degraded) | 474 | if (!bitmap->mddev->degraded) |
| 475 | sb->events_cleared = cpu_to_le64(bitmap->mddev->events); | 475 | sb->events_cleared = cpu_to_le64(bitmap->mddev->events); |
| 476 | kunmap_atomic(sb, KM_USER0); | 476 | kunmap_atomic(sb, KM_USER0); |
| 477 | return write_page(bitmap, bitmap->sb_page, 1); | 477 | write_page(bitmap, bitmap->sb_page, 1); |
| 478 | } | 478 | } |
| 479 | 479 | ||
| 480 | /* print out the bitmap file superblock */ | 480 | /* print out the bitmap file superblock */ |
| @@ -603,20 +603,22 @@ enum bitmap_mask_op { | |||
| 603 | MASK_UNSET | 603 | MASK_UNSET |
| 604 | }; | 604 | }; |
| 605 | 605 | ||
| 606 | /* record the state of the bitmap in the superblock */ | 606 | /* record the state of the bitmap in the superblock. Return the old value */ |
| 607 | static void bitmap_mask_state(struct bitmap *bitmap, enum bitmap_state bits, | 607 | static int bitmap_mask_state(struct bitmap *bitmap, enum bitmap_state bits, |
| 608 | enum bitmap_mask_op op) | 608 | enum bitmap_mask_op op) |
| 609 | { | 609 | { |
| 610 | bitmap_super_t *sb; | 610 | bitmap_super_t *sb; |
| 611 | unsigned long flags; | 611 | unsigned long flags; |
| 612 | int old; | ||
| 612 | 613 | ||
| 613 | spin_lock_irqsave(&bitmap->lock, flags); | 614 | spin_lock_irqsave(&bitmap->lock, flags); |
| 614 | if (!bitmap->sb_page) { /* can't set the state */ | 615 | if (!bitmap->sb_page) { /* can't set the state */ |
| 615 | spin_unlock_irqrestore(&bitmap->lock, flags); | 616 | spin_unlock_irqrestore(&bitmap->lock, flags); |
| 616 | return; | 617 | return 0; |
| 617 | } | 618 | } |
| 618 | spin_unlock_irqrestore(&bitmap->lock, flags); | 619 | spin_unlock_irqrestore(&bitmap->lock, flags); |
| 619 | sb = (bitmap_super_t *)kmap_atomic(bitmap->sb_page, KM_USER0); | 620 | sb = (bitmap_super_t *)kmap_atomic(bitmap->sb_page, KM_USER0); |
| 621 | old = le32_to_cpu(sb->state) & bits; | ||
| 620 | switch (op) { | 622 | switch (op) { |
| 621 | case MASK_SET: sb->state |= cpu_to_le32(bits); | 623 | case MASK_SET: sb->state |= cpu_to_le32(bits); |
| 622 | break; | 624 | break; |
| @@ -625,6 +627,7 @@ static void bitmap_mask_state(struct bitmap *bitmap, enum bitmap_state bits, | |||
| 625 | default: BUG(); | 627 | default: BUG(); |
| 626 | } | 628 | } |
| 627 | kunmap_atomic(sb, KM_USER0); | 629 | kunmap_atomic(sb, KM_USER0); |
| 630 | return old; | ||
| 628 | } | 631 | } |
| 629 | 632 | ||
| 630 | /* | 633 | /* |
| @@ -718,18 +721,23 @@ static void bitmap_file_kick(struct bitmap *bitmap) | |||
| 718 | { | 721 | { |
| 719 | char *path, *ptr = NULL; | 722 | char *path, *ptr = NULL; |
| 720 | 723 | ||
| 721 | bitmap_mask_state(bitmap, BITMAP_STALE, MASK_SET); | 724 | if (bitmap_mask_state(bitmap, BITMAP_STALE, MASK_SET) == 0) { |
| 722 | bitmap_update_sb(bitmap); | 725 | bitmap_update_sb(bitmap); |
| 723 | 726 | ||
| 724 | if (bitmap->file) { | 727 | if (bitmap->file) { |
| 725 | path = kmalloc(PAGE_SIZE, GFP_KERNEL); | 728 | path = kmalloc(PAGE_SIZE, GFP_KERNEL); |
| 726 | if (path) | 729 | if (path) |
| 727 | ptr = file_path(bitmap->file, path, PAGE_SIZE); | 730 | ptr = file_path(bitmap->file, path, PAGE_SIZE); |
| 728 | 731 | ||
| 729 | printk(KERN_ALERT "%s: kicking failed bitmap file %s from array!\n", | 732 | printk(KERN_ALERT |
| 730 | bmname(bitmap), ptr ? ptr : ""); | 733 | "%s: kicking failed bitmap file %s from array!\n", |
| 734 | bmname(bitmap), ptr ? ptr : ""); | ||
| 731 | 735 | ||
| 732 | kfree(path); | 736 | kfree(path); |
| 737 | } else | ||
| 738 | printk(KERN_ALERT | ||
| 739 | "%s: disabling internal bitmap due to errors\n", | ||
| 740 | bmname(bitmap)); | ||
| 733 | } | 741 | } |
| 734 | 742 | ||
| 735 | bitmap_file_put(bitmap); | 743 | bitmap_file_put(bitmap); |
| @@ -800,16 +808,15 @@ static void bitmap_file_set_bit(struct bitmap *bitmap, sector_t block) | |||
| 800 | /* this gets called when the md device is ready to unplug its underlying | 808 | /* this gets called when the md device is ready to unplug its underlying |
| 801 | * (slave) device queues -- before we let any writes go down, we need to | 809 | * (slave) device queues -- before we let any writes go down, we need to |
| 802 | * sync the dirty pages of the bitmap file to disk */ | 810 | * sync the dirty pages of the bitmap file to disk */ |
| 803 | int bitmap_unplug(struct bitmap *bitmap) | 811 | void bitmap_unplug(struct bitmap *bitmap) |
| 804 | { | 812 | { |
| 805 | unsigned long i, flags; | 813 | unsigned long i, flags; |
| 806 | int dirty, need_write; | 814 | int dirty, need_write; |
| 807 | struct page *page; | 815 | struct page *page; |
| 808 | int wait = 0; | 816 | int wait = 0; |
| 809 | int err; | ||
| 810 | 817 | ||
| 811 | if (!bitmap) | 818 | if (!bitmap) |
| 812 | return 0; | 819 | return; |
| 813 | 820 | ||
| 814 | /* look at each page to see if there are any set bits that need to be | 821 | /* look at each page to see if there are any set bits that need to be |
| 815 | * flushed out to disk */ | 822 | * flushed out to disk */ |
| @@ -817,7 +824,7 @@ int bitmap_unplug(struct bitmap *bitmap) | |||
| 817 | spin_lock_irqsave(&bitmap->lock, flags); | 824 | spin_lock_irqsave(&bitmap->lock, flags); |
| 818 | if (!bitmap->filemap) { | 825 | if (!bitmap->filemap) { |
| 819 | spin_unlock_irqrestore(&bitmap->lock, flags); | 826 | spin_unlock_irqrestore(&bitmap->lock, flags); |
| 820 | return 0; | 827 | return; |
| 821 | } | 828 | } |
| 822 | page = bitmap->filemap[i]; | 829 | page = bitmap->filemap[i]; |
| 823 | dirty = test_page_attr(bitmap, page, BITMAP_PAGE_DIRTY); | 830 | dirty = test_page_attr(bitmap, page, BITMAP_PAGE_DIRTY); |
| @@ -829,7 +836,7 @@ int bitmap_unplug(struct bitmap *bitmap) | |||
| 829 | spin_unlock_irqrestore(&bitmap->lock, flags); | 836 | spin_unlock_irqrestore(&bitmap->lock, flags); |
| 830 | 837 | ||
| 831 | if (dirty | need_write) | 838 | if (dirty | need_write) |
| 832 | err = write_page(bitmap, page, 0); | 839 | write_page(bitmap, page, 0); |
| 833 | } | 840 | } |
| 834 | if (wait) { /* if any writes were performed, we need to wait on them */ | 841 | if (wait) { /* if any writes were performed, we need to wait on them */ |
| 835 | if (bitmap->file) | 842 | if (bitmap->file) |
| @@ -840,7 +847,6 @@ int bitmap_unplug(struct bitmap *bitmap) | |||
| 840 | } | 847 | } |
| 841 | if (bitmap->flags & BITMAP_WRITE_ERROR) | 848 | if (bitmap->flags & BITMAP_WRITE_ERROR) |
| 842 | bitmap_file_kick(bitmap); | 849 | bitmap_file_kick(bitmap); |
| 843 | return 0; | ||
| 844 | } | 850 | } |
| 845 | 851 | ||
| 846 | static void bitmap_set_memory_bits(struct bitmap *bitmap, sector_t offset, int needed); | 852 | static void bitmap_set_memory_bits(struct bitmap *bitmap, sector_t offset, int needed); |
| @@ -889,21 +895,21 @@ static int bitmap_init_from_disk(struct bitmap *bitmap, sector_t start) | |||
| 889 | bmname(bitmap), | 895 | bmname(bitmap), |
| 890 | (unsigned long) i_size_read(file->f_mapping->host), | 896 | (unsigned long) i_size_read(file->f_mapping->host), |
| 891 | bytes + sizeof(bitmap_super_t)); | 897 | bytes + sizeof(bitmap_super_t)); |
| 892 | goto out; | 898 | goto err; |
| 893 | } | 899 | } |
| 894 | 900 | ||
| 895 | ret = -ENOMEM; | 901 | ret = -ENOMEM; |
| 896 | 902 | ||
| 897 | bitmap->filemap = kmalloc(sizeof(struct page *) * num_pages, GFP_KERNEL); | 903 | bitmap->filemap = kmalloc(sizeof(struct page *) * num_pages, GFP_KERNEL); |
| 898 | if (!bitmap->filemap) | 904 | if (!bitmap->filemap) |
| 899 | goto out; | 905 | goto err; |
| 900 | 906 | ||
| 901 | /* We need 4 bits per page, rounded up to a multiple of sizeof(unsigned long) */ | 907 | /* We need 4 bits per page, rounded up to a multiple of sizeof(unsigned long) */ |
| 902 | bitmap->filemap_attr = kzalloc( | 908 | bitmap->filemap_attr = kzalloc( |
| 903 | roundup( DIV_ROUND_UP(num_pages*4, 8), sizeof(unsigned long)), | 909 | roundup( DIV_ROUND_UP(num_pages*4, 8), sizeof(unsigned long)), |
| 904 | GFP_KERNEL); | 910 | GFP_KERNEL); |
| 905 | if (!bitmap->filemap_attr) | 911 | if (!bitmap->filemap_attr) |
| 906 | goto out; | 912 | goto err; |
| 907 | 913 | ||
| 908 | oldindex = ~0L; | 914 | oldindex = ~0L; |
| 909 | 915 | ||
| @@ -936,7 +942,7 @@ static int bitmap_init_from_disk(struct bitmap *bitmap, sector_t start) | |||
| 936 | } | 942 | } |
| 937 | if (IS_ERR(page)) { /* read error */ | 943 | if (IS_ERR(page)) { /* read error */ |
| 938 | ret = PTR_ERR(page); | 944 | ret = PTR_ERR(page); |
| 939 | goto out; | 945 | goto err; |
| 940 | } | 946 | } |
| 941 | 947 | ||
| 942 | oldindex = index; | 948 | oldindex = index; |
| @@ -951,11 +957,13 @@ static int bitmap_init_from_disk(struct bitmap *bitmap, sector_t start) | |||
| 951 | memset(paddr + offset, 0xff, | 957 | memset(paddr + offset, 0xff, |
| 952 | PAGE_SIZE - offset); | 958 | PAGE_SIZE - offset); |
| 953 | kunmap_atomic(paddr, KM_USER0); | 959 | kunmap_atomic(paddr, KM_USER0); |
| 954 | ret = write_page(bitmap, page, 1); | 960 | write_page(bitmap, page, 1); |
| 955 | if (ret) { | 961 | |
| 962 | ret = -EIO; | ||
| 963 | if (bitmap->flags & BITMAP_WRITE_ERROR) { | ||
| 956 | /* release, page not in filemap yet */ | 964 | /* release, page not in filemap yet */ |
| 957 | put_page(page); | 965 | put_page(page); |
| 958 | goto out; | 966 | goto err; |
| 959 | } | 967 | } |
| 960 | } | 968 | } |
| 961 | 969 | ||
| @@ -987,11 +995,15 @@ static int bitmap_init_from_disk(struct bitmap *bitmap, sector_t start) | |||
| 987 | md_wakeup_thread(bitmap->mddev->thread); | 995 | md_wakeup_thread(bitmap->mddev->thread); |
| 988 | } | 996 | } |
| 989 | 997 | ||
| 990 | out: | ||
| 991 | printk(KERN_INFO "%s: bitmap initialized from disk: " | 998 | printk(KERN_INFO "%s: bitmap initialized from disk: " |
| 992 | "read %lu/%lu pages, set %lu bits, status: %d\n", | 999 | "read %lu/%lu pages, set %lu bits\n", |
| 993 | bmname(bitmap), bitmap->file_pages, num_pages, bit_cnt, ret); | 1000 | bmname(bitmap), bitmap->file_pages, num_pages, bit_cnt); |
| 1001 | |||
| 1002 | return 0; | ||
| 994 | 1003 | ||
| 1004 | err: | ||
| 1005 | printk(KERN_INFO "%s: bitmap initialisation failed: %d\n", | ||
| 1006 | bmname(bitmap), ret); | ||
| 995 | return ret; | 1007 | return ret; |
| 996 | } | 1008 | } |
| 997 | 1009 | ||
| @@ -1028,19 +1040,18 @@ static bitmap_counter_t *bitmap_get_counter(struct bitmap *bitmap, | |||
| 1028 | * out to disk | 1040 | * out to disk |
| 1029 | */ | 1041 | */ |
| 1030 | 1042 | ||
| 1031 | int bitmap_daemon_work(struct bitmap *bitmap) | 1043 | void bitmap_daemon_work(struct bitmap *bitmap) |
| 1032 | { | 1044 | { |
| 1033 | unsigned long j; | 1045 | unsigned long j; |
| 1034 | unsigned long flags; | 1046 | unsigned long flags; |
| 1035 | struct page *page = NULL, *lastpage = NULL; | 1047 | struct page *page = NULL, *lastpage = NULL; |
| 1036 | int err = 0; | ||
| 1037 | int blocks; | 1048 | int blocks; |
| 1038 | void *paddr; | 1049 | void *paddr; |
| 1039 | 1050 | ||
| 1040 | if (bitmap == NULL) | 1051 | if (bitmap == NULL) |
| 1041 | return 0; | 1052 | return; |
| 1042 | if (time_before(jiffies, bitmap->daemon_lastrun + bitmap->daemon_sleep*HZ)) | 1053 | if (time_before(jiffies, bitmap->daemon_lastrun + bitmap->daemon_sleep*HZ)) |
| 1043 | return 0; | 1054 | return; |
| 1044 | bitmap->daemon_lastrun = jiffies; | 1055 | bitmap->daemon_lastrun = jiffies; |
| 1045 | 1056 | ||
| 1046 | for (j = 0; j < bitmap->chunks; j++) { | 1057 | for (j = 0; j < bitmap->chunks; j++) { |
| @@ -1063,14 +1074,8 @@ int bitmap_daemon_work(struct bitmap *bitmap) | |||
| 1063 | clear_page_attr(bitmap, page, BITMAP_PAGE_NEEDWRITE); | 1074 | clear_page_attr(bitmap, page, BITMAP_PAGE_NEEDWRITE); |
| 1064 | 1075 | ||
| 1065 | spin_unlock_irqrestore(&bitmap->lock, flags); | 1076 | spin_unlock_irqrestore(&bitmap->lock, flags); |
| 1066 | if (need_write) { | 1077 | if (need_write) |
| 1067 | switch (write_page(bitmap, page, 0)) { | 1078 | write_page(bitmap, page, 0); |
| 1068 | case 0: | ||
| 1069 | break; | ||
| 1070 | default: | ||
| 1071 | bitmap_file_kick(bitmap); | ||
| 1072 | } | ||
| 1073 | } | ||
| 1074 | continue; | 1079 | continue; |
| 1075 | } | 1080 | } |
| 1076 | 1081 | ||
| @@ -1079,13 +1084,11 @@ int bitmap_daemon_work(struct bitmap *bitmap) | |||
| 1079 | if (test_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE)) { | 1084 | if (test_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE)) { |
| 1080 | clear_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE); | 1085 | clear_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE); |
| 1081 | spin_unlock_irqrestore(&bitmap->lock, flags); | 1086 | spin_unlock_irqrestore(&bitmap->lock, flags); |
| 1082 | err = write_page(bitmap, lastpage, 0); | 1087 | write_page(bitmap, lastpage, 0); |
| 1083 | } else { | 1088 | } else { |
| 1084 | set_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE); | 1089 | set_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE); |
| 1085 | spin_unlock_irqrestore(&bitmap->lock, flags); | 1090 | spin_unlock_irqrestore(&bitmap->lock, flags); |
| 1086 | } | 1091 | } |
| 1087 | if (err) | ||
| 1088 | bitmap_file_kick(bitmap); | ||
| 1089 | } else | 1092 | } else |
| 1090 | spin_unlock_irqrestore(&bitmap->lock, flags); | 1093 | spin_unlock_irqrestore(&bitmap->lock, flags); |
| 1091 | lastpage = page; | 1094 | lastpage = page; |
| @@ -1128,14 +1131,13 @@ int bitmap_daemon_work(struct bitmap *bitmap) | |||
| 1128 | if (test_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE)) { | 1131 | if (test_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE)) { |
| 1129 | clear_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE); | 1132 | clear_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE); |
| 1130 | spin_unlock_irqrestore(&bitmap->lock, flags); | 1133 | spin_unlock_irqrestore(&bitmap->lock, flags); |
| 1131 | err = write_page(bitmap, lastpage, 0); | 1134 | write_page(bitmap, lastpage, 0); |
| 1132 | } else { | 1135 | } else { |
| 1133 | set_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE); | 1136 | set_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE); |
| 1134 | spin_unlock_irqrestore(&bitmap->lock, flags); | 1137 | spin_unlock_irqrestore(&bitmap->lock, flags); |
| 1135 | } | 1138 | } |
| 1136 | } | 1139 | } |
| 1137 | 1140 | ||
| 1138 | return err; | ||
| 1139 | } | 1141 | } |
| 1140 | 1142 | ||
| 1141 | static bitmap_counter_t *bitmap_get_counter(struct bitmap *bitmap, | 1143 | static bitmap_counter_t *bitmap_get_counter(struct bitmap *bitmap, |
| @@ -1548,7 +1550,9 @@ int bitmap_create(mddev_t *mddev) | |||
| 1548 | 1550 | ||
| 1549 | mddev->thread->timeout = bitmap->daemon_sleep * HZ; | 1551 | mddev->thread->timeout = bitmap->daemon_sleep * HZ; |
| 1550 | 1552 | ||
| 1551 | return bitmap_update_sb(bitmap); | 1553 | bitmap_update_sb(bitmap); |
| 1554 | |||
| 1555 | return (bitmap->flags & BITMAP_WRITE_ERROR) ? -EIO : 0; | ||
| 1552 | 1556 | ||
| 1553 | error: | 1557 | error: |
| 1554 | bitmap_free(bitmap); | 1558 | bitmap_free(bitmap); |
diff --git a/drivers/md/md.c b/drivers/md/md.c index 36c05ba7855a..65ddc887dfd7 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
| @@ -1640,7 +1640,6 @@ static void sync_sbs(mddev_t * mddev, int nospares) | |||
| 1640 | 1640 | ||
| 1641 | static void md_update_sb(mddev_t * mddev, int force_change) | 1641 | static void md_update_sb(mddev_t * mddev, int force_change) |
| 1642 | { | 1642 | { |
| 1643 | int err; | ||
| 1644 | struct list_head *tmp; | 1643 | struct list_head *tmp; |
| 1645 | mdk_rdev_t *rdev; | 1644 | mdk_rdev_t *rdev; |
| 1646 | int sync_req; | 1645 | int sync_req; |
| @@ -1727,7 +1726,7 @@ repeat: | |||
| 1727 | "md: updating %s RAID superblock on device (in sync %d)\n", | 1726 | "md: updating %s RAID superblock on device (in sync %d)\n", |
| 1728 | mdname(mddev),mddev->in_sync); | 1727 | mdname(mddev),mddev->in_sync); |
| 1729 | 1728 | ||
| 1730 | err = bitmap_update_sb(mddev->bitmap); | 1729 | bitmap_update_sb(mddev->bitmap); |
| 1731 | ITERATE_RDEV(mddev,rdev,tmp) { | 1730 | ITERATE_RDEV(mddev,rdev,tmp) { |
| 1732 | char b[BDEVNAME_SIZE]; | 1731 | char b[BDEVNAME_SIZE]; |
| 1733 | dprintk(KERN_INFO "md: "); | 1732 | dprintk(KERN_INFO "md: "); |
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 46677d7d9980..00c78b77b13d 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c | |||
| @@ -1526,8 +1526,7 @@ static void raid1d(mddev_t *mddev) | |||
| 1526 | blk_remove_plug(mddev->queue); | 1526 | blk_remove_plug(mddev->queue); |
| 1527 | spin_unlock_irqrestore(&conf->device_lock, flags); | 1527 | spin_unlock_irqrestore(&conf->device_lock, flags); |
| 1528 | /* flush any pending bitmap writes to disk before proceeding w/ I/O */ | 1528 | /* flush any pending bitmap writes to disk before proceeding w/ I/O */ |
| 1529 | if (bitmap_unplug(mddev->bitmap) != 0) | 1529 | bitmap_unplug(mddev->bitmap); |
| 1530 | printk("%s: bitmap file write failed!\n", mdname(mddev)); | ||
| 1531 | 1530 | ||
| 1532 | while (bio) { /* submit pending writes */ | 1531 | while (bio) { /* submit pending writes */ |
| 1533 | struct bio *next = bio->bi_next; | 1532 | struct bio *next = bio->bi_next; |
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 9eb66c1b523b..a95ada1cfac4 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c | |||
| @@ -1510,8 +1510,7 @@ static void raid10d(mddev_t *mddev) | |||
| 1510 | blk_remove_plug(mddev->queue); | 1510 | blk_remove_plug(mddev->queue); |
| 1511 | spin_unlock_irqrestore(&conf->device_lock, flags); | 1511 | spin_unlock_irqrestore(&conf->device_lock, flags); |
| 1512 | /* flush any pending bitmap writes to disk before proceeding w/ I/O */ | 1512 | /* flush any pending bitmap writes to disk before proceeding w/ I/O */ |
| 1513 | if (bitmap_unplug(mddev->bitmap) != 0) | 1513 | bitmap_unplug(mddev->bitmap); |
| 1514 | printk("%s: bitmap file write failed!\n", mdname(mddev)); | ||
| 1515 | 1514 | ||
| 1516 | while (bio) { /* submit pending writes */ | 1515 | while (bio) { /* submit pending writes */ |
| 1517 | struct bio *next = bio->bi_next; | 1516 | struct bio *next = bio->bi_next; |
diff --git a/include/linux/raid/bitmap.h b/include/linux/raid/bitmap.h index dd5a05d03d4f..75e17a05540e 100644 --- a/include/linux/raid/bitmap.h +++ b/include/linux/raid/bitmap.h | |||
| @@ -262,7 +262,7 @@ int bitmap_active(struct bitmap *bitmap); | |||
| 262 | 262 | ||
| 263 | char *file_path(struct file *file, char *buf, int count); | 263 | char *file_path(struct file *file, char *buf, int count); |
| 264 | void bitmap_print_sb(struct bitmap *bitmap); | 264 | void bitmap_print_sb(struct bitmap *bitmap); |
| 265 | int bitmap_update_sb(struct bitmap *bitmap); | 265 | void bitmap_update_sb(struct bitmap *bitmap); |
| 266 | 266 | ||
| 267 | int bitmap_setallbits(struct bitmap *bitmap); | 267 | int bitmap_setallbits(struct bitmap *bitmap); |
| 268 | void bitmap_write_all(struct bitmap *bitmap); | 268 | void bitmap_write_all(struct bitmap *bitmap); |
| @@ -278,8 +278,8 @@ int bitmap_start_sync(struct bitmap *bitmap, sector_t offset, int *blocks, int d | |||
| 278 | void bitmap_end_sync(struct bitmap *bitmap, sector_t offset, int *blocks, int aborted); | 278 | void bitmap_end_sync(struct bitmap *bitmap, sector_t offset, int *blocks, int aborted); |
| 279 | void bitmap_close_sync(struct bitmap *bitmap); | 279 | void bitmap_close_sync(struct bitmap *bitmap); |
| 280 | 280 | ||
| 281 | int bitmap_unplug(struct bitmap *bitmap); | 281 | void bitmap_unplug(struct bitmap *bitmap); |
| 282 | int bitmap_daemon_work(struct bitmap *bitmap); | 282 | void bitmap_daemon_work(struct bitmap *bitmap); |
| 283 | #endif | 283 | #endif |
| 284 | 284 | ||
| 285 | #endif | 285 | #endif |
