]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
md/raid5: merge reshape_progress checking inside get_reshape_loc()
authorYu Kuai <yukuai3@huawei.com>
Thu, 27 Feb 2025 12:04:52 +0000 (20:04 +0800)
committerYu Kuai <yukuai@kernel.org>
Tue, 4 Mar 2025 16:31:27 +0000 (00:31 +0800)
During code review, it's found that other than raid5_bitmap_sector(),
reshape_progress is always checked before get_reshape_loc(), while
raid5_bitmap_sector() should check as well to prevent holding the
lock 'conf->device_lock'. Hence merge that checking inside
get_reshape_loc().

Link: https://lore.kernel.org/linux-raid/20250227120452.808503-1-yukuai1@huaweicloud.com
Signed-off-by: Yu Kuai <yukuai3@huawei.com>
drivers/md/raid5.c

index d73a775b16c52fcf14b6e9fb1c71f5e964aa3cfc..6389383166c0793967f0008eb759a3c5dd48a309 100644 (file)
@@ -5858,6 +5858,9 @@ static enum reshape_loc get_reshape_loc(struct mddev *mddev,
                struct r5conf *conf, sector_t logical_sector)
 {
        sector_t reshape_progress, reshape_safe;
+
+       if (likely(conf->reshape_progress == MaxSector))
+               return LOC_NO_RESHAPE;
        /*
         * Spinlock is needed as reshape_progress may be
         * 64bit on a 32bit platform, and so it might be
@@ -5935,22 +5938,19 @@ static enum stripe_result make_stripe_request(struct mddev *mddev,
        const int rw = bio_data_dir(bi);
        enum stripe_result ret;
        struct stripe_head *sh;
+       enum reshape_loc loc;
        sector_t new_sector;
        int previous = 0, flags = 0;
        int seq, dd_idx;
 
        seq = read_seqcount_begin(&conf->gen_lock);
-
-       if (unlikely(conf->reshape_progress != MaxSector)) {
-               enum reshape_loc loc = get_reshape_loc(mddev, conf,
-                                                      logical_sector);
-               if (loc == LOC_INSIDE_RESHAPE) {
-                       ret = STRIPE_SCHEDULE_AND_RETRY;
-                       goto out;
-               }
-               if (loc == LOC_AHEAD_OF_RESHAPE)
-                       previous = 1;
+       loc = get_reshape_loc(mddev, conf, logical_sector);
+       if (loc == LOC_INSIDE_RESHAPE) {
+               ret = STRIPE_SCHEDULE_AND_RETRY;
+               goto out;
        }
+       if (loc == LOC_AHEAD_OF_RESHAPE)
+               previous = 1;
 
        new_sector = raid5_compute_sector(conf, logical_sector, previous,
                                          &dd_idx, NULL);
@@ -6127,7 +6127,6 @@ static bool raid5_make_request(struct mddev *mddev, struct bio * bi)
 
        /* Bail out if conflicts with reshape and REQ_NOWAIT is set */
        if ((bi->bi_opf & REQ_NOWAIT) &&
-           (conf->reshape_progress != MaxSector) &&
            get_reshape_loc(mddev, conf, logical_sector) == LOC_INSIDE_RESHAPE) {
                bio_wouldblock_error(bi);
                if (rw == WRITE)