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

Merge tag 'md-6.19-20251130' of...

Merge tag 'md-6.19-20251130' of gitolite.kernel.org:pub/scm/linux/kernel/git/mdraid/linux into for-6.19/block

Pull MD changes from Yu:

"- fix null-ptr-dereference regression for dm-raid0 (Yu Kuai)
 - fix IO hang for raid5 when array is broken with IO inflight (Yu Kuai)
 - remove legacy 1s delay to speed up system shutdown (Tarun Sahu)"

* tag 'md-6.19-20251130' of gitolite.kernel.org:pub/scm/linux/kernel/git/mdraid/linux:
  md: remove legacy 1s delay in md_notify_reboot
  md/raid5: fix IO hang when array is broken with IO inflight
  md: warn about updating super block failure
  md/raid0: fix NULL pointer dereference in create_strip_zones() for dm-raid
parents 418de94e fdd0c6a6
Loading
Loading
Loading
Loading
+1 −11
Original line number Diff line number Diff line
@@ -2788,6 +2788,7 @@ void md_update_sb(struct mddev *mddev, int force_change)
	if (!md_is_rdwr(mddev)) {
		if (force_change)
			set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags);
		pr_err("%s: can't update sb for read-only array %s\n", __func__, mdname(mddev));
		return;
	}

@@ -10407,7 +10408,6 @@ static int md_notify_reboot(struct notifier_block *this,
			    unsigned long code, void *x)
{
	struct mddev *mddev;
	int need_delay = 0;

	spin_lock(&all_mddevs_lock);
	list_for_each_entry(mddev, &all_mddevs, all_mddevs) {
@@ -10421,21 +10421,11 @@ static int md_notify_reboot(struct notifier_block *this,
				mddev->safemode = 2;
			mddev_unlock(mddev);
		}
		need_delay = 1;
		spin_lock(&all_mddevs_lock);
		mddev_put_locked(mddev);
	}
	spin_unlock(&all_mddevs_lock);

	/*
	 * certain more exotic SCSI devices are known to be
	 * volatile wrt too early system reboots. While the
	 * right place to handle this issue is the given
	 * driver, we do want to have a safe RAID driver ...
	 */
	if (need_delay)
		msleep(1000);

	return NOTIFY_DONE;
}

+8 −1
Original line number Diff line number Diff line
@@ -68,7 +68,10 @@ static int create_strip_zones(struct mddev *mddev, struct r0conf **private_conf)
	struct strip_zone *zone;
	int cnt;
	struct r0conf *conf = kzalloc(sizeof(*conf), GFP_KERNEL);
	unsigned int blksize = queue_logical_block_size(mddev->gendisk->queue);
	unsigned int blksize = 512;

	if (!mddev_is_dm(mddev))
		blksize = queue_logical_block_size(mddev->gendisk->queue);

	*private_conf = ERR_PTR(-ENOMEM);
	if (!conf)
@@ -84,6 +87,10 @@ static int create_strip_zones(struct mddev *mddev, struct r0conf **private_conf)
		sector_div(sectors, mddev->chunk_sectors);
		rdev1->sectors = sectors * mddev->chunk_sectors;

		if (mddev_is_dm(mddev))
			blksize = max(blksize, queue_logical_block_size(
				      rdev1->bdev->bd_disk->queue));

		rdev_for_each(rdev2, mddev) {
			pr_debug("md/raid0:%s:   comparing %pg(%llu)"
				 " with %pg(%llu)\n",
+4 −2
Original line number Diff line number Diff line
@@ -4956,7 +4956,8 @@ static void handle_stripe(struct stripe_head *sh)
		goto finish;

	if (s.handle_bad_blocks ||
	    test_bit(MD_SB_CHANGE_PENDING, &conf->mddev->sb_flags)) {
	    (md_is_rdwr(conf->mddev) &&
	     test_bit(MD_SB_CHANGE_PENDING, &conf->mddev->sb_flags))) {
		set_bit(STRIPE_HANDLE, &sh->state);
		goto finish;
	}
@@ -6768,7 +6769,8 @@ static void raid5d(struct md_thread *thread)
		int batch_size, released;
		unsigned int offset;

		if (test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags))
		if (md_is_rdwr(mddev) &&
		    test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags))
			break;

		released = release_stripe_list(conf, conf->temp_inactive_list);