diff options
Diffstat (limited to 'drivers/md')
-rw-r--r-- | drivers/md/md.c | 86 | ||||
-rw-r--r-- | drivers/md/raid1.c | 5 | ||||
-rw-r--r-- | drivers/md/raid10.c | 4 | ||||
-rw-r--r-- | drivers/md/raid5.c | 84 |
4 files changed, 114 insertions, 65 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c index e4e161372a3e..b6d16022a53e 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
@@ -110,7 +110,7 @@ static ctl_table raid_table[] = { | |||
110 | .procname = "speed_limit_min", | 110 | .procname = "speed_limit_min", |
111 | .data = &sysctl_speed_limit_min, | 111 | .data = &sysctl_speed_limit_min, |
112 | .maxlen = sizeof(int), | 112 | .maxlen = sizeof(int), |
113 | .mode = 0644, | 113 | .mode = S_IRUGO|S_IWUSR, |
114 | .proc_handler = &proc_dointvec, | 114 | .proc_handler = &proc_dointvec, |
115 | }, | 115 | }, |
116 | { | 116 | { |
@@ -118,7 +118,7 @@ static ctl_table raid_table[] = { | |||
118 | .procname = "speed_limit_max", | 118 | .procname = "speed_limit_max", |
119 | .data = &sysctl_speed_limit_max, | 119 | .data = &sysctl_speed_limit_max, |
120 | .maxlen = sizeof(int), | 120 | .maxlen = sizeof(int), |
121 | .mode = 0644, | 121 | .mode = S_IRUGO|S_IWUSR, |
122 | .proc_handler = &proc_dointvec, | 122 | .proc_handler = &proc_dointvec, |
123 | }, | 123 | }, |
124 | { .ctl_name = 0 } | 124 | { .ctl_name = 0 } |
@@ -129,7 +129,7 @@ static ctl_table raid_dir_table[] = { | |||
129 | .ctl_name = DEV_RAID, | 129 | .ctl_name = DEV_RAID, |
130 | .procname = "raid", | 130 | .procname = "raid", |
131 | .maxlen = 0, | 131 | .maxlen = 0, |
132 | .mode = 0555, | 132 | .mode = S_IRUGO|S_IXUGO, |
133 | .child = raid_table, | 133 | .child = raid_table, |
134 | }, | 134 | }, |
135 | { .ctl_name = 0 } | 135 | { .ctl_name = 0 } |
@@ -1062,6 +1062,11 @@ static int super_1_load(mdk_rdev_t *rdev, mdk_rdev_t *refdev, int minor_version) | |||
1062 | if (rdev->sb_size & bmask) | 1062 | if (rdev->sb_size & bmask) |
1063 | rdev-> sb_size = (rdev->sb_size | bmask)+1; | 1063 | rdev-> sb_size = (rdev->sb_size | bmask)+1; |
1064 | 1064 | ||
1065 | if (sb->level == cpu_to_le32(LEVEL_MULTIPATH)) | ||
1066 | rdev->desc_nr = -1; | ||
1067 | else | ||
1068 | rdev->desc_nr = le32_to_cpu(sb->dev_number); | ||
1069 | |||
1065 | if (refdev == 0) | 1070 | if (refdev == 0) |
1066 | ret = 1; | 1071 | ret = 1; |
1067 | else { | 1072 | else { |
@@ -1171,7 +1176,6 @@ static int super_1_validate(mddev_t *mddev, mdk_rdev_t *rdev) | |||
1171 | } | 1176 | } |
1172 | if (mddev->level != LEVEL_MULTIPATH) { | 1177 | if (mddev->level != LEVEL_MULTIPATH) { |
1173 | int role; | 1178 | int role; |
1174 | rdev->desc_nr = le32_to_cpu(sb->dev_number); | ||
1175 | role = le16_to_cpu(sb->dev_roles[rdev->desc_nr]); | 1179 | role = le16_to_cpu(sb->dev_roles[rdev->desc_nr]); |
1176 | switch(role) { | 1180 | switch(role) { |
1177 | case 0xffff: /* spare */ | 1181 | case 0xffff: /* spare */ |
@@ -1779,8 +1783,8 @@ state_store(mdk_rdev_t *rdev, const char *buf, size_t len) | |||
1779 | } | 1783 | } |
1780 | return err ? err : len; | 1784 | return err ? err : len; |
1781 | } | 1785 | } |
1782 | static struct rdev_sysfs_entry | 1786 | static struct rdev_sysfs_entry rdev_state = |
1783 | rdev_state = __ATTR(state, 0644, state_show, state_store); | 1787 | __ATTR(state, S_IRUGO|S_IWUSR, state_show, state_store); |
1784 | 1788 | ||
1785 | static ssize_t | 1789 | static ssize_t |
1786 | super_show(mdk_rdev_t *rdev, char *page) | 1790 | super_show(mdk_rdev_t *rdev, char *page) |
@@ -1811,7 +1815,7 @@ errors_store(mdk_rdev_t *rdev, const char *buf, size_t len) | |||
1811 | return -EINVAL; | 1815 | return -EINVAL; |
1812 | } | 1816 | } |
1813 | static struct rdev_sysfs_entry rdev_errors = | 1817 | static struct rdev_sysfs_entry rdev_errors = |
1814 | __ATTR(errors, 0644, errors_show, errors_store); | 1818 | __ATTR(errors, S_IRUGO|S_IWUSR, errors_show, errors_store); |
1815 | 1819 | ||
1816 | static ssize_t | 1820 | static ssize_t |
1817 | slot_show(mdk_rdev_t *rdev, char *page) | 1821 | slot_show(mdk_rdev_t *rdev, char *page) |
@@ -1845,7 +1849,7 @@ slot_store(mdk_rdev_t *rdev, const char *buf, size_t len) | |||
1845 | 1849 | ||
1846 | 1850 | ||
1847 | static struct rdev_sysfs_entry rdev_slot = | 1851 | static struct rdev_sysfs_entry rdev_slot = |
1848 | __ATTR(slot, 0644, slot_show, slot_store); | 1852 | __ATTR(slot, S_IRUGO|S_IWUSR, slot_show, slot_store); |
1849 | 1853 | ||
1850 | static ssize_t | 1854 | static ssize_t |
1851 | offset_show(mdk_rdev_t *rdev, char *page) | 1855 | offset_show(mdk_rdev_t *rdev, char *page) |
@@ -1867,7 +1871,7 @@ offset_store(mdk_rdev_t *rdev, const char *buf, size_t len) | |||
1867 | } | 1871 | } |
1868 | 1872 | ||
1869 | static struct rdev_sysfs_entry rdev_offset = | 1873 | static struct rdev_sysfs_entry rdev_offset = |
1870 | __ATTR(offset, 0644, offset_show, offset_store); | 1874 | __ATTR(offset, S_IRUGO|S_IWUSR, offset_show, offset_store); |
1871 | 1875 | ||
1872 | static ssize_t | 1876 | static ssize_t |
1873 | rdev_size_show(mdk_rdev_t *rdev, char *page) | 1877 | rdev_size_show(mdk_rdev_t *rdev, char *page) |
@@ -1891,7 +1895,7 @@ rdev_size_store(mdk_rdev_t *rdev, const char *buf, size_t len) | |||
1891 | } | 1895 | } |
1892 | 1896 | ||
1893 | static struct rdev_sysfs_entry rdev_size = | 1897 | static struct rdev_sysfs_entry rdev_size = |
1894 | __ATTR(size, 0644, rdev_size_show, rdev_size_store); | 1898 | __ATTR(size, S_IRUGO|S_IWUSR, rdev_size_show, rdev_size_store); |
1895 | 1899 | ||
1896 | static struct attribute *rdev_default_attrs[] = { | 1900 | static struct attribute *rdev_default_attrs[] = { |
1897 | &rdev_state.attr, | 1901 | &rdev_state.attr, |
@@ -1922,6 +1926,8 @@ rdev_attr_store(struct kobject *kobj, struct attribute *attr, | |||
1922 | 1926 | ||
1923 | if (!entry->store) | 1927 | if (!entry->store) |
1924 | return -EIO; | 1928 | return -EIO; |
1929 | if (!capable(CAP_SYS_ADMIN)) | ||
1930 | return -EACCES; | ||
1925 | return entry->store(rdev, page, length); | 1931 | return entry->store(rdev, page, length); |
1926 | } | 1932 | } |
1927 | 1933 | ||
@@ -2128,7 +2134,7 @@ safe_delay_store(mddev_t *mddev, const char *cbuf, size_t len) | |||
2128 | return len; | 2134 | return len; |
2129 | } | 2135 | } |
2130 | static struct md_sysfs_entry md_safe_delay = | 2136 | static struct md_sysfs_entry md_safe_delay = |
2131 | __ATTR(safe_mode_delay, 0644,safe_delay_show, safe_delay_store); | 2137 | __ATTR(safe_mode_delay, S_IRUGO|S_IWUSR,safe_delay_show, safe_delay_store); |
2132 | 2138 | ||
2133 | static ssize_t | 2139 | static ssize_t |
2134 | level_show(mddev_t *mddev, char *page) | 2140 | level_show(mddev_t *mddev, char *page) |
@@ -2163,7 +2169,7 @@ level_store(mddev_t *mddev, const char *buf, size_t len) | |||
2163 | } | 2169 | } |
2164 | 2170 | ||
2165 | static struct md_sysfs_entry md_level = | 2171 | static struct md_sysfs_entry md_level = |
2166 | __ATTR(level, 0644, level_show, level_store); | 2172 | __ATTR(level, S_IRUGO|S_IWUSR, level_show, level_store); |
2167 | 2173 | ||
2168 | 2174 | ||
2169 | static ssize_t | 2175 | static ssize_t |
@@ -2188,7 +2194,7 @@ layout_store(mddev_t *mddev, const char *buf, size_t len) | |||
2188 | return len; | 2194 | return len; |
2189 | } | 2195 | } |
2190 | static struct md_sysfs_entry md_layout = | 2196 | static struct md_sysfs_entry md_layout = |
2191 | __ATTR(layout, 0655, layout_show, layout_store); | 2197 | __ATTR(layout, S_IRUGO|S_IWUSR, layout_show, layout_store); |
2192 | 2198 | ||
2193 | 2199 | ||
2194 | static ssize_t | 2200 | static ssize_t |
@@ -2219,7 +2225,7 @@ raid_disks_store(mddev_t *mddev, const char *buf, size_t len) | |||
2219 | return rv ? rv : len; | 2225 | return rv ? rv : len; |
2220 | } | 2226 | } |
2221 | static struct md_sysfs_entry md_raid_disks = | 2227 | static struct md_sysfs_entry md_raid_disks = |
2222 | __ATTR(raid_disks, 0644, raid_disks_show, raid_disks_store); | 2228 | __ATTR(raid_disks, S_IRUGO|S_IWUSR, raid_disks_show, raid_disks_store); |
2223 | 2229 | ||
2224 | static ssize_t | 2230 | static ssize_t |
2225 | chunk_size_show(mddev_t *mddev, char *page) | 2231 | chunk_size_show(mddev_t *mddev, char *page) |
@@ -2243,7 +2249,7 @@ chunk_size_store(mddev_t *mddev, const char *buf, size_t len) | |||
2243 | return len; | 2249 | return len; |
2244 | } | 2250 | } |
2245 | static struct md_sysfs_entry md_chunk_size = | 2251 | static struct md_sysfs_entry md_chunk_size = |
2246 | __ATTR(chunk_size, 0644, chunk_size_show, chunk_size_store); | 2252 | __ATTR(chunk_size, S_IRUGO|S_IWUSR, chunk_size_show, chunk_size_store); |
2247 | 2253 | ||
2248 | static ssize_t | 2254 | static ssize_t |
2249 | resync_start_show(mddev_t *mddev, char *page) | 2255 | resync_start_show(mddev_t *mddev, char *page) |
@@ -2267,7 +2273,7 @@ resync_start_store(mddev_t *mddev, const char *buf, size_t len) | |||
2267 | return len; | 2273 | return len; |
2268 | } | 2274 | } |
2269 | static struct md_sysfs_entry md_resync_start = | 2275 | static struct md_sysfs_entry md_resync_start = |
2270 | __ATTR(resync_start, 0644, resync_start_show, resync_start_store); | 2276 | __ATTR(resync_start, S_IRUGO|S_IWUSR, resync_start_show, resync_start_store); |
2271 | 2277 | ||
2272 | /* | 2278 | /* |
2273 | * The array state can be: | 2279 | * The array state can be: |
@@ -2437,7 +2443,8 @@ array_state_store(mddev_t *mddev, const char *buf, size_t len) | |||
2437 | else | 2443 | else |
2438 | return len; | 2444 | return len; |
2439 | } | 2445 | } |
2440 | static struct md_sysfs_entry md_array_state = __ATTR(array_state, 0644, array_state_show, array_state_store); | 2446 | static struct md_sysfs_entry md_array_state = |
2447 | __ATTR(array_state, S_IRUGO|S_IWUSR, array_state_show, array_state_store); | ||
2441 | 2448 | ||
2442 | static ssize_t | 2449 | static ssize_t |
2443 | null_show(mddev_t *mddev, char *page) | 2450 | null_show(mddev_t *mddev, char *page) |
@@ -2497,7 +2504,7 @@ new_dev_store(mddev_t *mddev, const char *buf, size_t len) | |||
2497 | } | 2504 | } |
2498 | 2505 | ||
2499 | static struct md_sysfs_entry md_new_device = | 2506 | static struct md_sysfs_entry md_new_device = |
2500 | __ATTR(new_dev, 0200, null_show, new_dev_store); | 2507 | __ATTR(new_dev, S_IWUSR, null_show, new_dev_store); |
2501 | 2508 | ||
2502 | static ssize_t | 2509 | static ssize_t |
2503 | size_show(mddev_t *mddev, char *page) | 2510 | size_show(mddev_t *mddev, char *page) |
@@ -2535,7 +2542,7 @@ size_store(mddev_t *mddev, const char *buf, size_t len) | |||
2535 | } | 2542 | } |
2536 | 2543 | ||
2537 | static struct md_sysfs_entry md_size = | 2544 | static struct md_sysfs_entry md_size = |
2538 | __ATTR(component_size, 0644, size_show, size_store); | 2545 | __ATTR(component_size, S_IRUGO|S_IWUSR, size_show, size_store); |
2539 | 2546 | ||
2540 | 2547 | ||
2541 | /* Metdata version. | 2548 | /* Metdata version. |
@@ -2583,7 +2590,7 @@ metadata_store(mddev_t *mddev, const char *buf, size_t len) | |||
2583 | } | 2590 | } |
2584 | 2591 | ||
2585 | static struct md_sysfs_entry md_metadata = | 2592 | static struct md_sysfs_entry md_metadata = |
2586 | __ATTR(metadata_version, 0644, metadata_show, metadata_store); | 2593 | __ATTR(metadata_version, S_IRUGO|S_IWUSR, metadata_show, metadata_store); |
2587 | 2594 | ||
2588 | static ssize_t | 2595 | static ssize_t |
2589 | action_show(mddev_t *mddev, char *page) | 2596 | action_show(mddev_t *mddev, char *page) |
@@ -2651,12 +2658,11 @@ mismatch_cnt_show(mddev_t *mddev, char *page) | |||
2651 | (unsigned long long) mddev->resync_mismatches); | 2658 | (unsigned long long) mddev->resync_mismatches); |
2652 | } | 2659 | } |
2653 | 2660 | ||
2654 | static struct md_sysfs_entry | 2661 | static struct md_sysfs_entry md_scan_mode = |
2655 | md_scan_mode = __ATTR(sync_action, S_IRUGO|S_IWUSR, action_show, action_store); | 2662 | __ATTR(sync_action, S_IRUGO|S_IWUSR, action_show, action_store); |
2656 | 2663 | ||
2657 | 2664 | ||
2658 | static struct md_sysfs_entry | 2665 | static struct md_sysfs_entry md_mismatches = __ATTR_RO(mismatch_cnt); |
2659 | md_mismatches = __ATTR_RO(mismatch_cnt); | ||
2660 | 2666 | ||
2661 | static ssize_t | 2667 | static ssize_t |
2662 | sync_min_show(mddev_t *mddev, char *page) | 2668 | sync_min_show(mddev_t *mddev, char *page) |
@@ -2715,15 +2721,14 @@ static ssize_t | |||
2715 | sync_speed_show(mddev_t *mddev, char *page) | 2721 | sync_speed_show(mddev_t *mddev, char *page) |
2716 | { | 2722 | { |
2717 | unsigned long resync, dt, db; | 2723 | unsigned long resync, dt, db; |
2718 | resync = (mddev->curr_resync - atomic_read(&mddev->recovery_active)); | 2724 | resync = (mddev->curr_mark_cnt - atomic_read(&mddev->recovery_active)); |
2719 | dt = ((jiffies - mddev->resync_mark) / HZ); | 2725 | dt = ((jiffies - mddev->resync_mark) / HZ); |
2720 | if (!dt) dt++; | 2726 | if (!dt) dt++; |
2721 | db = resync - (mddev->resync_mark_cnt); | 2727 | db = resync - (mddev->resync_mark_cnt); |
2722 | return sprintf(page, "%ld\n", db/dt/2); /* K/sec */ | 2728 | return sprintf(page, "%ld\n", db/dt/2); /* K/sec */ |
2723 | } | 2729 | } |
2724 | 2730 | ||
2725 | static struct md_sysfs_entry | 2731 | static struct md_sysfs_entry md_sync_speed = __ATTR_RO(sync_speed); |
2726 | md_sync_speed = __ATTR_RO(sync_speed); | ||
2727 | 2732 | ||
2728 | static ssize_t | 2733 | static ssize_t |
2729 | sync_completed_show(mddev_t *mddev, char *page) | 2734 | sync_completed_show(mddev_t *mddev, char *page) |
@@ -2739,8 +2744,7 @@ sync_completed_show(mddev_t *mddev, char *page) | |||
2739 | return sprintf(page, "%lu / %lu\n", resync, max_blocks); | 2744 | return sprintf(page, "%lu / %lu\n", resync, max_blocks); |
2740 | } | 2745 | } |
2741 | 2746 | ||
2742 | static struct md_sysfs_entry | 2747 | static struct md_sysfs_entry md_sync_completed = __ATTR_RO(sync_completed); |
2743 | md_sync_completed = __ATTR_RO(sync_completed); | ||
2744 | 2748 | ||
2745 | static ssize_t | 2749 | static ssize_t |
2746 | suspend_lo_show(mddev_t *mddev, char *page) | 2750 | suspend_lo_show(mddev_t *mddev, char *page) |
@@ -2857,6 +2861,8 @@ md_attr_store(struct kobject *kobj, struct attribute *attr, | |||
2857 | 2861 | ||
2858 | if (!entry->store) | 2862 | if (!entry->store) |
2859 | return -EIO; | 2863 | return -EIO; |
2864 | if (!capable(CAP_SYS_ADMIN)) | ||
2865 | return -EACCES; | ||
2860 | rv = mddev_lock(mddev); | 2866 | rv = mddev_lock(mddev); |
2861 | if (!rv) { | 2867 | if (!rv) { |
2862 | rv = entry->store(mddev, page, length); | 2868 | rv = entry->store(mddev, page, length); |
@@ -3091,7 +3097,6 @@ static int do_md_run(mddev_t * mddev) | |||
3091 | } | 3097 | } |
3092 | 3098 | ||
3093 | set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); | 3099 | set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); |
3094 | md_wakeup_thread(mddev->thread); | ||
3095 | 3100 | ||
3096 | if (mddev->sb_dirty) | 3101 | if (mddev->sb_dirty) |
3097 | md_update_sb(mddev); | 3102 | md_update_sb(mddev); |
@@ -3112,7 +3117,7 @@ static int do_md_run(mddev_t * mddev) | |||
3112 | * start recovery here. If we leave it to md_check_recovery, | 3117 | * start recovery here. If we leave it to md_check_recovery, |
3113 | * it will remove the drives and not do the right thing | 3118 | * it will remove the drives and not do the right thing |
3114 | */ | 3119 | */ |
3115 | if (mddev->degraded) { | 3120 | if (mddev->degraded && !mddev->sync_thread) { |
3116 | struct list_head *rtmp; | 3121 | struct list_head *rtmp; |
3117 | int spares = 0; | 3122 | int spares = 0; |
3118 | ITERATE_RDEV(mddev,rdev,rtmp) | 3123 | ITERATE_RDEV(mddev,rdev,rtmp) |
@@ -3133,10 +3138,11 @@ static int do_md_run(mddev_t * mddev) | |||
3133 | mdname(mddev)); | 3138 | mdname(mddev)); |
3134 | /* leave the spares where they are, it shouldn't hurt */ | 3139 | /* leave the spares where they are, it shouldn't hurt */ |
3135 | mddev->recovery = 0; | 3140 | mddev->recovery = 0; |
3136 | } else | 3141 | } |
3137 | md_wakeup_thread(mddev->sync_thread); | ||
3138 | } | 3142 | } |
3139 | } | 3143 | } |
3144 | md_wakeup_thread(mddev->thread); | ||
3145 | md_wakeup_thread(mddev->sync_thread); /* possibly kick off a reshape */ | ||
3140 | 3146 | ||
3141 | mddev->changed = 1; | 3147 | mddev->changed = 1; |
3142 | md_new_event(mddev); | 3148 | md_new_event(mddev); |
@@ -4586,6 +4592,8 @@ void md_error(mddev_t *mddev, mdk_rdev_t *rdev) | |||
4586 | __builtin_return_address(0),__builtin_return_address(1), | 4592 | __builtin_return_address(0),__builtin_return_address(1), |
4587 | __builtin_return_address(2),__builtin_return_address(3)); | 4593 | __builtin_return_address(2),__builtin_return_address(3)); |
4588 | */ | 4594 | */ |
4595 | if (!mddev->pers) | ||
4596 | return; | ||
4589 | if (!mddev->pers->error_handler) | 4597 | if (!mddev->pers->error_handler) |
4590 | return; | 4598 | return; |
4591 | mddev->pers->error_handler(mddev,rdev); | 4599 | mddev->pers->error_handler(mddev,rdev); |
@@ -4683,12 +4691,13 @@ static void status_resync(struct seq_file *seq, mddev_t * mddev) | |||
4683 | */ | 4691 | */ |
4684 | dt = ((jiffies - mddev->resync_mark) / HZ); | 4692 | dt = ((jiffies - mddev->resync_mark) / HZ); |
4685 | if (!dt) dt++; | 4693 | if (!dt) dt++; |
4686 | db = resync - (mddev->resync_mark_cnt/2); | 4694 | db = (mddev->curr_mark_cnt - atomic_read(&mddev->recovery_active)) |
4687 | rt = (dt * ((unsigned long)(max_blocks-resync) / (db/100+1)))/100; | 4695 | - mddev->resync_mark_cnt; |
4696 | rt = (dt * ((unsigned long)(max_blocks-resync) / (db/2/100+1)))/100; | ||
4688 | 4697 | ||
4689 | seq_printf(seq, " finish=%lu.%lumin", rt / 60, (rt % 60)/6); | 4698 | seq_printf(seq, " finish=%lu.%lumin", rt / 60, (rt % 60)/6); |
4690 | 4699 | ||
4691 | seq_printf(seq, " speed=%ldK/sec", db/dt); | 4700 | seq_printf(seq, " speed=%ldK/sec", db/2/dt); |
4692 | } | 4701 | } |
4693 | 4702 | ||
4694 | static void *md_seq_start(struct seq_file *seq, loff_t *pos) | 4703 | static void *md_seq_start(struct seq_file *seq, loff_t *pos) |
@@ -5199,6 +5208,7 @@ void md_do_sync(mddev_t *mddev) | |||
5199 | 5208 | ||
5200 | j += sectors; | 5209 | j += sectors; |
5201 | if (j>1) mddev->curr_resync = j; | 5210 | if (j>1) mddev->curr_resync = j; |
5211 | mddev->curr_mark_cnt = io_sectors; | ||
5202 | if (last_check == 0) | 5212 | if (last_check == 0) |
5203 | /* this is the earliers that rebuilt will be | 5213 | /* this is the earliers that rebuilt will be |
5204 | * visible in /proc/mdstat | 5214 | * visible in /proc/mdstat |
@@ -5645,8 +5655,8 @@ static int set_ro(const char *val, struct kernel_param *kp) | |||
5645 | return -EINVAL; | 5655 | return -EINVAL; |
5646 | } | 5656 | } |
5647 | 5657 | ||
5648 | module_param_call(start_ro, set_ro, get_ro, NULL, 0600); | 5658 | module_param_call(start_ro, set_ro, get_ro, NULL, S_IRUSR|S_IWUSR); |
5649 | module_param(start_dirty_degraded, int, 0644); | 5659 | module_param(start_dirty_degraded, int, S_IRUGO|S_IWUSR); |
5650 | 5660 | ||
5651 | 5661 | ||
5652 | EXPORT_SYMBOL(register_md_personality); | 5662 | EXPORT_SYMBOL(register_md_personality); |
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index cead918578a7..1efe22a2d041 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c | |||
@@ -1145,7 +1145,7 @@ static int end_sync_write(struct bio *bio, unsigned int bytes_done, int error) | |||
1145 | long sectors_to_go = r1_bio->sectors; | 1145 | long sectors_to_go = r1_bio->sectors; |
1146 | /* make sure these bits doesn't get cleared. */ | 1146 | /* make sure these bits doesn't get cleared. */ |
1147 | do { | 1147 | do { |
1148 | bitmap_end_sync(mddev->bitmap, r1_bio->sector, | 1148 | bitmap_end_sync(mddev->bitmap, s, |
1149 | &sync_blocks, 1); | 1149 | &sync_blocks, 1); |
1150 | s += sync_blocks; | 1150 | s += sync_blocks; |
1151 | sectors_to_go -= sync_blocks; | 1151 | sectors_to_go -= sync_blocks; |
@@ -1509,6 +1509,9 @@ static void raid1d(mddev_t *mddev) | |||
1509 | s<<9, conf->tmppage, READ) == 0) | 1509 | s<<9, conf->tmppage, READ) == 0) |
1510 | /* Well, this device is dead */ | 1510 | /* Well, this device is dead */ |
1511 | md_error(mddev, rdev); | 1511 | md_error(mddev, rdev); |
1512 | else | ||
1513 | printk(KERN_INFO "raid1:%s: read error corrected (%d sectors at %llu on %s)\n", | ||
1514 | mdname(mddev), s, (unsigned long long)(sect + rdev->data_offset), bdevname(rdev->bdev, b)); | ||
1512 | } | 1515 | } |
1513 | } | 1516 | } |
1514 | } else { | 1517 | } else { |
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 7f636283a1ba..016ddb831c9b 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c | |||
@@ -1492,6 +1492,10 @@ static void raid10d(mddev_t *mddev) | |||
1492 | s<<9, conf->tmppage, READ) == 0) | 1492 | s<<9, conf->tmppage, READ) == 0) |
1493 | /* Well, this device is dead */ | 1493 | /* Well, this device is dead */ |
1494 | md_error(mddev, rdev); | 1494 | md_error(mddev, rdev); |
1495 | else | ||
1496 | printk(KERN_INFO "raid10:%s: read error corrected (%d sectors at %llu on %s)\n", | ||
1497 | mdname(mddev), s, (unsigned long long)(sect+rdev->data_offset), bdevname(rdev->bdev, b)); | ||
1498 | |||
1495 | rdev_dec_pending(rdev, mddev); | 1499 | rdev_dec_pending(rdev, mddev); |
1496 | rcu_read_lock(); | 1500 | rcu_read_lock(); |
1497 | } | 1501 | } |
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 7433871f4b3a..450066007160 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
@@ -18,6 +18,30 @@ | |||
18 | * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 18 | * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
19 | */ | 19 | */ |
20 | 20 | ||
21 | /* | ||
22 | * BITMAP UNPLUGGING: | ||
23 | * | ||
24 | * The sequencing for updating the bitmap reliably is a little | ||
25 | * subtle (and I got it wrong the first time) so it deserves some | ||
26 | * explanation. | ||
27 | * | ||
28 | * We group bitmap updates into batches. Each batch has a number. | ||
29 | * We may write out several batches at once, but that isn't very important. | ||
30 | * conf->bm_write is the number of the last batch successfully written. | ||
31 | * conf->bm_flush is the number of the last batch that was closed to | ||
32 | * new additions. | ||
33 | * When we discover that we will need to write to any block in a stripe | ||
34 | * (in add_stripe_bio) we update the in-memory bitmap and record in sh->bm_seq | ||
35 | * the number of the batch it will be in. This is bm_flush+1. | ||
36 | * When we are ready to do a write, if that batch hasn't been written yet, | ||
37 | * we plug the array and queue the stripe for later. | ||
38 | * When an unplug happens, we increment bm_flush, thus closing the current | ||
39 | * batch. | ||
40 | * When we notice that bm_flush > bm_write, we write out all pending updates | ||
41 | * to the bitmap, and advance bm_write to where bm_flush was. | ||
42 | * This may occasionally write a bit out twice, but is sure never to | ||
43 | * miss any bits. | ||
44 | */ | ||
21 | 45 | ||
22 | #include <linux/module.h> | 46 | #include <linux/module.h> |
23 | #include <linux/slab.h> | 47 | #include <linux/slab.h> |
@@ -88,12 +112,14 @@ static void __release_stripe(raid5_conf_t *conf, struct stripe_head *sh) | |||
88 | BUG_ON(!list_empty(&sh->lru)); | 112 | BUG_ON(!list_empty(&sh->lru)); |
89 | BUG_ON(atomic_read(&conf->active_stripes)==0); | 113 | BUG_ON(atomic_read(&conf->active_stripes)==0); |
90 | if (test_bit(STRIPE_HANDLE, &sh->state)) { | 114 | if (test_bit(STRIPE_HANDLE, &sh->state)) { |
91 | if (test_bit(STRIPE_DELAYED, &sh->state)) | 115 | if (test_bit(STRIPE_DELAYED, &sh->state)) { |
92 | list_add_tail(&sh->lru, &conf->delayed_list); | 116 | list_add_tail(&sh->lru, &conf->delayed_list); |
93 | else if (test_bit(STRIPE_BIT_DELAY, &sh->state) && | 117 | blk_plug_device(conf->mddev->queue); |
94 | conf->seq_write == sh->bm_seq) | 118 | } else if (test_bit(STRIPE_BIT_DELAY, &sh->state) && |
119 | sh->bm_seq - conf->seq_write > 0) { | ||
95 | list_add_tail(&sh->lru, &conf->bitmap_list); | 120 | list_add_tail(&sh->lru, &conf->bitmap_list); |
96 | else { | 121 | blk_plug_device(conf->mddev->queue); |
122 | } else { | ||
97 | clear_bit(STRIPE_BIT_DELAY, &sh->state); | 123 | clear_bit(STRIPE_BIT_DELAY, &sh->state); |
98 | list_add_tail(&sh->lru, &conf->handle_list); | 124 | list_add_tail(&sh->lru, &conf->handle_list); |
99 | } | 125 | } |
@@ -270,7 +296,7 @@ static struct stripe_head *get_active_stripe(raid5_conf_t *conf, sector_t sector | |||
270 | < (conf->max_nr_stripes *3/4) | 296 | < (conf->max_nr_stripes *3/4) |
271 | || !conf->inactive_blocked), | 297 | || !conf->inactive_blocked), |
272 | conf->device_lock, | 298 | conf->device_lock, |
273 | unplug_slaves(conf->mddev) | 299 | raid5_unplug_device(conf->mddev->queue) |
274 | ); | 300 | ); |
275 | conf->inactive_blocked = 0; | 301 | conf->inactive_blocked = 0; |
276 | } else | 302 | } else |
@@ -281,7 +307,8 @@ static struct stripe_head *get_active_stripe(raid5_conf_t *conf, sector_t sector | |||
281 | } else { | 307 | } else { |
282 | if (!test_bit(STRIPE_HANDLE, &sh->state)) | 308 | if (!test_bit(STRIPE_HANDLE, &sh->state)) |
283 | atomic_inc(&conf->active_stripes); | 309 | atomic_inc(&conf->active_stripes); |
284 | if (list_empty(&sh->lru)) | 310 | if (list_empty(&sh->lru) && |
311 | !test_bit(STRIPE_EXPANDING, &sh->state)) | ||
285 | BUG(); | 312 | BUG(); |
286 | list_del_init(&sh->lru); | 313 | list_del_init(&sh->lru); |
287 | } | 314 | } |
@@ -496,6 +523,8 @@ static int raid5_end_read_request(struct bio * bi, unsigned int bytes_done, | |||
496 | raid5_conf_t *conf = sh->raid_conf; | 523 | raid5_conf_t *conf = sh->raid_conf; |
497 | int disks = sh->disks, i; | 524 | int disks = sh->disks, i; |
498 | int uptodate = test_bit(BIO_UPTODATE, &bi->bi_flags); | 525 | int uptodate = test_bit(BIO_UPTODATE, &bi->bi_flags); |
526 | char b[BDEVNAME_SIZE]; | ||
527 | mdk_rdev_t *rdev; | ||
499 | 528 | ||
500 | if (bi->bi_size) | 529 | if (bi->bi_size) |
501 | return 1; | 530 | return 1; |
@@ -543,25 +572,39 @@ static int raid5_end_read_request(struct bio * bi, unsigned int bytes_done, | |||
543 | set_bit(R5_UPTODATE, &sh->dev[i].flags); | 572 | set_bit(R5_UPTODATE, &sh->dev[i].flags); |
544 | #endif | 573 | #endif |
545 | if (test_bit(R5_ReadError, &sh->dev[i].flags)) { | 574 | if (test_bit(R5_ReadError, &sh->dev[i].flags)) { |
546 | printk(KERN_INFO "raid5: read error corrected!!\n"); | 575 | rdev = conf->disks[i].rdev; |
576 | printk(KERN_INFO "raid5:%s: read error corrected (%lu sectors at %llu on %s)\n", | ||
577 | mdname(conf->mddev), STRIPE_SECTORS, | ||
578 | (unsigned long long)sh->sector + rdev->data_offset, | ||
579 | bdevname(rdev->bdev, b)); | ||
547 | clear_bit(R5_ReadError, &sh->dev[i].flags); | 580 | clear_bit(R5_ReadError, &sh->dev[i].flags); |
548 | clear_bit(R5_ReWrite, &sh->dev[i].flags); | 581 | clear_bit(R5_ReWrite, &sh->dev[i].flags); |
549 | } | 582 | } |
550 | if (atomic_read(&conf->disks[i].rdev->read_errors)) | 583 | if (atomic_read(&conf->disks[i].rdev->read_errors)) |
551 | atomic_set(&conf->disks[i].rdev->read_errors, 0); | 584 | atomic_set(&conf->disks[i].rdev->read_errors, 0); |
552 | } else { | 585 | } else { |
586 | const char *bdn = bdevname(conf->disks[i].rdev->bdev, b); | ||
553 | int retry = 0; | 587 | int retry = 0; |
588 | rdev = conf->disks[i].rdev; | ||
589 | |||
554 | clear_bit(R5_UPTODATE, &sh->dev[i].flags); | 590 | clear_bit(R5_UPTODATE, &sh->dev[i].flags); |
555 | atomic_inc(&conf->disks[i].rdev->read_errors); | 591 | atomic_inc(&rdev->read_errors); |
556 | if (conf->mddev->degraded) | 592 | if (conf->mddev->degraded) |
557 | printk(KERN_WARNING "raid5: read error not correctable.\n"); | 593 | printk(KERN_WARNING "raid5:%s: read error not correctable (sector %llu on %s).\n", |
594 | mdname(conf->mddev), | ||
595 | (unsigned long long)sh->sector + rdev->data_offset, | ||
596 | bdn); | ||
558 | else if (test_bit(R5_ReWrite, &sh->dev[i].flags)) | 597 | else if (test_bit(R5_ReWrite, &sh->dev[i].flags)) |
559 | /* Oh, no!!! */ | 598 | /* Oh, no!!! */ |
560 | printk(KERN_WARNING "raid5: read error NOT corrected!!\n"); | 599 | printk(KERN_WARNING "raid5:%s: read error NOT corrected!! (sector %llu on %s).\n", |
561 | else if (atomic_read(&conf->disks[i].rdev->read_errors) | 600 | mdname(conf->mddev), |
601 | (unsigned long long)sh->sector + rdev->data_offset, | ||
602 | bdn); | ||
603 | else if (atomic_read(&rdev->read_errors) | ||
562 | > conf->max_nr_stripes) | 604 | > conf->max_nr_stripes) |
563 | printk(KERN_WARNING | 605 | printk(KERN_WARNING |
564 | "raid5: Too many read errors, failing device.\n"); | 606 | "raid5:%s: Too many read errors, failing device %s.\n", |
607 | mdname(conf->mddev), bdn); | ||
565 | else | 608 | else |
566 | retry = 1; | 609 | retry = 1; |
567 | if (retry) | 610 | if (retry) |
@@ -569,7 +612,7 @@ static int raid5_end_read_request(struct bio * bi, unsigned int bytes_done, | |||
569 | else { | 612 | else { |
570 | clear_bit(R5_ReadError, &sh->dev[i].flags); | 613 | clear_bit(R5_ReadError, &sh->dev[i].flags); |
571 | clear_bit(R5_ReWrite, &sh->dev[i].flags); | 614 | clear_bit(R5_ReWrite, &sh->dev[i].flags); |
572 | md_error(conf->mddev, conf->disks[i].rdev); | 615 | md_error(conf->mddev, rdev); |
573 | } | 616 | } |
574 | } | 617 | } |
575 | rdev_dec_pending(conf->disks[i].rdev, conf->mddev); | 618 | rdev_dec_pending(conf->disks[i].rdev, conf->mddev); |
@@ -1270,9 +1313,9 @@ static int add_stripe_bio(struct stripe_head *sh, struct bio *bi, int dd_idx, in | |||
1270 | (unsigned long long)sh->sector, dd_idx); | 1313 | (unsigned long long)sh->sector, dd_idx); |
1271 | 1314 | ||
1272 | if (conf->mddev->bitmap && firstwrite) { | 1315 | if (conf->mddev->bitmap && firstwrite) { |
1273 | sh->bm_seq = conf->seq_write; | ||
1274 | bitmap_startwrite(conf->mddev->bitmap, sh->sector, | 1316 | bitmap_startwrite(conf->mddev->bitmap, sh->sector, |
1275 | STRIPE_SECTORS, 0); | 1317 | STRIPE_SECTORS, 0); |
1318 | sh->bm_seq = conf->seq_flush+1; | ||
1276 | set_bit(STRIPE_BIT_DELAY, &sh->state); | 1319 | set_bit(STRIPE_BIT_DELAY, &sh->state); |
1277 | } | 1320 | } |
1278 | 1321 | ||
@@ -2554,13 +2597,6 @@ static int raid5_issue_flush(request_queue_t *q, struct gendisk *disk, | |||
2554 | return ret; | 2597 | return ret; |
2555 | } | 2598 | } |
2556 | 2599 | ||
2557 | static inline void raid5_plug_device(raid5_conf_t *conf) | ||
2558 | { | ||
2559 | spin_lock_irq(&conf->device_lock); | ||
2560 | blk_plug_device(conf->mddev->queue); | ||
2561 | spin_unlock_irq(&conf->device_lock); | ||
2562 | } | ||
2563 | |||
2564 | static int make_request(request_queue_t *q, struct bio * bi) | 2600 | static int make_request(request_queue_t *q, struct bio * bi) |
2565 | { | 2601 | { |
2566 | mddev_t *mddev = q->queuedata; | 2602 | mddev_t *mddev = q->queuedata; |
@@ -2670,7 +2706,6 @@ static int make_request(request_queue_t *q, struct bio * bi) | |||
2670 | goto retry; | 2706 | goto retry; |
2671 | } | 2707 | } |
2672 | finish_wait(&conf->wait_for_overlap, &w); | 2708 | finish_wait(&conf->wait_for_overlap, &w); |
2673 | raid5_plug_device(conf); | ||
2674 | handle_stripe(sh, NULL); | 2709 | handle_stripe(sh, NULL); |
2675 | release_stripe(sh); | 2710 | release_stripe(sh); |
2676 | } else { | 2711 | } else { |
@@ -2923,7 +2958,7 @@ static void raid5d (mddev_t *mddev) | |||
2923 | while (1) { | 2958 | while (1) { |
2924 | struct list_head *first; | 2959 | struct list_head *first; |
2925 | 2960 | ||
2926 | if (conf->seq_flush - conf->seq_write > 0) { | 2961 | if (conf->seq_flush != conf->seq_write) { |
2927 | int seq = conf->seq_flush; | 2962 | int seq = conf->seq_flush; |
2928 | spin_unlock_irq(&conf->device_lock); | 2963 | spin_unlock_irq(&conf->device_lock); |
2929 | bitmap_unplug(mddev->bitmap); | 2964 | bitmap_unplug(mddev->bitmap); |
@@ -3246,9 +3281,6 @@ static int run(mddev_t *mddev) | |||
3246 | set_bit(MD_RECOVERY_RUNNING, &mddev->recovery); | 3281 | set_bit(MD_RECOVERY_RUNNING, &mddev->recovery); |
3247 | mddev->sync_thread = md_register_thread(md_do_sync, mddev, | 3282 | mddev->sync_thread = md_register_thread(md_do_sync, mddev, |
3248 | "%s_reshape"); | 3283 | "%s_reshape"); |
3249 | /* FIXME if md_register_thread fails?? */ | ||
3250 | md_wakeup_thread(mddev->sync_thread); | ||
3251 | |||
3252 | } | 3284 | } |
3253 | 3285 | ||
3254 | /* read-ahead size must cover two whole stripes, which is | 3286 | /* read-ahead size must cover two whole stripes, which is |