hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/md/md.c
....@@ -555,13 +555,14 @@
555555 struct md_rdev *rdev = bio->bi_private;
556556 struct mddev *mddev = rdev->mddev;
557557
558
+ bio_put(bio);
559
+
558560 rdev_dec_pending(rdev, mddev);
559561
560562 if (atomic_dec_and_test(&mddev->flush_pending)) {
561563 /* The pre-request flush has finished */
562564 queue_work(md_wq, &mddev->flush_work);
563565 }
564
- bio_put(bio);
565566 }
566567
567568 static void md_submit_flush_data(struct work_struct *ws);
....@@ -966,10 +967,12 @@
966967 } else
967968 clear_bit(LastDev, &rdev->flags);
968969
970
+ bio_put(bio);
971
+
972
+ rdev_dec_pending(rdev, mddev);
973
+
969974 if (atomic_dec_and_test(&mddev->pending_writes))
970975 wake_up(&mddev->sb_wait);
971
- rdev_dec_pending(rdev, mddev);
972
- bio_put(bio);
973976 }
974977
975978 void md_super_write(struct mddev *mddev, struct md_rdev *rdev,
....@@ -3204,6 +3207,9 @@
32043207 err = kstrtouint(buf, 10, (unsigned int *)&slot);
32053208 if (err < 0)
32063209 return err;
3210
+ if (slot < 0)
3211
+ /* overflow */
3212
+ return -ENOSPC;
32073213 }
32083214 if (rdev->mddev->pers && slot == -1) {
32093215 /* Setting 'slot' on an active array requires also
....@@ -3884,8 +3890,9 @@
38843890 static ssize_t
38853891 safe_delay_show(struct mddev *mddev, char *page)
38863892 {
3887
- int msec = (mddev->safemode_delay*1000)/HZ;
3888
- return sprintf(page, "%d.%03d\n", msec/1000, msec%1000);
3893
+ unsigned int msec = ((unsigned long)mddev->safemode_delay*1000)/HZ;
3894
+
3895
+ return sprintf(page, "%u.%03u\n", msec/1000, msec%1000);
38893896 }
38903897 static ssize_t
38913898 safe_delay_store(struct mddev *mddev, const char *cbuf, size_t len)
....@@ -3897,7 +3904,7 @@
38973904 return -EINVAL;
38983905 }
38993906
3900
- if (strict_strtoul_scaled(cbuf, &msec, 3) < 0)
3907
+ if (strict_strtoul_scaled(cbuf, &msec, 3) < 0 || msec > UINT_MAX / HZ)
39013908 return -EINVAL;
39023909 if (msec == 0)
39033910 mddev->safemode_delay = 0;
....@@ -4567,6 +4574,8 @@
45674574 rv = kstrtouint(buf, 10, &n);
45684575 if (rv < 0)
45694576 return rv;
4577
+ if (n > INT_MAX)
4578
+ return -EINVAL;
45704579 atomic_set(&mddev->max_corr_read_errors, n);
45714580 return len;
45724581 }
....@@ -4881,11 +4890,21 @@
48814890 return -EINVAL;
48824891 err = mddev_lock(mddev);
48834892 if (!err) {
4884
- if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery))
4893
+ if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) {
48854894 err = -EBUSY;
4886
- else {
4895
+ } else if (mddev->reshape_position == MaxSector ||
4896
+ mddev->pers->check_reshape == NULL ||
4897
+ mddev->pers->check_reshape(mddev)) {
48874898 clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
48884899 err = mddev->pers->start_reshape(mddev);
4900
+ } else {
4901
+ /*
4902
+ * If reshape is still in progress, and
4903
+ * md_check_recovery() can continue to reshape,
4904
+ * don't restart reshape because data can be
4905
+ * corrupted for raid456.
4906
+ */
4907
+ clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
48894908 }
48904909 mddev_unlock(mddev);
48914910 }
....@@ -5680,6 +5699,7 @@
56805699 * completely removed (mddev_delayed_delete).
56815700 */
56825701 flush_workqueue(md_misc_wq);
5702
+ flush_workqueue(md_rdev_misc_wq);
56835703
56845704 mutex_lock(&disks_mutex);
56855705 error = -EEXIST;
....@@ -6296,6 +6316,8 @@
62966316
62976317 void md_stop(struct mddev *mddev)
62986318 {
6319
+ lockdep_assert_held(&mddev->reconfig_mutex);
6320
+
62996321 /* stop the array and free an attached data structures.
63006322 * This is called from dm-raid
63016323 */