summaryrefslogtreecommitdiffstats
path: root/drivers/block/drbd/drbd_worker.c
diff options
context:
space:
mode:
authorPhilipp Reisner2010-07-22 15:27:27 +0200
committerPhilipp Reisner2010-10-14 18:38:14 +0200
commitd207450cf2731c6a2afa8c78fb31c7206cd35eba (patch)
tree2cd48ba58ebc3dd2c7243f5cf06240e88e960860 /drivers/block/drbd/drbd_worker.c
parentdrbd: The new, smarter resync speed controller (diff)
downloadkernel-qcow2-linux-d207450cf2731c6a2afa8c78fb31c7206cd35eba.tar.gz
kernel-qcow2-linux-d207450cf2731c6a2afa8c78fb31c7206cd35eba.tar.xz
kernel-qcow2-linux-d207450cf2731c6a2afa8c78fb31c7206cd35eba.zip
drbd: Bugfix: rs_in_flight could become wrong if read_for_csum() requested reschedule later
Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com> Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
Diffstat (limited to 'drivers/block/drbd/drbd_worker.c')
-rw-r--r--drivers/block/drbd/drbd_worker.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/block/drbd/drbd_worker.c b/drivers/block/drbd/drbd_worker.c
index fd3e1e9561cb..30b8e466a224 100644
--- a/drivers/block/drbd/drbd_worker.c
+++ b/drivers/block/drbd/drbd_worker.c
@@ -512,7 +512,7 @@ int w_make_resync_request(struct drbd_conf *mdev,
sector_t sector;
const sector_t capacity = drbd_get_capacity(mdev->this_bdev);
int max_segment_size;
- int number, i, size, pe, mx;
+ int number, i, rollback_i, size, pe, mx;
int align, queued, sndbuf;
if (unlikely(cancel))
@@ -613,6 +613,7 @@ next_sector:
* be prepared for all stripe sizes of software RAIDs.
*/
align = 1;
+ rollback_i = i;
for (;;) {
if (size + BM_BLOCK_SIZE > max_segment_size)
break;
@@ -654,6 +655,7 @@ next_sector:
case 2: /* Allocation failed */
drbd_rs_complete_io(mdev, sector);
mdev->bm_resync_fo = BM_SECT_TO_BIT(sector);
+ i = rollback_i;
goto requeue;
/* case 1: everything ok */
}