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

Commit 69306fe1 authored by Jens Axboe's avatar Jens Axboe
Browse files

Merge branch 'md-fixes' of https://github.com/liu-song-6/linux into for-linus

Pull MD fix from Song

* 'md-fixes' of https://github.com/liu-song-6/linux:
  md/raid1: don't clear bitmap bits on interrupted recovery.
parents 96d7cb93 dfcc34c9
Loading
Loading
Loading
Loading
+18 −10
Original line number Original line Diff line number Diff line
@@ -1863,6 +1863,20 @@ static void end_sync_read(struct bio *bio)
		reschedule_retry(r1_bio);
		reschedule_retry(r1_bio);
}
}


static void abort_sync_write(struct mddev *mddev, struct r1bio *r1_bio)
{
	sector_t sync_blocks = 0;
	sector_t s = r1_bio->sector;
	long sectors_to_go = r1_bio->sectors;

	/* make sure these bits don't get cleared. */
	do {
		md_bitmap_end_sync(mddev->bitmap, s, &sync_blocks, 1);
		s += sync_blocks;
		sectors_to_go -= sync_blocks;
	} while (sectors_to_go > 0);
}

static void end_sync_write(struct bio *bio)
static void end_sync_write(struct bio *bio)
{
{
	int uptodate = !bio->bi_status;
	int uptodate = !bio->bi_status;
@@ -1874,15 +1888,7 @@ static void end_sync_write(struct bio *bio)
	struct md_rdev *rdev = conf->mirrors[find_bio_disk(r1_bio, bio)].rdev;
	struct md_rdev *rdev = conf->mirrors[find_bio_disk(r1_bio, bio)].rdev;


	if (!uptodate) {
	if (!uptodate) {
		sector_t sync_blocks = 0;
		abort_sync_write(mddev, r1_bio);
		sector_t s = r1_bio->sector;
		long sectors_to_go = r1_bio->sectors;
		/* make sure these bits doesn't get cleared. */
		do {
			md_bitmap_end_sync(mddev->bitmap, s, &sync_blocks, 1);
			s += sync_blocks;
			sectors_to_go -= sync_blocks;
		} while (sectors_to_go > 0);
		set_bit(WriteErrorSeen, &rdev->flags);
		set_bit(WriteErrorSeen, &rdev->flags);
		if (!test_and_set_bit(WantReplacement, &rdev->flags))
		if (!test_and_set_bit(WantReplacement, &rdev->flags))
			set_bit(MD_RECOVERY_NEEDED, &
			set_bit(MD_RECOVERY_NEEDED, &
@@ -2172,8 +2178,10 @@ static void sync_request_write(struct mddev *mddev, struct r1bio *r1_bio)
		     (i == r1_bio->read_disk ||
		     (i == r1_bio->read_disk ||
		      !test_bit(MD_RECOVERY_SYNC, &mddev->recovery))))
		      !test_bit(MD_RECOVERY_SYNC, &mddev->recovery))))
			continue;
			continue;
		if (test_bit(Faulty, &conf->mirrors[i].rdev->flags))
		if (test_bit(Faulty, &conf->mirrors[i].rdev->flags)) {
			abort_sync_write(mddev, r1_bio);
			continue;
			continue;
		}


		bio_set_op_attrs(wbio, REQ_OP_WRITE, 0);
		bio_set_op_attrs(wbio, REQ_OP_WRITE, 0);
		if (test_bit(FailFast, &conf->mirrors[i].rdev->flags))
		if (test_bit(FailFast, &conf->mirrors[i].rdev->flags))