Commit 31391000 authored by Jens Axboe's avatar Jens Axboe
Browse files

Merge tag 'md-6.15-20250416' of...

Merge tag 'md-6.15-20250416' of https://git.kernel.org/pub/scm/linux/kernel/git/mdraid/linux into block-6.15

Pull MD fixes from Yu:

"- fix raid10 missing discard IO accounting (Yu Kuai)
 - fix bitmap stats for bitmap file (Zheng Qixing)
 - fix oops while reading all member disks failed during check/repair
   (Meir Elisha)"

* tag 'md-6.15-20250416' of https://git.kernel.org/pub/scm/linux/kernel/git/mdraid/linux:
  md/raid1: Add check for missing source disk in process_checks()
  md/md-bitmap: fix stats collection for external bitmaps
  md/raid10: fix missing discard IO accounting
parents 81586652 b7c178d9
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -2357,9 +2357,8 @@ static int bitmap_get_stats(void *data, struct md_bitmap_stats *stats)

	if (!bitmap)
		return -ENOENT;
	if (bitmap->mddev->bitmap_info.external)
		return -ENOENT;
	if (!bitmap->storage.sb_page) /* no superblock */
	if (!bitmap->mddev->bitmap_info.external &&
	    !bitmap->storage.sb_page)
		return -EINVAL;
	sb = kmap_local_page(bitmap->storage.sb_page);
	stats->sync_size = le64_to_cpu(sb->sync_size);
+16 −10
Original line number Diff line number Diff line
@@ -2200,14 +2200,9 @@ static int fix_sync_read_error(struct r1bio *r1_bio)
				if (!rdev_set_badblocks(rdev, sect, s, 0))
					abort = 1;
			}
			if (abort) {
				conf->recovery_disabled =
					mddev->recovery_disabled;
				set_bit(MD_RECOVERY_INTR, &mddev->recovery);
				md_done_sync(mddev, r1_bio->sectors, 0);
				put_buf(r1_bio);
			if (abort)
				return 0;
			}

			/* Try next page */
			sectors -= s;
			sect += s;
@@ -2346,10 +2341,21 @@ static void sync_request_write(struct mddev *mddev, struct r1bio *r1_bio)
	int disks = conf->raid_disks * 2;
	struct bio *wbio;

	if (!test_bit(R1BIO_Uptodate, &r1_bio->state))
		/* ouch - failed to read all of that. */
		if (!fix_sync_read_error(r1_bio))
	if (!test_bit(R1BIO_Uptodate, &r1_bio->state)) {
		/*
		 * ouch - failed to read all of that.
		 * No need to fix read error for check/repair
		 * because all member disks are read.
		 */
		if (test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery) ||
		    !fix_sync_read_error(r1_bio)) {
			conf->recovery_disabled = mddev->recovery_disabled;
			set_bit(MD_RECOVERY_INTR, &mddev->recovery);
			md_done_sync(mddev, r1_bio->sectors, 0);
			put_buf(r1_bio);
			return;
		}
	}

	if (test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery))
		process_checks(r1_bio);
+1 −0
Original line number Diff line number Diff line
@@ -1735,6 +1735,7 @@ static int raid10_handle_discard(struct mddev *mddev, struct bio *bio)
	 * The discard bio returns only first r10bio finishes
	 */
	if (first_copy) {
		md_account_bio(mddev, &bio);
		r10_bio->master_bio = bio;
		set_bit(R10BIO_Discard, &r10_bio->state);
		first_copy = false;