Skip to content

Commit 5ada954

Browse files
author
CKI KWF Bot
committed
Merge: RHEL9.8 MDRAID - Update to the latest upstream
MR: https://gitlab.com/redhat/centos-stream/src/kernel/centos-stream-9/-/merge_requests/7517 JIRA: https://issues.redhat.com/browse/RHEL-94433 JIRA: https://issues.redhat.com/browse/RHEL-20191 JIRA: https://issues.redhat.com/browse/RHEL-9656 BREW: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=69287758 CVE: CVE-2025-38445 CVE: CVE-2025-38444 CVE: CVE-2025-38451 CVE: CVE-2025-38621 Upstream Status: Commits are found in Linus's git tree Signed-off-by: Nigel Croxon <ncroxon@redhat.com> Approved-by: Heinz Mauelshagen <heinzm@redhat.com> Approved-by: Xiao Ni <xni@redhat.com> Approved-by: CKI KWF Bot <cki-ci-bot+kwf-gitlab-com@redhat.com> Merged-by: CKI GitLab Kmaint Pipeline Bot <26919896-cki-kmaint-pipeline-bot@users.noreply.gitlab.com>
2 parents 5af2628 + d2f7c42 commit 5ada954

File tree

14 files changed

+367
-273
lines changed

14 files changed

+367
-273
lines changed

drivers/md/dm-raid.c

Lines changed: 22 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -439,7 +439,7 @@ static bool rs_is_reshapable(struct raid_set *rs)
439439
/* Return true, if raid set in @rs is recovering */
440440
static bool rs_is_recovering(struct raid_set *rs)
441441
{
442-
return rs->md.recovery_cp < rs->md.dev_sectors;
442+
return rs->md.resync_offset < rs->md.dev_sectors;
443443
}
444444

