Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d207450c authored by Philipp Reisner's avatar Philipp Reisner
Browse files

drbd: Bugfix: rs_in_flight could become wrong if read_for_csum() requested reschedule later

parent 778f271d
Loading
Loading
Loading
Loading
+3 −1
Original line number Original line Diff line number Diff line
@@ -512,7 +512,7 @@ int w_make_resync_request(struct drbd_conf *mdev,
	sector_t sector;
	sector_t sector;
	const sector_t capacity = drbd_get_capacity(mdev->this_bdev);
	const sector_t capacity = drbd_get_capacity(mdev->this_bdev);
	int max_segment_size;
	int max_segment_size;
	int number, i, size, pe, mx;
	int number, i, rollback_i, size, pe, mx;
	int align, queued, sndbuf;
	int align, queued, sndbuf;


	if (unlikely(cancel))
	if (unlikely(cancel))
@@ -613,6 +613,7 @@ int w_make_resync_request(struct drbd_conf *mdev,
		 * be prepared for all stripe sizes of software RAIDs.
		 * be prepared for all stripe sizes of software RAIDs.
		 */
		 */
		align = 1;
		align = 1;
		rollback_i = i;
		for (;;) {
		for (;;) {
			if (size + BM_BLOCK_SIZE > max_segment_size)
			if (size + BM_BLOCK_SIZE > max_segment_size)
				break;
				break;
@@ -654,6 +655,7 @@ int w_make_resync_request(struct drbd_conf *mdev,
			case 2: /* Allocation failed */
			case 2: /* Allocation failed */
				drbd_rs_complete_io(mdev, sector);
				drbd_rs_complete_io(mdev, sector);
				mdev->bm_resync_fo = BM_SECT_TO_BIT(sector);
				mdev->bm_resync_fo = BM_SECT_TO_BIT(sector);
				i = rollback_i;
				goto requeue;
				goto requeue;
			/* case 1: everything ok */
			/* case 1: everything ok */
			}
			}