diff options
-rw-r--r-- | drivers/md/bitmap.c | 35 | ||||
-rw-r--r-- | drivers/md/raid1.c | 1 | ||||
-rw-r--r-- | drivers/md/raid10.c | 2 | ||||
-rw-r--r-- | drivers/md/raid5.c | 3 | ||||
-rw-r--r-- | include/linux/raid/bitmap.h | 3 |
5 files changed, 39 insertions, 5 deletions
diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c index 1b1ef3130e6e..9231cd700fe8 100644 --- a/drivers/md/bitmap.c +++ b/drivers/md/bitmap.c | |||
@@ -1348,14 +1348,38 @@ void bitmap_close_sync(struct bitmap *bitmap) | |||
1348 | */ | 1348 | */ |
1349 | sector_t sector = 0; | 1349 | sector_t sector = 0; |
1350 | int blocks; | 1350 | int blocks; |
1351 | if (!bitmap) return; | 1351 | if (!bitmap) |
1352 | return; | ||
1352 | while (sector < bitmap->mddev->resync_max_sectors) { | 1353 | while (sector < bitmap->mddev->resync_max_sectors) { |
1353 | bitmap_end_sync(bitmap, sector, &blocks, 0); | 1354 | bitmap_end_sync(bitmap, sector, &blocks, 0); |
1354 | /* | 1355 | sector += blocks; |
1355 | if (sector < 500) printk("bitmap_close_sync: sec %llu blks %d\n", | 1356 | } |
1356 | (unsigned long long)sector, blocks); | 1357 | } |
1357 | */ sector += blocks; | 1358 | |
1359 | void bitmap_cond_end_sync(struct bitmap *bitmap, sector_t sector) | ||
1360 | { | ||
1361 | sector_t s = 0; | ||
1362 | int blocks; | ||
1363 | |||
1364 | if (!bitmap) | ||
1365 | return; | ||
1366 | if (sector == 0) { | ||
1367 | bitmap->last_end_sync = jiffies; | ||
1368 | return; | ||
1369 | } | ||
1370 | if (time_before(jiffies, (bitmap->last_end_sync | ||
1371 | + bitmap->daemon_sleep * HZ))) | ||
1372 | return; | ||
1373 | wait_event(bitmap->mddev->recovery_wait, | ||
1374 | atomic_read(&bitmap->mddev->recovery_active) == 0); | ||
1375 | |||
1376 | sector &= ~((1ULL << CHUNK_BLOCK_SHIFT(bitmap)) - 1); | ||
1377 | s = 0; | ||
1378 | while (s < sector && s < bitmap->mddev->resync_max_sectors) { | ||
1379 | bitmap_end_sync(bitmap, s, &blocks, 0); | ||
1380 | s += blocks; | ||
1358 | } | 1381 | } |
1382 | bitmap->last_end_sync = jiffies; | ||
1359 | } | 1383 | } |
1360 | 1384 | ||
1361 | static void bitmap_set_memory_bits(struct bitmap *bitmap, sector_t offset, int needed) | 1385 | static void bitmap_set_memory_bits(struct bitmap *bitmap, sector_t offset, int needed) |
@@ -1565,3 +1589,4 @@ EXPORT_SYMBOL(bitmap_start_sync); | |||
1565 | EXPORT_SYMBOL(bitmap_end_sync); | 1589 | EXPORT_SYMBOL(bitmap_end_sync); |
1566 | EXPORT_SYMBOL(bitmap_unplug); | 1590 | EXPORT_SYMBOL(bitmap_unplug); |
1567 | EXPORT_SYMBOL(bitmap_close_sync); | 1591 | EXPORT_SYMBOL(bitmap_close_sync); |
1592 | EXPORT_SYMBOL(bitmap_cond_end_sync); | ||
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 4a69c416e045..e0b8d0dd7a87 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c | |||
@@ -1684,6 +1684,7 @@ static sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *skipped, i | |||
1684 | if (!go_faster && conf->nr_waiting) | 1684 | if (!go_faster && conf->nr_waiting) |
1685 | msleep_interruptible(1000); | 1685 | msleep_interruptible(1000); |
1686 | 1686 | ||
1687 | bitmap_cond_end_sync(mddev->bitmap, sector_nr); | ||
1687 | raise_barrier(conf); | 1688 | raise_barrier(conf); |
1688 | 1689 | ||
1689 | conf->next_resync = sector_nr; | 1690 | conf->next_resync = sector_nr; |
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 5cdcc9386200..ba125277c6c4 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c | |||
@@ -1670,6 +1670,8 @@ static sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *skipped, i | |||
1670 | if (!go_faster && conf->nr_waiting) | 1670 | if (!go_faster && conf->nr_waiting) |
1671 | msleep_interruptible(1000); | 1671 | msleep_interruptible(1000); |
1672 | 1672 | ||
1673 | bitmap_cond_end_sync(mddev->bitmap, sector_nr); | ||
1674 | |||
1673 | /* Again, very different code for resync and recovery. | 1675 | /* Again, very different code for resync and recovery. |
1674 | * Both must result in an r10bio with a list of bios that | 1676 | * Both must result in an r10bio with a list of bios that |
1675 | * have bi_end_io, bi_sector, bi_bdev set, | 1677 | * have bi_end_io, bi_sector, bi_bdev set, |
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index e8c8157b02fc..388a974d63ef 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
@@ -3753,6 +3753,9 @@ static inline sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *ski | |||
3753 | return sync_blocks * STRIPE_SECTORS; /* keep things rounded to whole stripes */ | 3753 | return sync_blocks * STRIPE_SECTORS; /* keep things rounded to whole stripes */ |
3754 | } | 3754 | } |
3755 | 3755 | ||
3756 | |||
3757 | bitmap_cond_end_sync(mddev->bitmap, sector_nr); | ||
3758 | |||
3756 | pd_idx = stripe_to_pdidx(sector_nr, conf, raid_disks); | 3759 | pd_idx = stripe_to_pdidx(sector_nr, conf, raid_disks); |
3757 | sh = get_active_stripe(conf, sector_nr, raid_disks, pd_idx, 1); | 3760 | sh = get_active_stripe(conf, sector_nr, raid_disks, pd_idx, 1); |
3758 | if (sh == NULL) { | 3761 | if (sh == NULL) { |
diff --git a/include/linux/raid/bitmap.h b/include/linux/raid/bitmap.h index 306a1d1a5af0..e51b531cd0b2 100644 --- a/include/linux/raid/bitmap.h +++ b/include/linux/raid/bitmap.h | |||
@@ -244,6 +244,8 @@ struct bitmap { | |||
244 | */ | 244 | */ |
245 | unsigned long daemon_lastrun; /* jiffies of last run */ | 245 | unsigned long daemon_lastrun; /* jiffies of last run */ |
246 | unsigned long daemon_sleep; /* how many seconds between updates? */ | 246 | unsigned long daemon_sleep; /* how many seconds between updates? */ |
247 | unsigned long last_end_sync; /* when we lasted called end_sync to | ||
248 | * update bitmap with resync progress */ | ||
247 | 249 | ||
248 | atomic_t pending_writes; /* pending writes to the bitmap file */ | 250 | atomic_t pending_writes; /* pending writes to the bitmap file */ |
249 | wait_queue_head_t write_wait; | 251 | wait_queue_head_t write_wait; |
@@ -275,6 +277,7 @@ void bitmap_endwrite(struct bitmap *bitmap, sector_t offset, | |||
275 | int bitmap_start_sync(struct bitmap *bitmap, sector_t offset, int *blocks, int degraded); | 277 | int bitmap_start_sync(struct bitmap *bitmap, sector_t offset, int *blocks, int degraded); |
276 | 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); |
277 | void bitmap_close_sync(struct bitmap *bitmap); | 279 | void bitmap_close_sync(struct bitmap *bitmap); |
280 | void bitmap_cond_end_sync(struct bitmap *bitmap, sector_t sector); | ||
278 | 281 | ||
279 | void bitmap_unplug(struct bitmap *bitmap); | 282 | void bitmap_unplug(struct bitmap *bitmap); |
280 | void bitmap_daemon_work(struct bitmap *bitmap); | 283 | void bitmap_daemon_work(struct bitmap *bitmap); |