]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
md: factor error handling out of md_done_sync into helper
authorLi Nan <linan122@huawei.com>
Mon, 5 Jan 2026 11:02:50 +0000 (19:02 +0800)
committerYu Kuai <yukuai@fnnas.com>
Mon, 26 Jan 2026 05:16:07 +0000 (13:16 +0800)
The 'ok' parameter in md_done_sync() is redundant for most callers that
always pass 'true'. Factor error handling logic into a separate helper
function md_sync_error() to eliminate unnecessary parameter passing and
improve code clarity.

No functional changes introduced.

Link: https://lore.kernel.org/linux-raid/20260105110300.1442509-3-linan666@huaweicloud.com
Signed-off-by: Li Nan <linan122@huawei.com>
Reviewed-by: Yu Kuai <yukuai3@huawei.com>
Signed-off-by: Yu Kuai <yukuai@fnnas.com>
drivers/md/md.c
drivers/md/md.h
drivers/md/raid1.c
drivers/md/raid10.c
drivers/md/raid5.c

index 43791d72c0c3742cd6511e1ba0673deab968667f..97b023536afc65c92976e658ed8dc55e8571f3e9 100644 (file)
@@ -9074,20 +9074,23 @@ static bool is_mddev_idle(struct mddev *mddev, int init)
        return idle;
 }
 
-void md_done_sync(struct mddev *mddev, int blocks, int ok)
+void md_done_sync(struct mddev *mddev, int blocks)
 {
        /* another "blocks" (512byte) blocks have been synced */
        atomic_sub(blocks, &mddev->recovery_active);
        wake_up(&mddev->recovery_wait);
-       if (!ok) {
-               set_bit(MD_RECOVERY_INTR, &mddev->recovery);
-               set_bit(MD_RECOVERY_ERROR, &mddev->recovery);
-               md_wakeup_thread(mddev->thread);
-               // stop recovery, signal do_sync ....
-       }
 }
 EXPORT_SYMBOL(md_done_sync);
 
+void md_sync_error(struct mddev *mddev)
+{
+       // stop recovery, signal do_sync ....
+       set_bit(MD_RECOVERY_INTR, &mddev->recovery);
+       set_bit(MD_RECOVERY_ERROR, &mddev->recovery);
+       md_wakeup_thread(mddev->thread);
+}
+EXPORT_SYMBOL(md_sync_error);
+
 /* md_write_start(mddev, bi)
  * If we need to update some array metadata (e.g. 'active' flag
  * in superblock) before writing, schedule a superblock update
index b8c5dec12b62f0b9b969e033aa6142b398c036dc..4c3dc7a6e399d5a88d918332f070ef98c6190e04 100644 (file)
@@ -918,7 +918,8 @@ extern const char *md_sync_action_name(enum sync_action action);
 extern void md_write_start(struct mddev *mddev, struct bio *bi);
 extern void md_write_inc(struct mddev *mddev, struct bio *bi);
 extern void md_write_end(struct mddev *mddev);
-extern void md_done_sync(struct mddev *mddev, int blocks, int ok);
+extern void md_done_sync(struct mddev *mddev, int blocks);
+extern void md_sync_error(struct mddev *mddev);
 extern void md_error(struct mddev *mddev, struct md_rdev *rdev);
 extern void md_finish_reshape(struct mddev *mddev);
 void md_submit_discard_bio(struct mddev *mddev, struct md_rdev *rdev,
index 3670abf468412fb6f5764855fda8b7e8aabfc99e..0c9332d557a5a8407f46fc02f7dd1f2191371bbf 100644 (file)
@@ -2062,7 +2062,7 @@ static void abort_sync_write(struct mddev *mddev, struct r1bio *r1_bio)
        } while (sectors_to_go > 0);
 }
 
-static void put_sync_write_buf(struct r1bio *r1_bio, int uptodate)
+static void put_sync_write_buf(struct r1bio *r1_bio)
 {
        if (atomic_dec_and_test(&r1_bio->remaining)) {
                struct mddev *mddev = r1_bio->mddev;
@@ -2073,7 +2073,7 @@ static void put_sync_write_buf(struct r1bio *r1_bio, int uptodate)
                        reschedule_retry(r1_bio);
                else {
                        put_buf(r1_bio);
-                       md_done_sync(mddev, s, uptodate);
+                       md_done_sync(mddev, s);
                }
        }
 }
@@ -2098,7 +2098,7 @@ static void end_sync_write(struct bio *bio)
                set_bit(R1BIO_MadeGood, &r1_bio->state);
        }
 
-       put_sync_write_buf(r1_bio, 1);
+       put_sync_write_buf(r1_bio);
 }
 
 static int r1_sync_page_io(struct md_rdev *rdev, sector_t sector,
@@ -2348,8 +2348,8 @@ static void sync_request_write(struct mddev *mddev, struct r1bio *r1_bio)
                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);
+                       md_done_sync(mddev, r1_bio->sectors);
+                       md_sync_error(mddev);
                        put_buf(r1_bio);
                        return;
                }
@@ -2384,7 +2384,7 @@ static void sync_request_write(struct mddev *mddev, struct r1bio *r1_bio)
                submit_bio_noacct(wbio);
        }
 
-       put_sync_write_buf(r1_bio, 1);
+       put_sync_write_buf(r1_bio);
 }
 
 /*
@@ -2575,7 +2575,7 @@ static void handle_sync_write_finished(struct r1conf *conf, struct r1bio *r1_bio
                }
        }
        put_buf(r1_bio);
-       md_done_sync(conf->mddev, s, 1);
+       md_done_sync(conf->mddev, s);
 }
 
 static void handle_write_finished(struct r1conf *conf, struct r1bio *r1_bio)
index 09328e032f14a4b612992607575a39f297f4c87c..5450dda8aa342753e91f31ff90afe6e41b6ae4d4 100644 (file)
@@ -2276,7 +2276,7 @@ static void end_sync_request(struct r10bio *r10_bio)
                                reschedule_retry(r10_bio);
                        else
                                put_buf(r10_bio);
-                       md_done_sync(mddev, s, 1);
+                       md_done_sync(mddev, s);
                        break;
                } else {
                        struct r10bio *r10_bio2 = (struct r10bio *)r10_bio->master_bio;
@@ -2452,7 +2452,7 @@ static void sync_request_write(struct mddev *mddev, struct r10bio *r10_bio)
 
 done:
        if (atomic_dec_and_test(&r10_bio->remaining)) {
-               md_done_sync(mddev, r10_bio->sectors, 1);
+               md_done_sync(mddev, r10_bio->sectors);
                put_buf(r10_bio);
        }
 }
@@ -3757,7 +3757,7 @@ static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr,
                /* pretend they weren't skipped, it makes
                 * no important difference in this case
                 */
