mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-01-11 17:10:13 +00:00
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
This commit is contained in:
commit
c1536df942
@ -2788,6 +2788,7 @@ void md_update_sb(struct mddev *mddev, int force_change)
|
|||||||
if (!md_is_rdwr(mddev)) {
|
if (!md_is_rdwr(mddev)) {
|
||||||
if (force_change)
|
if (force_change)
|
||||||
set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags);
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -10407,7 +10408,6 @@ static int md_notify_reboot(struct notifier_block *this,
|
|||||||
unsigned long code, void *x)
|
unsigned long code, void *x)
|
||||||
{
|
{
|
||||||
struct mddev *mddev;
|
struct mddev *mddev;
|
||||||
int need_delay = 0;
|
|
||||||
|
|
||||||
spin_lock(&all_mddevs_lock);
|
spin_lock(&all_mddevs_lock);
|
||||||
list_for_each_entry(mddev, &all_mddevs, all_mddevs) {
|
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->safemode = 2;
|
||||||
mddev_unlock(mddev);
|
mddev_unlock(mddev);
|
||||||
}
|
}
|
||||||
need_delay = 1;
|
|
||||||
spin_lock(&all_mddevs_lock);
|
spin_lock(&all_mddevs_lock);
|
||||||
mddev_put_locked(mddev);
|
mddev_put_locked(mddev);
|
||||||
}
|
}
|
||||||
spin_unlock(&all_mddevs_lock);
|
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;
|
return NOTIFY_DONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -68,7 +68,10 @@ static int create_strip_zones(struct mddev *mddev, struct r0conf **private_conf)
|
|||||||
struct strip_zone *zone;
|
struct strip_zone *zone;
|
||||||
int cnt;
|
int cnt;
|
||||||
struct r0conf *conf = kzalloc(sizeof(*conf), GFP_KERNEL);
|
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);
|
*private_conf = ERR_PTR(-ENOMEM);
|
||||||
if (!conf)
|
if (!conf)
|
||||||
@ -84,6 +87,10 @@ static int create_strip_zones(struct mddev *mddev, struct r0conf **private_conf)
|
|||||||
sector_div(sectors, mddev->chunk_sectors);
|
sector_div(sectors, mddev->chunk_sectors);
|
||||||
rdev1->sectors = 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) {
|
rdev_for_each(rdev2, mddev) {
|
||||||
pr_debug("md/raid0:%s: comparing %pg(%llu)"
|
pr_debug("md/raid0:%s: comparing %pg(%llu)"
|
||||||
" with %pg(%llu)\n",
|
" with %pg(%llu)\n",
|
||||||
|
|||||||
@ -4956,7 +4956,8 @@ static void handle_stripe(struct stripe_head *sh)
|
|||||||
goto finish;
|
goto finish;
|
||||||
|
|
||||||
if (s.handle_bad_blocks ||
|
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);
|
set_bit(STRIPE_HANDLE, &sh->state);
|
||||||
goto finish;
|
goto finish;
|
||||||
}
|
}
|
||||||
@ -6768,7 +6769,8 @@ static void raid5d(struct md_thread *thread)
|
|||||||
int batch_size, released;
|
int batch_size, released;
|
||||||
unsigned int offset;
|
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;
|
break;
|
||||||
|
|
||||||
released = release_stripe_list(conf, conf->temp_inactive_list);
|
released = release_stripe_list(conf, conf->temp_inactive_list);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user