Commit bebf3d97 authored by Li Nan's avatar Li Nan Committed by Jialin Zhang
Browse files

md: fix unexpected changes of return value in rdev_set_badblocks

hulk inclusion
category: bugfix
bugzilla: 188569, https://gitee.com/openeuler/kernel/issues/I6XBZQ


CVE: NA

--------------------------------

If we set any badblocks fail, we will remove this rdev(set it to Faulty
or set recovery_disabled). Previous patch "md/raid10: fix io hung in
md_wait_for_blocked_rdev()" check badblocks->changed instead of return
value in rdev_set_badblocks(), but return value of this func also changed
accordingly, which is not what we expected.

Keep the return value consistent with before.

Signed-off-by: default avatarLi Nan <linan122@huawei.com>
Reviewed-by: default avatarYu Kuai <yukuai3@huawei.com>
Reviewed-by: default avatarHou Tao <houtao1@huawei.com>
parent c23e1cd1
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -9577,12 +9577,13 @@ int rdev_set_badblocks(struct md_rdev *rdev, sector_t s, int sectors,
		       int is_new)
{
	struct mddev *mddev = rdev->mddev;
	int rv;

	if (is_new)
		s += rdev->new_data_offset;
	else
		s += rdev->data_offset;
	badblocks_set(&rdev->badblocks, s, sectors, 0);
	rv = badblocks_set(&rdev->badblocks, s, sectors, 0);
	if (rdev->badblocks.changed) {
		/* Make sure they get written out promptly */
		if (test_bit(ExternalBbl, &rdev->flags))
@@ -9591,9 +9592,8 @@ int rdev_set_badblocks(struct md_rdev *rdev, sector_t s, int sectors,
		set_mask_bits(&mddev->sb_flags, 0,
			      BIT(MD_SB_CHANGE_CLEAN) | BIT(MD_SB_CHANGE_PENDING));
		md_wakeup_thread(rdev->mddev->thread);
		return 1;
	} else
		return 0;
	}
	return !rv;
}
EXPORT_SYMBOL_GPL(rdev_set_badblocks);