Commit d9f5d41569731189e519fcee8578fcef5c916978
Exists in
master
and in
7 other branches
Merge branch 'for-linus' of git://neil.brown.name/md
* 'for-linus' of git://neil.brown.name/md: md raid-1/10 Fix bio_rw bit manipulations again md: provide appropriate return value for spare_active functions. md: Notify sysfs when RAID1/5/10 disk is In_sync. Update recovery_offset even when external metadata is used.
Showing 4 changed files Side-by-side Diff
drivers/md/md.c
... | ... | @@ -2136,17 +2136,7 @@ |
2136 | 2136 | * with the rest of the array) |
2137 | 2137 | */ |
2138 | 2138 | mdk_rdev_t *rdev; |
2139 | - | |
2140 | - /* First make sure individual recovery_offsets are correct */ | |
2141 | 2139 | list_for_each_entry(rdev, &mddev->disks, same_set) { |
2142 | - if (rdev->raid_disk >= 0 && | |
2143 | - mddev->delta_disks >= 0 && | |
2144 | - !test_bit(In_sync, &rdev->flags) && | |
2145 | - mddev->curr_resync_completed > rdev->recovery_offset) | |
2146 | - rdev->recovery_offset = mddev->curr_resync_completed; | |
2147 | - | |
2148 | - } | |
2149 | - list_for_each_entry(rdev, &mddev->disks, same_set) { | |
2150 | 2140 | if (rdev->sb_events == mddev->events || |
2151 | 2141 | (nospares && |
2152 | 2142 | rdev->raid_disk < 0 && |
2153 | 2143 | |
2154 | 2144 | |
... | ... | @@ -2167,12 +2157,27 @@ |
2167 | 2157 | int sync_req; |
2168 | 2158 | int nospares = 0; |
2169 | 2159 | |
2170 | - mddev->utime = get_seconds(); | |
2171 | - if (mddev->external) | |
2172 | - return; | |
2173 | 2160 | repeat: |
2161 | + /* First make sure individual recovery_offsets are correct */ | |
2162 | + list_for_each_entry(rdev, &mddev->disks, same_set) { | |
2163 | + if (rdev->raid_disk >= 0 && | |
2164 | + mddev->delta_disks >= 0 && | |
2165 | + !test_bit(In_sync, &rdev->flags) && | |
2166 | + mddev->curr_resync_completed > rdev->recovery_offset) | |
2167 | + rdev->recovery_offset = mddev->curr_resync_completed; | |
2168 | + | |
2169 | + } | |
2170 | + if (mddev->external || !mddev->persistent) { | |
2171 | + clear_bit(MD_CHANGE_DEVS, &mddev->flags); | |
2172 | + clear_bit(MD_CHANGE_CLEAN, &mddev->flags); | |
2173 | + wake_up(&mddev->sb_wait); | |
2174 | + return; | |
2175 | + } | |
2176 | + | |
2174 | 2177 | spin_lock_irq(&mddev->write_lock); |
2175 | 2178 | |
2179 | + mddev->utime = get_seconds(); | |
2180 | + | |
2176 | 2181 | set_bit(MD_CHANGE_PENDING, &mddev->flags); |
2177 | 2182 | if (test_and_clear_bit(MD_CHANGE_DEVS, &mddev->flags)) |
2178 | 2183 | force_change = 1; |
... | ... | @@ -2220,19 +2225,6 @@ |
2220 | 2225 | */ |
2221 | 2226 | MD_BUG(); |
2222 | 2227 | mddev->events --; |
2223 | - } | |
2224 | - | |
2225 | - /* | |
2226 | - * do not write anything to disk if using | |
2227 | - * nonpersistent superblocks | |
2228 | - */ | |
2229 | - if (!mddev->persistent) { | |
2230 | - if (!mddev->external) | |
2231 | - clear_bit(MD_CHANGE_PENDING, &mddev->flags); | |
2232 | - | |
2233 | - spin_unlock_irq(&mddev->write_lock); | |
2234 | - wake_up(&mddev->sb_wait); | |
2235 | - return; | |
2236 | 2228 | } |
2237 | 2229 | sync_sbs(mddev, nospares); |
2238 | 2230 | spin_unlock_irq(&mddev->write_lock); |
drivers/md/raid1.c
... | ... | @@ -787,8 +787,8 @@ |
787 | 787 | struct bio_list bl; |
788 | 788 | struct page **behind_pages = NULL; |
789 | 789 | const int rw = bio_data_dir(bio); |
790 | - const bool do_sync = (bio->bi_rw & REQ_SYNC); | |
791 | - bool do_barriers; | |
790 | + const unsigned long do_sync = (bio->bi_rw & REQ_SYNC); | |
791 | + unsigned long do_barriers; | |
792 | 792 | mdk_rdev_t *blocked_rdev; |
793 | 793 | |
794 | 794 | /* |
... | ... | @@ -1120,6 +1120,8 @@ |
1120 | 1120 | { |
1121 | 1121 | int i; |
1122 | 1122 | conf_t *conf = mddev->private; |
1123 | + int count = 0; | |
1124 | + unsigned long flags; | |
1123 | 1125 | |
1124 | 1126 | /* |
1125 | 1127 | * Find all failed disks within the RAID1 configuration |
1126 | 1128 | |
1127 | 1129 | |
... | ... | @@ -1131,15 +1133,16 @@ |
1131 | 1133 | if (rdev |
1132 | 1134 | && !test_bit(Faulty, &rdev->flags) |
1133 | 1135 | && !test_and_set_bit(In_sync, &rdev->flags)) { |
1134 | - unsigned long flags; | |
1135 | - spin_lock_irqsave(&conf->device_lock, flags); | |
1136 | - mddev->degraded--; | |
1137 | - spin_unlock_irqrestore(&conf->device_lock, flags); | |
1136 | + count++; | |
1137 | + sysfs_notify_dirent(rdev->sysfs_state); | |
1138 | 1138 | } |
1139 | 1139 | } |
1140 | + spin_lock_irqsave(&conf->device_lock, flags); | |
1141 | + mddev->degraded -= count; | |
1142 | + spin_unlock_irqrestore(&conf->device_lock, flags); | |
1140 | 1143 | |
1141 | 1144 | print_conf(conf); |
1142 | - return 0; | |
1145 | + return count; | |
1143 | 1146 | } |
1144 | 1147 | |
1145 | 1148 | |
... | ... | @@ -1640,7 +1643,7 @@ |
1640 | 1643 | * We already have a nr_pending reference on these rdevs. |
1641 | 1644 | */ |
1642 | 1645 | int i; |
1643 | - const bool do_sync = (r1_bio->master_bio->bi_rw & REQ_SYNC); | |
1646 | + const unsigned long do_sync = (r1_bio->master_bio->bi_rw & REQ_SYNC); | |
1644 | 1647 | clear_bit(R1BIO_BarrierRetry, &r1_bio->state); |
1645 | 1648 | clear_bit(R1BIO_Barrier, &r1_bio->state); |
1646 | 1649 | for (i=0; i < conf->raid_disks; i++) |
... | ... | @@ -1696,7 +1699,7 @@ |
1696 | 1699 | (unsigned long long)r1_bio->sector); |
1697 | 1700 | raid_end_bio_io(r1_bio); |
1698 | 1701 | } else { |
1699 | - const bool do_sync = r1_bio->master_bio->bi_rw & REQ_SYNC; | |
1702 | + const unsigned long do_sync = r1_bio->master_bio->bi_rw & REQ_SYNC; | |
1700 | 1703 | r1_bio->bios[r1_bio->read_disk] = |
1701 | 1704 | mddev->ro ? IO_BLOCKED : NULL; |
1702 | 1705 | r1_bio->read_disk = disk; |
drivers/md/raid10.c
... | ... | @@ -799,7 +799,7 @@ |
799 | 799 | int i; |
800 | 800 | int chunk_sects = conf->chunk_mask + 1; |
801 | 801 | const int rw = bio_data_dir(bio); |
802 | - const bool do_sync = (bio->bi_rw & REQ_SYNC); | |
802 | + const unsigned long do_sync = (bio->bi_rw & REQ_SYNC); | |
803 | 803 | struct bio_list bl; |
804 | 804 | unsigned long flags; |
805 | 805 | mdk_rdev_t *blocked_rdev; |
... | ... | @@ -1116,6 +1116,8 @@ |
1116 | 1116 | int i; |
1117 | 1117 | conf_t *conf = mddev->private; |
1118 | 1118 | mirror_info_t *tmp; |
1119 | + int count = 0; | |
1120 | + unsigned long flags; | |
1119 | 1121 | |
1120 | 1122 | /* |
1121 | 1123 | * Find all non-in_sync disks within the RAID10 configuration |
1122 | 1124 | |
1123 | 1125 | |
... | ... | @@ -1126,15 +1128,16 @@ |
1126 | 1128 | if (tmp->rdev |
1127 | 1129 | && !test_bit(Faulty, &tmp->rdev->flags) |
1128 | 1130 | && !test_and_set_bit(In_sync, &tmp->rdev->flags)) { |
1129 | - unsigned long flags; | |
1130 | - spin_lock_irqsave(&conf->device_lock, flags); | |
1131 | - mddev->degraded--; | |
1132 | - spin_unlock_irqrestore(&conf->device_lock, flags); | |
1131 | + count++; | |
1132 | + sysfs_notify_dirent(tmp->rdev->sysfs_state); | |
1133 | 1133 | } |
1134 | 1134 | } |
1135 | + spin_lock_irqsave(&conf->device_lock, flags); | |
1136 | + mddev->degraded -= count; | |
1137 | + spin_unlock_irqrestore(&conf->device_lock, flags); | |
1135 | 1138 | |
1136 | 1139 | print_conf(conf); |
1137 | - return 0; | |
1140 | + return count; | |
1138 | 1141 | } |
1139 | 1142 | |
1140 | 1143 | |
... | ... | @@ -1734,7 +1737,7 @@ |
1734 | 1737 | raid_end_bio_io(r10_bio); |
1735 | 1738 | bio_put(bio); |
1736 | 1739 | } else { |
1737 | - const bool do_sync = (r10_bio->master_bio->bi_rw & REQ_SYNC); | |
1740 | + const unsigned long do_sync = (r10_bio->master_bio->bi_rw & REQ_SYNC); | |
1738 | 1741 | bio_put(bio); |
1739 | 1742 | rdev = conf->mirrors[mirror].rdev; |
1740 | 1743 | if (printk_ratelimit()) |
drivers/md/raid5.c
... | ... | @@ -5330,6 +5330,8 @@ |
5330 | 5330 | int i; |
5331 | 5331 | raid5_conf_t *conf = mddev->private; |
5332 | 5332 | struct disk_info *tmp; |
5333 | + int count = 0; | |
5334 | + unsigned long flags; | |
5333 | 5335 | |
5334 | 5336 | for (i = 0; i < conf->raid_disks; i++) { |
5335 | 5337 | tmp = conf->disks + i; |
5336 | 5338 | |
5337 | 5339 | |
... | ... | @@ -5337,14 +5339,15 @@ |
5337 | 5339 | && tmp->rdev->recovery_offset == MaxSector |
5338 | 5340 | && !test_bit(Faulty, &tmp->rdev->flags) |
5339 | 5341 | && !test_and_set_bit(In_sync, &tmp->rdev->flags)) { |
5340 | - unsigned long flags; | |
5341 | - spin_lock_irqsave(&conf->device_lock, flags); | |
5342 | - mddev->degraded--; | |
5343 | - spin_unlock_irqrestore(&conf->device_lock, flags); | |
5342 | + count++; | |
5343 | + sysfs_notify_dirent(tmp->rdev->sysfs_state); | |
5344 | 5344 | } |
5345 | 5345 | } |
5346 | + spin_lock_irqsave(&conf->device_lock, flags); | |
5347 | + mddev->degraded -= count; | |
5348 | + spin_unlock_irqrestore(&conf->device_lock, flags); | |
5346 | 5349 | print_raid5_conf(conf); |
5347 | - return 0; | |
5350 | + return count; | |
5348 | 5351 | } |
5349 | 5352 | |
5350 | 5353 | static int raid5_remove_disk(mddev_t *mddev, int number) |