Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drbd: fix resync throttling initialization

If for some reason DRBD resync was the only activity on a backend
device, drbd_rs_c_min_rate_throttle() would mistakenly decide that it is
still initialization time, and keep throttling the resync.

This patch explicitly initializes ->rs_last_events to the current
backend event counters, and drops the rs_last_events == 0 from the
throttle condition.

Reported-by: Mikhail Sugakov <msugakov@amazon.de>

Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
Signed-off-by: Jens Axboe <axboe@fb.com>

authored by

Lars Ellenberg and committed by
Jens Axboe
ff8bd88b a8821531

+5 -3
+1 -1
drivers/block/drbd/drbd_receiver.c
··· 2482 2482 atomic_read(&device->rs_sect_ev); 2483 2483 2484 2484 if (atomic_read(&device->ap_actlog_cnt) 2485 - || !device->rs_last_events || curr_events - device->rs_last_events > 64) { 2485 + || curr_events - device->rs_last_events > 64) { 2486 2486 unsigned long rs_left; 2487 2487 int i; 2488 2488
-1
drivers/block/drbd/drbd_state.c
··· 1099 1099 1100 1100 set_ov_position(device, ns.conn); 1101 1101 device->rs_start = now; 1102 - device->rs_last_events = 0; 1103 1102 device->rs_last_sect_ev = 0; 1104 1103 device->ov_last_oos_size = 0; 1105 1104 device->ov_last_oos_start = 0;
+4 -1
drivers/block/drbd/drbd_worker.c
··· 1592 1592 1593 1593 void drbd_rs_controller_reset(struct drbd_device *device) 1594 1594 { 1595 + struct gendisk *disk = device->ldev->backing_bdev->bd_contains->bd_disk; 1595 1596 struct fifo_buffer *plan; 1596 1597 1597 1598 atomic_set(&device->rs_sect_in, 0); 1598 1599 atomic_set(&device->rs_sect_ev, 0); 1599 1600 device->rs_in_flight = 0; 1601 + device->rs_last_events = 1602 + (int)part_stat_read(&disk->part0, sectors[0]) + 1603 + (int)part_stat_read(&disk->part0, sectors[1]); 1600 1604 1601 1605 /* Updating the RCU protected object in place is necessary since 1602 1606 this function gets called from atomic context. ··· 1747 1743 device->rs_failed = 0; 1748 1744 device->rs_paused = 0; 1749 1745 device->rs_same_csum = 0; 1750 - device->rs_last_events = 0; 1751 1746 device->rs_last_sect_ev = 0; 1752 1747 device->rs_total = tw; 1753 1748 device->rs_start = now;