-               md_done_sync(mddev, sectors_skipped, 1);
+               md_done_sync(mddev, sectors_skipped);
 
        return sectors_skipped + nr_sectors;
  giveup:
@@ -4913,7 +4913,8 @@ static void reshape_request_write(struct mddev *mddev, struct r10bio *r10_bio)
        if (!test_bit(R10BIO_Uptodate, &r10_bio->state))
                if (handle_reshape_read_error(mddev, r10_bio) < 0) {
                        /* Reshape has been aborted */
-                       md_done_sync(mddev, r10_bio->sectors, 0);
+                       md_done_sync(mddev, r10_bio->sectors);
+                       md_sync_error(mddev);
                        return;
                }
 
@@ -5071,7 +5072,7 @@ static void end_reshape_request(struct r10bio *r10_bio)
 {
        if (!atomic_dec_and_test(&r10_bio->remaining))
                return;
-       md_done_sync(r10_bio->mddev, r10_bio->sectors, 1);
+       md_done_sync(r10_bio->mddev, r10_bio->sectors);
        bio_put(r10_bio->master_bio);
        put_buf(r10_bio);
 }
index 84626ad71ffb8237929a95c3d4a7e0311c476bc6..bba3cab2cc16f1a4d7305732c00cf2697d788a15 100644 (file)
@@ -3727,11 +3727,13 @@ handle_failed_sync(struct r5conf *conf, struct stripe_head *sh,
                                                   RAID5_STRIPE_SECTORS(conf), 0))
                                abort = 1;
                }
-               if (abort)
-                       conf->recovery_disabled =
-                               conf->mddev->recovery_disabled;
        }
-       md_done_sync(conf->mddev, RAID5_STRIPE_SECTORS(conf), !abort);
+       md_done_sync(conf->mddev, RAID5_STRIPE_SECTORS(conf));
+
+       if (abort) {
+               conf->recovery_disabled = conf->mddev->recovery_disabled;
+               md_sync_error(conf->mddev);
+       }
 }
 
 static int want_replace(struct stripe_head *sh, int disk_idx)
@@ -5161,7 +5163,7 @@ static void handle_stripe(struct stripe_head *sh)
        if ((s.syncing || s.replacing) && s.locked == 0 &&
            !test_bit(STRIPE_COMPUTE_RUN, &sh->state) &&
            test_bit(STRIPE_INSYNC, &sh->state)) {
-               md_done_sync(conf->mddev, RAID5_STRIPE_SECTORS(conf), 1);
+               md_done_sync(conf->mddev, RAID5_STRIPE_SECTORS(conf));
                clear_bit(STRIPE_SYNCING, &sh->state);
                if (test_and_clear_bit(R5_Overlap, &sh->dev[sh->pd_idx].flags))
                        wake_up_bit(&sh->dev[sh->pd_idx].flags, R5_Overlap);
@@ -5228,7 +5230,7 @@ static void handle_stripe(struct stripe_head *sh)
                clear_bit(STRIPE_EXPAND_READY, &sh->state);
                atomic_dec(&conf->reshape_stripes);
                wake_up(&conf->wait_for_reshape);
-               md_done_sync(conf->mddev, RAID5_STRIPE_SECTORS(conf), 1);
+               md_done_sync(conf->mddev, RAID5_STRIPE_SECTORS(conf));
        }
 
        if (s.expanding && s.locked == 0 &&