|
@@ -1348,14 +1348,38 @@ void bitmap_close_sync(struct bitmap *bitmap)
|
|
|
*/
|
|
|
sector_t sector = 0;
|
|
|
int blocks;
|
|
|
- if (!bitmap) return;
|
|
|
+ if (!bitmap)
|
|
|
+ return;
|
|
|
while (sector < bitmap->mddev->resync_max_sectors) {
|
|
|
bitmap_end_sync(bitmap, sector, &blocks, 0);
|
|
|
-/*
|
|
|
- if (sector < 500) printk("bitmap_close_sync: sec %llu blks %d\n",
|
|
|
- (unsigned long long)sector, blocks);
|
|
|
-*/ sector += blocks;
|
|
|
+ sector += blocks;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void bitmap_cond_end_sync(struct bitmap *bitmap, sector_t sector)
|
|
|
+{
|
|
|
+ sector_t s = 0;
|
|
|
+ int blocks;
|
|
|
+
|
|
|
+ if (!bitmap)
|
|
|
+ return;
|
|
|
+ if (sector == 0) {
|
|
|
+ bitmap->last_end_sync = jiffies;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (time_before(jiffies, (bitmap->last_end_sync
|
|
|
+ + bitmap->daemon_sleep * HZ)))
|
|
|
+ return;
|
|
|
+ wait_event(bitmap->mddev->recovery_wait,
|
|
|
+ atomic_read(&bitmap->mddev->recovery_active) == 0);
|
|
|
+
|
|
|
+ sector &= ~((1ULL << CHUNK_BLOCK_SHIFT(bitmap)) - 1);
|
|
|
+ s = 0;
|
|
|
+ while (s < sector && s < bitmap->mddev->resync_max_sectors) {
|
|
|
+ bitmap_end_sync(bitmap, s, &blocks, 0);
|
|
|
+ s += blocks;
|
|
|
}
|
|
|
+ bitmap->last_end_sync = jiffies;
|
|
|
}
|
|
|
|
|
|
static void bitmap_set_memory_bits(struct bitmap *bitmap, sector_t offset, int needed)
|
|
@@ -1565,3 +1589,4 @@ EXPORT_SYMBOL(bitmap_start_sync);
|
|
|
EXPORT_SYMBOL(bitmap_end_sync);
|
|
|
EXPORT_SYMBOL(bitmap_unplug);
|
|
|
EXPORT_SYMBOL(bitmap_close_sync);
|
|
|
+EXPORT_SYMBOL(bitmap_cond_end_sync);
|