445445
/* Return true, if raid set in @rs is reshaping */
@@ -769,7 +769,7 @@ static struct raid_set *raid_set_alloc(struct dm_target *ti, struct raid_type *r
769769
rs->md.layout = raid_type->algorithm;
770770
rs->md.new_layout = rs->md.layout;
771771
rs->md.delta_disks = 0;
772-
rs->md.recovery_cp = MaxSector;
772+
rs->md.resync_offset = MaxSector;
773773

774774
for (i = 0; i < raid_devs; i++)
775775
md_rdev_init(&rs->dev[i].rdev);
@@ -913,7 +913,7 @@ static int parse_dev_params(struct raid_set *rs, struct dm_arg_set *as)
913913
rs->md.external = 0;
914914
rs->md.persistent = 1;
915915
rs->md.major_version = 2;
916-
} else if (rebuild && !rs->md.recovery_cp) {
916+
} else if (rebuild && !rs->md.resync_offset) {
917917
/*
918918
* Without metadata, we will not be able to tell if the array
919919
* is in-sync or not - we must assume it is not. Therefore,
@@ -1356,11 +1356,7 @@ static int parse_raid_params(struct raid_set *rs, struct dm_arg_set *as,
13561356
return -EINVAL;
13571357
}
13581358

1359-
/*
1360-
* In device-mapper, we specify things in sectors, but
1361-
* MD records this value in kB
1362-
*/
1363-
if (value < 0 || value / 2 > COUNTER_MAX) {
1359+
if (value < 0) {
13641360
rs->ti->error = "Max write-behind limit out of range";
13651361
return -EINVAL;
13661362
}
@@ -1700,20 +1696,20 @@ static void rs_setup_recovery(struct raid_set *rs, sector_t dev_sectors)
17001696
{
17011697
/* raid0 does not recover */
17021698
if (rs_is_raid0(rs))
1703-
rs->md.recovery_cp = MaxSector;
1699+
rs->md.resync_offset = MaxSector;
17041700
/*
17051701
* A raid6 set has to be recovered either
17061702
* completely or for the grown part to
17071703
* ensure proper parity and Q-Syndrome
17081704
*/
17091705
else if (rs_is_raid6(rs))
1710-
rs->md.recovery_cp = dev_sectors;
1706+
rs->md.resync_offset = dev_sectors;
17111707
/*
17121708
* Other raid set types may skip recovery
17131709
* depending on the 'nosync' flag.
17141710
*/
17151711
else
1716-
rs->md.recovery_cp = test_bit(__CTR_FLAG_NOSYNC, &rs->ctr_flags)
1712+
rs->md.resync_offset = test_bit(__CTR_FLAG_NOSYNC, &rs->ctr_flags)
17171713
? MaxSector : dev_sectors;
17181714
}
17191715

@@ -2148,7 +2144,7 @@ static void super_sync(struct mddev *mddev, struct md_rdev *rdev)
21482144
sb->events = cpu_to_le64(mddev->events);
21492145

21502146
sb->disk_recovery_offset = cpu_to_le64(rdev->recovery_offset);
2151-
sb->array_resync_offset = cpu_to_le64(mddev->recovery_cp);
2147+
sb->array_resync_offset = cpu_to_le64(mddev->resync_offset);
21522148

21532149
sb->level = cpu_to_le32(mddev->level);
21542150
sb->layout = cpu_to_le32(mddev->layout);
@@ -2339,18 +2335,18 @@ static int super_init_validation(struct raid_set *rs, struct md_rdev *rdev)
23392335
}
23402336

23412337
if (!test_bit(__CTR_FLAG_NOSYNC, &rs->ctr_flags))
2342-
mddev->recovery_cp = le64_to_cpu(sb->array_resync_offset);
2338+
mddev->resync_offset = le64_to_cpu(sb->array_resync_offset);
23432339

23442340
/*
23452341
* During load, we set FirstUse if a new superblock was written.
23462342
* There are two reasons we might not have a superblock:
23472343
* 1) The raid set is brand new - in which case, all of the
23482344
* devices must have their In_sync bit set. Also,
2349-
* recovery_cp must be 0, unless forced.
2345+
* resync_offset must be 0, unless forced.
23502346
* 2) This is a new device being added to an old raid set
23512347
* and the new device needs to be rebuilt - in which
23522348
* case the In_sync bit will /not/ be set and
2353-
* recovery_cp must be MaxSector.
2349+
* resync_offset must be MaxSector.
23542350
* 3) This is/are a new device(s) being added to an old
23552351
* raid set during takeover to a higher raid level
23562352
* to provide capacity for redundancy or during reshape
@@ -2395,8 +2391,8 @@ static int super_init_validation(struct raid_set *rs, struct md_rdev *rdev)
23952391
new_devs > 1 ? "s" : "");
23962392
return -EINVAL;
23972393
} else if (!test_bit(__CTR_FLAG_REBUILD, &rs->ctr_flags) && rs_is_recovering(rs)) {
2398-
DMERR("'rebuild' specified while raid set is not in-sync (recovery_cp=%llu)",
2399-
(unsigned long long) mddev->recovery_cp);
2394+
DMERR("'rebuild' specified while raid set is not in-sync (resync_offset=%llu)",
2395+
(unsigned long long) mddev->resync_offset);
24002396
return -EINVAL;
24012397
} else if (rs_is_reshaping(rs)) {
24022398
DMERR("'rebuild' specified while raid set is being reshaped (reshape_position=%llu)",
@@ -2701,11 +2697,11 @@ static int rs_adjust_data_offsets(struct raid_set *rs)
27012697
}
27022698
out:
27032699
/*
2704-
* Raise recovery_cp in case data_offset != 0 to
2700+
* Raise resync_offset in case data_offset != 0 to
27052701
* avoid false recovery positives in the constructor.
27062702
*/
2707-
if (rs->md.recovery_cp < rs->md.dev_sectors)
2708-
rs->md.recovery_cp += rs->dev[0].rdev.data_offset;
2703+
if (rs->md.resync_offset < rs->md.dev_sectors)
2704+
rs->md.resync_offset += rs->dev[0].rdev.data_offset;
27092705

27102706
/* Adjust data offsets on all rdevs but on any raid4/5/6 journal device */
27112707
rdev_for_each(rdev, &rs->md) {
@@ -2760,15 +2756,15 @@ static int rs_setup_takeover(struct raid_set *rs)
27602756
}
27612757

27622758
clear_bit(MD_ARRAY_FIRST_USE, &mddev->flags);
2763-
mddev->recovery_cp = MaxSector;
2759+
mddev->resync_offset = MaxSector;
27642760

27652761
while (d--) {
27662762
rdev = &rs->dev[d].rdev;
27672763

27682764
if (test_bit(d, (void *) rs->rebuild_disks)) {
27692765
clear_bit(In_sync, &rdev->flags);
27702766
clear_bit(Faulty, &rdev->flags);
2771-
mddev->recovery_cp = rdev->recovery_offset = 0;
2767+
mddev->resync_offset = rdev->recovery_offset = 0;
27722768
/* Bitmap has to be created when we do an "up" takeover */
27732769
set_bit(MD_ARRAY_FIRST_USE, &mddev->flags);
27742770
}
@@ -3226,7 +3222,7 @@ static int raid_ctr(struct dm_target *ti, unsigned int argc, char **argv)
32263222
if (r)
32273223
goto bad;
32283224

3229-
rs_setup_recovery(rs, rs->md.recovery_cp < rs->md.dev_sectors ? rs->md.recovery_cp : rs->md.dev_sectors);
3225+
rs_setup_recovery(rs, rs->md.resync_offset < rs->md.dev_sectors ? rs->md.resync_offset : rs->md.dev_sectors);
32303226
} else {
32313227
/* This is no size change or it is shrinking, update size and record in superblocks */
32323228
r = rs_set_dev_and_array_sectors(rs, rs->ti->len, false);
@@ -3450,7 +3446,7 @@ static sector_t rs_get_progress(struct raid_set *rs, unsigned long recovery,
34503446

34513447
} else {
34523448
if (state == st_idle && !test_bit(MD_RECOVERY_INTR, &recovery))
3453-
r = mddev->recovery_cp;
3449+
r = mddev->resync_offset;
34543450
else
34553451
r = mddev->curr_resync_completed;
34563452

@@ -4078,9 +4074,9 @@ static int raid_preresume(struct dm_target *ti)
40784074
}
40794075

40804076
/* Check for any resize/reshape on @rs and adjust/initiate */
4081-
if (mddev->recovery_cp && mddev->recovery_cp < MaxSector) {
4077+
if (mddev->resync_offset && mddev->resync_offset < MaxSector) {
40824078
set_bit(MD_RECOVERY_REQUESTED, &mddev->recovery);
4083-
mddev->resync_min = mddev->recovery_cp;
4079+
mddev->resync_min = mddev->resync_offset;
40844080
if (test_bit(RT_FLAG_RS_GROW, &rs->runtime_flags))
40854081
mddev->resync_max_sectors = mddev->dev_sectors;
40864082
}

drivers/md/md-bitmap.c

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -105,9 +105,19 @@
105105
*
106106
*/
107107

108+
typedef __u16 bitmap_counter_t;
109+
108110
#define PAGE_BITS (PAGE_SIZE << 3)
109111
#define PAGE_BIT_SHIFT (PAGE_SHIFT + 3)
110112

113+
#define COUNTER_BITS 16
114+
#define COUNTER_BIT_SHIFT 4
115+
#define COUNTER_BYTE_SHIFT (COUNTER_BIT_SHIFT - 3)
116+
117+
#define NEEDED_MASK ((bitmap_counter_t) (1 << (COUNTER_BITS - 1)))
118+
#define RESYNC_MASK ((bitmap_counter_t) (1 << (COUNTER_BITS - 2)))
119+
#define COUNTER_MAX ((bitmap_counter_t) RESYNC_MASK - 1)
120+
111121
#define NEEDED(x) (((bitmap_counter_t) x) & NEEDED_MASK)
112122
#define RESYNC(x) (((bitmap_counter_t) x) & RESYNC_MASK)
113123
#define COUNTER(x) (((bitmap_counter_t) x) & COUNTER_MAX)
@@ -789,7 +799,7 @@ static int md_bitmap_new_disk_sb(struct bitmap *bitmap)
789799
* is a good choice? We choose COUNTER_MAX / 2 arbitrarily.
790800
*/
791801
write_behind = bitmap->mddev->bitmap_info.max_write_behind;
792-
if (write_behind > COUNTER_MAX)
802+
if (write_behind > COUNTER_MAX / 2)
793803
write_behind = COUNTER_MAX / 2;
794804
sb->write_behind = cpu_to_le32(write_behind);
795805
bitmap->mddev->bitmap_info.max_write_behind = write_behind;
@@ -1672,13 +1682,13 @@ __acquires(bitmap->lock)
16721682
&(bitmap->bp[page].map[pageoff]);
16731683
}
16741684

1675-
static int bitmap_startwrite(struct mddev *mddev, sector_t offset,
1676-
unsigned long sectors)
1685+
static void bitmap_start_write(struct mddev *mddev, sector_t offset,
1686+
unsigned long sectors)
16771687
{
16781688
struct bitmap *bitmap = mddev->bitmap;
16791689

16801690
if (!bitmap)
1681-
return 0;
1691+
return;
16821692

16831693
while (sectors) {
16841694
sector_t blocks;
@@ -1688,7 +1698,7 @@ static int bitmap_startwrite(struct mddev *mddev, sector_t offset,
16881698
bmc = md_bitmap_get_counter(&bitmap->counts, offset, &blocks, 1);
16891699
if (!bmc) {
16901700
spin_unlock_irq(&bitmap->counts.lock);
1691-
return 0;
1701+
return;
16921702
}
16931703

16941704
if (unlikely(COUNTER(*bmc) == COUNTER_MAX)) {
@@ -1724,11 +1734,10 @@ static int bitmap_startwrite(struct mddev *mddev, sector_t offset,
17241734
else
17251735
sectors = 0;
17261736
}
1727-
return 0;
17281737
}
17291738

1730-
static void bitmap_endwrite(struct mddev *mddev, sector_t offset,
1731-
unsigned long sectors)
1739+
static void bitmap_end_write(struct mddev *mddev, sector_t offset,
1740+
unsigned long sectors)
17321741
{
17331742
struct bitmap *bitmap = mddev->bitmap;
17341743

@@ -1978,12 +1987,12 @@ static void bitmap_dirty_bits(struct mddev *mddev, unsigned long s,
19781987

19791988
md_bitmap_set_memory_bits(bitmap, sec, 1);
19801989
md_bitmap_file_set_bit(bitmap, sec);
1981-
if (sec < bitmap->mddev->recovery_cp)
1990+
if (sec < bitmap->mddev->resync_offset)
19821991
/* We are asserting that the array is dirty,
1983-
* so move the recovery_cp address back so
1992+
* so move the resync_offset address back so
19841993
* that it is obvious that it is dirty
19851994
*/
1986-
bitmap->mddev->recovery_cp = sec;
1995+
bitmap->mddev->resync_offset = sec;
19871996
}
19881997
}
19891998

@@ -2205,9 +2214,9 @@ static struct bitmap *__bitmap_create(struct mddev *mddev, int slot)
22052214
return ERR_PTR(err);
22062215
}
22072216

2208-
static int bitmap_create(struct mddev *mddev, int slot)
2217+
static int bitmap_create(struct mddev *mddev)
22092218
{
2210-
struct bitmap *bitmap = __bitmap_create(mddev, slot);
2219+
struct bitmap *bitmap = __bitmap_create(mddev, -1);
22112220

22122221
if (IS_ERR(bitmap))
22132222
return PTR_ERR(bitmap);
@@ -2249,7 +2258,7 @@ static int bitmap_load(struct mddev *mddev)
22492258
|| bitmap->events_cleared == mddev->events)
22502259
/* no need to keep dirty bits to optimise a
22512260
* re-add of a missing device */
2252-
start = mddev->recovery_cp;
2261+
start = mddev->resync_offset;
22532262

22542263
mutex_lock(&mddev->bitmap_info.mutex);
22552264
err = md_bitmap_init_from_disk(bitmap, start);
@@ -2357,9 +2366,7 @@ static int bitmap_get_stats(void *data, struct md_bitmap_stats *stats)
23572366

23582367
if (!bitmap)
23592368
return -ENOENT;
2360-
if (bitmap->mddev->bitmap_info.external)
2361-
return -ENOENT;
2362-
if (!bitmap->storage.sb_page) /* no superblock */
2369+
if (!bitmap->storage.sb_page)
23632370
return -EINVAL;
23642371
sb = kmap_local_page(bitmap->storage.sb_page);
23652372
stats->sync_size = le64_to_cpu(sb->sync_size);
@@ -2671,7 +2678,7 @@ location_store(struct mddev *mddev, const char *buf, size_t len)
26712678
}
26722679

26732680
mddev->bitmap_info.offset = offset;
2674-
rv = bitmap_create(mddev, -1);
2681+
rv = bitmap_create(mddev);
26752682
if (rv)
26762683
goto out;
26772684

@@ -3004,8 +3011,8 @@ static struct bitmap_operations bitmap_ops = {
30043011
.end_behind_write = bitmap_end_behind_write,
30053012
.wait_behind_writes = bitmap_wait_behind_writes,
30063013

3007-
.startwrite = bitmap_startwrite,
3008-
.endwrite = bitmap_endwrite,
3014+
.start_write = bitmap_start_write,
3015+
.end_write = bitmap_end_write,
30093016
.start_sync = bitmap_start_sync,
30103017
.end_sync = bitmap_end_sync,
30113018
.cond_end_sync = bitmap_cond_end_sync,

drivers/md/md-bitmap.h

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,6 @@
99

1010
#define BITMAP_MAGIC 0x6d746962
1111

12-
typedef __u16 bitmap_counter_t;
13-
#define COUNTER_BITS 16
14-
#define COUNTER_BIT_SHIFT 4
15-
#define COUNTER_BYTE_SHIFT (COUNTER_BIT_SHIFT - 3)
16-
17-
#define NEEDED_MASK ((bitmap_counter_t) (1 << (COUNTER_BITS - 1)))
18-
#define RESYNC_MASK ((bitmap_counter_t) (1 << (COUNTER_BITS - 2)))
19-
#define COUNTER_MAX ((bitmap_counter_t) RESYNC_MASK - 1)
20-
2112
/* use these for bitmap->flags and bitmap->sb->state bit-fields */
2213
enum bitmap_state {
2314
BITMAP_STALE = 1, /* the bitmap file is out of date or had -EIO */
@@ -72,7 +63,7 @@ struct md_bitmap_stats {
7263

7364
struct bitmap_operations {
7465
bool (*enabled)(struct mddev *mddev);
75-
int (*create)(struct mddev *mddev, int slot);
66+
int (*create)(struct mddev *mddev);
7667
int (*resize)(struct mddev *mddev, sector_t blocks, int chunksize,
7768
bool init);
7869

@@ -89,10 +80,10 @@ struct bitmap_operations {
8980
void (*end_behind_write)(struct mddev *mddev);
9081
void (*wait_behind_writes)(struct mddev *mddev);
9182

92-
int (*startwrite)(struct mddev *mddev, sector_t offset,
83+
void (*start_write)(struct mddev *mddev, sector_t offset,
84+
unsigned long sectors);
85+
void (*end_write)(struct mddev *mddev, sector_t offset,
9386
unsigned long sectors);
94-
void (*endwrite)(struct mddev *mddev, sector_t offset,
95-
unsigned long sectors);
9687
bool (*start_sync)(struct mddev *mddev, sector_t offset,
9788
sector_t *blocks, bool degraded);
9889
void (*end_sync)(struct mddev *mddev, sector_t offset, sector_t *blocks);

drivers/md/md-cluster.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -337,11 +337,11 @@ static void recover_bitmaps(struct md_thread *thread)
337337
md_wakeup_thread(mddev->sync_thread);
338338

339339
if (hi > 0) {
340-
if (lo < mddev->recovery_cp)
341-
mddev->recovery_cp = lo;
340+
if (lo < mddev->resync_offset)
341+
mddev->resync_offset = lo;
342342
/* wake up thread to continue resync in case resync
343343
* is not finished */
344-
if (mddev->recovery_cp != MaxSector) {
344+
if (mddev->resync_offset != MaxSector) {
345345
/*
346346
* clear the REMOTE flag since we will launch
347347
* resync thread in current node.
@@ -863,9 +863,9 @@ static int gather_all_resync_info(struct mddev *mddev, int total_slots)
863863
lockres_free(bm_lockres);
864864
continue;
865865
}
866-
if ((hi > 0) && (lo < mddev->recovery_cp)) {
866+
if ((hi > 0) && (lo < mddev->resync_offset)) {
867867
set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
868-
mddev->recovery_cp = lo;
868+
mddev->resync_offset = lo;
869869
md_check_recovery(mddev);
870870
}
871871

@@ -1027,7 +1027,7 @@ static int leave(struct mddev *mddev)
10271027
* Also, we should send BITMAP_NEEDS_SYNC message in
10281028
* case reshaping is interrupted.
10291029
*/
1030-
if ((cinfo->slot_number > 0 && mddev->recovery_cp != MaxSector) ||
1030+
if ((cinfo->slot_number > 0 && mddev->resync_offset != MaxSector) ||
10311031
(mddev->reshape_position != MaxSector &&
10321032
test_bit(MD_CLOSING, &mddev->flags)))
10331033
resync_bitmap(mddev);
@@ -1605,8 +1605,8 @@ static int gather_bitmaps(struct md_rdev *rdev)
16051605
pr_warn("md-cluster: Could not gather bitmaps from slot %d", sn);
16061606
goto out;
16071607
}
1608-
if ((hi > 0) && (lo < mddev->recovery_cp))
1609-
mddev->recovery_cp = lo;
1608+
if ((hi > 0) && (lo < mddev->resync_offset))
1609+
mddev->resync_offset = lo;
16101610
}
16111611
out:
16121612
return err;

0 commit comments

Comments
 (0)