|
@@ -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 */
|
|
|
}
|