diff options
author | Philipp Reisner <philipp.reisner@linbit.com> | 2010-07-22 09:27:27 -0400 |
---|---|---|
committer | Philipp Reisner <philipp.reisner@linbit.com> | 2010-10-14 12:38:14 -0400 |
commit | d207450cf2731c6a2afa8c78fb31c7206cd35eba (patch) | |
tree | 2cd48ba58ebc3dd2c7243f5cf06240e88e960860 /drivers | |
parent | 778f271dfe7a7173c0bae2d6cde8d9bd1533e668 (diff) |
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')
-rw-r--r-- | drivers/block/drbd/drbd_worker.c | 4 |
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, | |||
512 | sector_t sector; | 512 | sector_t sector; |
513 | const sector_t capacity = drbd_get_capacity(mdev->this_bdev); | 513 | const sector_t capacity = drbd_get_capacity(mdev->this_bdev); |
514 | int max_segment_size; | 514 | int max_segment_size; |
515 | int number, i, size, pe, mx; | 515 | int number, i, rollback_i, size, pe, mx; |
516 | int align, queued, sndbuf; | 516 | int align, queued, sndbuf; |
517 | 517 | ||
518 | if (unlikely(cancel)) | 518 | if (unlikely(cancel)) |
@@ -613,6 +613,7 @@ next_sector: | |||
613 | * be prepared for all stripe sizes of software RAIDs. | 613 | * be prepared for all stripe sizes of software RAIDs. |
614 | */ | 614 | */ |
615 | align = 1; | 615 | align = 1; |
616 | rollback_i = i; | ||
616 | for (;;) { | 617 | for (;;) { |
617 | if (size + BM_BLOCK_SIZE > max_segment_size) | 618 | if (size + BM_BLOCK_SIZE > max_segment_size) |
618 | break; | 619 | break; |
@@ -654,6 +655,7 @@ next_sector: | |||
654 | case 2: /* Allocation failed */ | 655 | case 2: /* Allocation failed */ |
655 | drbd_rs_complete_io(mdev, sector); | 656 | drbd_rs_complete_io(mdev, sector); |
656 | mdev->bm_resync_fo = BM_SECT_TO_BIT(sector); | 657 | mdev->bm_resync_fo = BM_SECT_TO_BIT(sector); |
658 | i = rollback_i; | ||
657 | goto requeue; | 659 | goto requeue; |
658 | /* case 1: everything ok */ | 660 | /* case 1: everything ok */ |
659 | } | 661 | } |