drbd: Bugfix: rs_in_flight could become wrong if read_for_csum() requested reschedule...
authorPhilipp Reisner <philipp.reisner@linbit.com>
Thu, 22 Jul 2010 13:27:27 +0000 (15:27 +0200)
committerPhilipp Reisner <philipp.reisner@linbit.com>
Thu, 14 Oct 2010 16:38:14 +0000 (18:38 +0200)
Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
drivers/block/drbd/drbd_worker.c

index fd3e1e9561cb57fcd014921a1086bf635ef29345..30b8e466a22441767c0ee0c85331fa675206a5e7 100644 (file)
@@ -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 */
                        }