aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/md')
-rw-r--r--drivers/md/.gitignore4
-rw-r--r--drivers/md/bitmap.c3
-rw-r--r--drivers/md/md.c71
-rw-r--r--drivers/md/md.h2
-rw-r--r--drivers/md/raid1.c21
-rw-r--r--drivers/md/raid10.c17
-rw-r--r--drivers/md/raid5.c13
7 files changed, 62 insertions, 69 deletions
diff --git a/drivers/md/.gitignore b/drivers/md/.gitignore
deleted file mode 100644
index a7afec6b19c6..000000000000
--- a/drivers/md/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
1mktables
2raid6altivec*.c
3raid6int*.c
4raid6tables.c
diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c
index 1ba1e122e948..ed4900ade93a 100644
--- a/drivers/md/bitmap.c
+++ b/drivers/md/bitmap.c
@@ -1542,8 +1542,7 @@ void bitmap_cond_end_sync(struct bitmap *bitmap, sector_t sector)
1542 atomic_read(&bitmap->mddev->recovery_active) == 0); 1542 atomic_read(&bitmap->mddev->recovery_active) == 0);
1543 1543
1544 bitmap->mddev->curr_resync_completed = bitmap->mddev->curr_resync; 1544 bitmap->mddev->curr_resync_completed = bitmap->mddev->curr_resync;
1545 if (bitmap->mddev->persistent) 1545 set_bit(MD_CHANGE_CLEAN, &bitmap->mddev->flags);
1546 set_bit(MD_CHANGE_CLEAN, &bitmap->mddev->flags);
1547 sector &= ~((1ULL << CHUNK_BLOCK_SHIFT(bitmap)) - 1); 1546 sector &= ~((1ULL << CHUNK_BLOCK_SHIFT(bitmap)) - 1);
1548 s = 0; 1547 s = 0;
1549 while (s < sector && s < bitmap->mddev->resync_max_sectors) { 1548 while (s < sector && s < bitmap->mddev->resync_max_sectors) {
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 11567c7999a2..f20d13e717d5 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -1643,7 +1643,9 @@ static void super_1_sync(mddev_t *mddev, mdk_rdev_t *rdev)
1643 bmask = queue_logical_block_size(rdev->bdev->bd_disk->queue)-1; 1643 bmask = queue_logical_block_size(rdev->bdev->bd_disk->queue)-1;
1644 if (rdev->sb_size & bmask) 1644 if (rdev->sb_size & bmask)
1645 rdev->sb_size = (rdev->sb_size | bmask) + 1; 1645 rdev->sb_size = (rdev->sb_size | bmask) + 1;
1646 } 1646 } else
1647 max_dev = le32_to_cpu(sb->max_dev);
1648
1647 for (i=0; i<max_dev;i++) 1649 for (i=0; i<max_dev;i++)
1648 sb->dev_roles[i] = cpu_to_le16(0xfffe); 1650 sb->dev_roles[i] = cpu_to_le16(0xfffe);
1649 1651
@@ -2136,16 +2138,6 @@ static void sync_sbs(mddev_t * mddev, int nospares)
2136 * with the rest of the array) 2138 * with the rest of the array)
2137 */ 2139 */
2138 mdk_rdev_t *rdev; 2140 mdk_rdev_t *rdev;
2139
2140 /* First make sure individual recovery_offsets are correct */
2141 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) { 2141 list_for_each_entry(rdev, &mddev->disks, same_set) {
2150 if (rdev->sb_events == mddev->events || 2142 if (rdev->sb_events == mddev->events ||
2151 (nospares && 2143 (nospares &&
@@ -2167,13 +2159,27 @@ static void md_update_sb(mddev_t * mddev, int force_change)
2167 int sync_req; 2159 int sync_req;
2168 int nospares = 0; 2160 int nospares = 0;
2169 2161
2170 mddev->utime = get_seconds();
2171 if (mddev->external)
2172 return;
2173repeat: 2162repeat:
2163 /* First make sure individual recovery_offsets are correct */
2164 list_for_each_entry(rdev, &mddev->disks, same_set) {
2165 if (rdev->raid_disk >= 0 &&
2166 mddev->delta_disks >= 0 &&
2167 !test_bit(In_sync, &rdev->flags) &&
2168 mddev->curr_resync_completed > rdev->recovery_offset)
2169 rdev->recovery_offset = mddev->curr_resync_completed;
2170
2171 }
2172 if (!mddev->persistent) {
2173 clear_bit(MD_CHANGE_CLEAN, &mddev->flags);
2174 clear_bit(MD_CHANGE_DEVS, &mddev->flags);
2175 wake_up(&mddev->sb_wait);
2176 return;
2177 }
2178
2174 spin_lock_irq(&mddev->write_lock); 2179 spin_lock_irq(&mddev->write_lock);
2175 2180
2176 set_bit(MD_CHANGE_PENDING, &mddev->flags); 2181 mddev->utime = get_seconds();
2182
2177 if (test_and_clear_bit(MD_CHANGE_DEVS, &mddev->flags)) 2183 if (test_and_clear_bit(MD_CHANGE_DEVS, &mddev->flags))
2178 force_change = 1; 2184 force_change = 1;
2179 if (test_and_clear_bit(MD_CHANGE_CLEAN, &mddev->flags)) 2185 if (test_and_clear_bit(MD_CHANGE_CLEAN, &mddev->flags))
@@ -2221,19 +2227,6 @@ repeat:
2221 MD_BUG(); 2227 MD_BUG();
2222 mddev->events --; 2228 mddev->events --;
2223 } 2229 }
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 }
2237 sync_sbs(mddev, nospares); 2230 sync_sbs(mddev, nospares);
2238 spin_unlock_irq(&mddev->write_lock); 2231 spin_unlock_irq(&mddev->write_lock);
2239 2232
@@ -3379,7 +3372,7 @@ array_state_show(mddev_t *mddev, char *page)
3379 case 0: 3372 case 0:
3380 if (mddev->in_sync) 3373 if (mddev->in_sync)
3381 st = clean; 3374 st = clean;
3382 else if (test_bit(MD_CHANGE_CLEAN, &mddev->flags)) 3375 else if (test_bit(MD_CHANGE_PENDING, &mddev->flags))
3383 st = write_pending; 3376 st = write_pending;
3384 else if (mddev->safemode) 3377 else if (mddev->safemode)
3385 st = active_idle; 3378 st = active_idle;
@@ -3460,9 +3453,7 @@ array_state_store(mddev_t *mddev, const char *buf, size_t len)
3460 mddev->in_sync = 1; 3453 mddev->in_sync = 1;
3461 if (mddev->safemode == 1) 3454 if (mddev->safemode == 1)
3462 mddev->safemode = 0; 3455 mddev->safemode = 0;
3463 if (mddev->persistent) 3456 set_bit(MD_CHANGE_CLEAN, &mddev->flags);
3464 set_bit(MD_CHANGE_CLEAN,
3465 &mddev->flags);
3466 } 3457 }
3467 err = 0; 3458 err = 0;
3468 } else 3459 } else
@@ -3474,8 +3465,7 @@ array_state_store(mddev_t *mddev, const char *buf, size_t len)
3474 case active: 3465 case active:
3475 if (mddev->pers) { 3466 if (mddev->pers) {
3476 restart_array(mddev); 3467 restart_array(mddev);
3477 if (mddev->external) 3468 clear_bit(MD_CHANGE_PENDING, &mddev->flags);
3478 clear_bit(MD_CHANGE_CLEAN, &mddev->flags);
3479 wake_up(&mddev->sb_wait); 3469 wake_up(&mddev->sb_wait);
3480 err = 0; 3470 err = 0;
3481 } else { 3471 } else {
@@ -6580,6 +6570,7 @@ void md_write_start(mddev_t *mddev, struct bio *bi)
6580 if (mddev->in_sync) { 6570 if (mddev->in_sync) {
6581 mddev->in_sync = 0; 6571 mddev->in_sync = 0;
6582 set_bit(MD_CHANGE_CLEAN, &mddev->flags); 6572 set_bit(MD_CHANGE_CLEAN, &mddev->flags);
6573 set_bit(MD_CHANGE_PENDING, &mddev->flags);
6583 md_wakeup_thread(mddev->thread); 6574 md_wakeup_thread(mddev->thread);
6584 did_change = 1; 6575 did_change = 1;
6585 } 6576 }
@@ -6588,7 +6579,6 @@ void md_write_start(mddev_t *mddev, struct bio *bi)
6588 if (did_change) 6579 if (did_change)
6589 sysfs_notify_dirent_safe(mddev->sysfs_state); 6580 sysfs_notify_dirent_safe(mddev->sysfs_state);
6590 wait_event(mddev->sb_wait, 6581 wait_event(mddev->sb_wait,
6591 !test_bit(MD_CHANGE_CLEAN, &mddev->flags) &&
6592 !test_bit(MD_CHANGE_PENDING, &mddev->flags)); 6582 !test_bit(MD_CHANGE_PENDING, &mddev->flags));
6593} 6583}
6594 6584
@@ -6624,6 +6614,7 @@ int md_allow_write(mddev_t *mddev)
6624 if (mddev->in_sync) { 6614 if (mddev->in_sync) {
6625 mddev->in_sync = 0; 6615 mddev->in_sync = 0;
6626 set_bit(MD_CHANGE_CLEAN, &mddev->flags); 6616 set_bit(MD_CHANGE_CLEAN, &mddev->flags);
6617 set_bit(MD_CHANGE_PENDING, &mddev->flags);
6627 if (mddev->safemode_delay && 6618 if (mddev->safemode_delay &&
6628 mddev->safemode == 0) 6619 mddev->safemode == 0)
6629 mddev->safemode = 1; 6620 mddev->safemode = 1;
@@ -6633,7 +6624,7 @@ int md_allow_write(mddev_t *mddev)
6633 } else 6624 } else
6634 spin_unlock_irq(&mddev->write_lock); 6625 spin_unlock_irq(&mddev->write_lock);
6635 6626
6636 if (test_bit(MD_CHANGE_CLEAN, &mddev->flags)) 6627 if (test_bit(MD_CHANGE_PENDING, &mddev->flags))
6637 return -EAGAIN; 6628 return -EAGAIN;
6638 else 6629 else
6639 return 0; 6630 return 0;
@@ -6831,8 +6822,7 @@ void md_do_sync(mddev_t *mddev)
6831 atomic_read(&mddev->recovery_active) == 0); 6822 atomic_read(&mddev->recovery_active) == 0);
6832 mddev->curr_resync_completed = 6823 mddev->curr_resync_completed =
6833 mddev->curr_resync; 6824 mddev->curr_resync;
6834 if (mddev->persistent) 6825 set_bit(MD_CHANGE_CLEAN, &mddev->flags);
6835 set_bit(MD_CHANGE_CLEAN, &mddev->flags);
6836 sysfs_notify(&mddev->kobj, NULL, "sync_completed"); 6826 sysfs_notify(&mddev->kobj, NULL, "sync_completed");
6837 } 6827 }
6838 6828
@@ -7081,7 +7071,7 @@ void md_check_recovery(mddev_t *mddev)
7081 if (mddev->ro && !test_bit(MD_RECOVERY_NEEDED, &mddev->recovery)) 7071 if (mddev->ro && !test_bit(MD_RECOVERY_NEEDED, &mddev->recovery))
7082 return; 7072 return;
7083 if ( ! ( 7073 if ( ! (
7084 (mddev->flags && !mddev->external) || 7074 (mddev->flags & ~ (1<<MD_CHANGE_PENDING)) ||
7085 test_bit(MD_RECOVERY_NEEDED, &mddev->recovery) || 7075 test_bit(MD_RECOVERY_NEEDED, &mddev->recovery) ||
7086 test_bit(MD_RECOVERY_DONE, &mddev->recovery) || 7076 test_bit(MD_RECOVERY_DONE, &mddev->recovery) ||
7087 (mddev->external == 0 && mddev->safemode == 1) || 7077 (mddev->external == 0 && mddev->safemode == 1) ||
@@ -7111,8 +7101,7 @@ void md_check_recovery(mddev_t *mddev)
7111 mddev->recovery_cp == MaxSector) { 7101 mddev->recovery_cp == MaxSector) {
7112 mddev->in_sync = 1; 7102 mddev->in_sync = 1;
7113 did_change = 1; 7103 did_change = 1;
7114 if (mddev->persistent) 7104 set_bit(MD_CHANGE_CLEAN, &mddev->flags);
7115 set_bit(MD_CHANGE_CLEAN, &mddev->flags);
7116 } 7105 }
7117 if (mddev->safemode == 1) 7106 if (mddev->safemode == 1)
7118 mddev->safemode = 0; 7107 mddev->safemode = 0;
diff --git a/drivers/md/md.h b/drivers/md/md.h
index a953fe2808ae..3931299788dc 100644
--- a/drivers/md/md.h
+++ b/drivers/md/md.h
@@ -140,7 +140,7 @@ struct mddev_s
140 unsigned long flags; 140 unsigned long flags;
141#define MD_CHANGE_DEVS 0 /* Some device status has changed */ 141#define MD_CHANGE_DEVS 0 /* Some device status has changed */
142#define MD_CHANGE_CLEAN 1 /* transition to or from 'clean' */ 142#define MD_CHANGE_CLEAN 1 /* transition to or from 'clean' */
143#define MD_CHANGE_PENDING 2 /* superblock update in progress */ 143#define MD_CHANGE_PENDING 2 /* switch from 'clean' to 'active' in progress */
144 144
145 int suspended; 145 int suspended;
146 atomic_t active_io; 146 atomic_t active_io;
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
index 73cc74ffc26b..ad83a4dcadc3 100644
--- a/drivers/md/raid1.c
+++ b/drivers/md/raid1.c
@@ -787,8 +787,8 @@ static int make_request(mddev_t *mddev, struct bio * bio)
787 struct bio_list bl; 787 struct bio_list bl;
788 struct page **behind_pages = NULL; 788 struct page **behind_pages = NULL;
789 const int rw = bio_data_dir(bio); 789 const int rw = bio_data_dir(bio);
790 const bool do_sync = (bio->bi_rw & REQ_SYNC); 790 const unsigned long do_sync = (bio->bi_rw & REQ_SYNC);
791 bool do_barriers; 791 unsigned long do_barriers;
792 mdk_rdev_t *blocked_rdev; 792 mdk_rdev_t *blocked_rdev;
793 793
794 /* 794 /*
@@ -1120,6 +1120,8 @@ static int raid1_spare_active(mddev_t *mddev)
1120{ 1120{
1121 int i; 1121 int i;
1122 conf_t *conf = mddev->private; 1122 conf_t *conf = mddev->private;
1123 int count = 0;
1124 unsigned long flags;
1123 1125
1124 /* 1126 /*
1125 * Find all failed disks within the RAID1 configuration 1127 * Find all failed disks within the RAID1 configuration
@@ -1131,15 +1133,16 @@ static int raid1_spare_active(mddev_t *mddev)
1131 if (rdev 1133 if (rdev
1132 && !test_bit(Faulty, &rdev->flags) 1134 && !test_bit(Faulty, &rdev->flags)
1133 && !test_and_set_bit(In_sync, &rdev->flags)) { 1135 && !test_and_set_bit(In_sync, &rdev->flags)) {
1134 unsigned long flags; 1136 count++;
1135 spin_lock_irqsave(&conf->device_lock, flags); 1137 sysfs_notify_dirent(rdev->sysfs_state);
1136 mddev->degraded--;
1137 spin_unlock_irqrestore(&conf->device_lock, flags);
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 print_conf(conf); 1144 print_conf(conf);
1142 return 0; 1145 return count;
1143} 1146}
1144 1147
1145 1148
@@ -1640,7 +1643,7 @@ static void raid1d(mddev_t *mddev)
1640 * We already have a nr_pending reference on these rdevs. 1643 * We already have a nr_pending reference on these rdevs.
1641 */ 1644 */
1642 int i; 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 clear_bit(R1BIO_BarrierRetry, &r1_bio->state); 1647 clear_bit(R1BIO_BarrierRetry, &r1_bio->state);
1645 clear_bit(R1BIO_Barrier, &r1_bio->state); 1648 clear_bit(R1BIO_Barrier, &r1_bio->state);
1646 for (i=0; i < conf->raid_disks; i++) 1649 for (i=0; i < conf->raid_disks; i++)
@@ -1696,7 +1699,7 @@ static void raid1d(mddev_t *mddev)
1696 (unsigned long long)r1_bio->sector); 1699 (unsigned long long)r1_bio->sector);
1697 raid_end_bio_io(r1_bio); 1700 raid_end_bio_io(r1_bio);
1698 } else { 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 r1_bio->bios[r1_bio->read_disk] = 1703 r1_bio->bios[r1_bio->read_disk] =
1701 mddev->ro ? IO_BLOCKED : NULL; 1704 mddev->ro ? IO_BLOCKED : NULL;
1702 r1_bio->read_disk = disk; 1705 r1_bio->read_disk = disk;
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
index a88aeb5198c7..84718383124d 100644
--- a/drivers/md/raid10.c
+++ b/drivers/md/raid10.c
@@ -799,7 +799,7 @@ static int make_request(mddev_t *mddev, struct bio * bio)
799 int i; 799 int i;
800 int chunk_sects = conf->chunk_mask + 1; 800 int chunk_sects = conf->chunk_mask + 1;
801 const int rw = bio_data_dir(bio); 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 struct bio_list bl; 803 struct bio_list bl;
804 unsigned long flags; 804 unsigned long flags;
805 mdk_rdev_t *blocked_rdev; 805 mdk_rdev_t *blocked_rdev;
@@ -1116,6 +1116,8 @@ static int raid10_spare_active(mddev_t *mddev)
1116 int i; 1116 int i;
1117 conf_t *conf = mddev->private; 1117 conf_t *conf = mddev->private;
1118 mirror_info_t *tmp; 1118 mirror_info_t *tmp;
1119 int count = 0;
1120 unsigned long flags;
1119 1121
1120 /* 1122 /*
1121 * Find all non-in_sync disks within the RAID10 configuration 1123 * Find all non-in_sync disks within the RAID10 configuration
@@ -1126,15 +1128,16 @@ static int raid10_spare_active(mddev_t *mddev)
1126 if (tmp->rdev 1128 if (tmp->rdev
1127 && !test_bit(Faulty, &tmp->rdev->flags) 1129 && !test_bit(Faulty, &tmp->rdev->flags)
1128 && !test_and_set_bit(In_sync, &tmp->rdev->flags)) { 1130 && !test_and_set_bit(In_sync, &tmp->rdev->flags)) {
1129 unsigned long flags; 1131 count++;
1130 spin_lock_irqsave(&conf->device_lock, flags); 1132 sysfs_notify_dirent(tmp->rdev->sysfs_state);
1131 mddev->degraded--;
1132 spin_unlock_irqrestore(&conf->device_lock, flags);
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 print_conf(conf); 1139 print_conf(conf);
1137 return 0; 1140 return count;
1138} 1141}
1139 1142
1140 1143
@@ -1734,7 +1737,7 @@ static void raid10d(mddev_t *mddev)
1734 raid_end_bio_io(r10_bio); 1737 raid_end_bio_io(r10_bio);
1735 bio_put(bio); 1738 bio_put(bio);
1736 } else { 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 bio_put(bio); 1741 bio_put(bio);
1739 rdev = conf->mirrors[mirror].rdev; 1742 rdev = conf->mirrors[mirror].rdev;
1740 if (printk_ratelimit()) 1743 if (printk_ratelimit())
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
index 866d4b5a144c..69b0a169e43d 100644
--- a/drivers/md/raid5.c
+++ b/drivers/md/raid5.c
@@ -5330,6 +5330,8 @@ static int raid5_spare_active(mddev_t *mddev)
5330 int i; 5330 int i;
5331 raid5_conf_t *conf = mddev->private; 5331 raid5_conf_t *conf = mddev->private;
5332 struct disk_info *tmp; 5332 struct disk_info *tmp;
5333 int count = 0;
5334 unsigned long flags;
5333 5335
5334 for (i = 0; i < conf->raid_disks; i++) { 5336 for (i = 0; i < conf->raid_disks; i++) {
5335 tmp = conf->disks + i; 5337 tmp = conf->disks + i;
@@ -5337,14 +5339,15 @@ static int raid5_spare_active(mddev_t *mddev)
5337 && tmp->rdev->recovery_offset == MaxSector 5339 && tmp->rdev->recovery_offset == MaxSector
5338 && !test_bit(Faulty, &tmp->rdev->flags) 5340 && !test_bit(Faulty, &tmp->rdev->flags)
5339 && !test_and_set_bit(In_sync, &tmp->rdev->flags)) { 5341 && !test_and_set_bit(In_sync, &tmp->rdev->flags)) {
5340 unsigned long flags; 5342 count++;
5341 spin_lock_irqsave(&conf->device_lock, flags); 5343 sysfs_notify_dirent(tmp->rdev->sysfs_state);
5342 mddev->degraded--;
5343 spin_unlock_irqrestore(&conf->device_lock, flags);
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 print_raid5_conf(conf); 5349 print_raid5_conf(conf);
5347 return 0; 5350 return count;
5348} 5351}
5349 5352
5350static int raid5_remove_disk(mddev_t *mddev, int number) 5353static int raid5_remove_disk(mddev_t *mddev, int number)