Skip to content

Commit 017ff37

Browse files
committed
Merge tag 'md-6.15-20250312' of https://git.kernel.org/pub/scm/linux/kernel/git/mdraid/linux into for-6.15/block
Merge MD changes from Yu: "- fix recovery can preempt resync (Li Nan) - fix md-bitmap IO limit (Su Yue) - fix raid10 discard with REQ_NOWAIT (Xiao Ni) - fix raid1 memory leak (Zheng Qixing) - fix mddev uaf (Yu Kuai) - fix raid1,raid10 IO flags (Yu Kuai) - some refactor and cleanup (Yu Kuai)" * tag 'md-6.15-20250312' of https://git.kernel.org/pub/scm/linux/kernel/git/mdraid/linux: md/raid10: wait barrier before returning discard request with REQ_NOWAIT md/md-bitmap: fix wrong bitmap_limit for clustermd when write sb md/raid1,raid10: don't ignore IO flags md/raid5: merge reshape_progress checking inside get_reshape_loc() md: fix mddev uaf while iterating all_mddevs list md: switch md-cluster to use md_submodle_head md: don't export md_cluster_ops md/md-cluster: cleanup md_cluster_ops reference md: switch personalities to use md_submodule_head md: introduce struct md_submodule_head and APIs md: only include md-cluster.h if necessary md: merge common code into find_pers() md/raid1: fix memory leak in raid1_run() if no active rdev md: ensure resync is prioritized over recovery
2 parents 26064d3 + 3db4404 commit 017ff37

File tree

11 files changed

+338
-269
lines changed

11 files changed

+338
-269
lines changed

drivers/md/md-bitmap.c

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,10 @@
2929
#include <linux/buffer_head.h>
3030
#include <linux/seq_file.h>
3131
#include <trace/events/block.h>
32+
3233
#include "md.h"
3334
#include "md-bitmap.h"
35+
#include "md-cluster.h"
3436

3537
#define BITMAP_MAJOR_LO 3
3638
/* version 4 insists the bitmap is in little-endian order
@@ -426,8 +428,8 @@ static int __write_sb_page(struct md_rdev *rdev, struct bitmap *bitmap,
426428
struct block_device *bdev;
427429
struct mddev *mddev = bitmap->mddev;
428430
struct bitmap_storage *store = &bitmap->storage;
429-
unsigned int bitmap_limit = (bitmap->storage.file_pages - pg_index) <<
430-
PAGE_SHIFT;
431+
unsigned long num_pages = bitmap->storage.file_pages;
432+
unsigned int bitmap_limit = (num_pages - pg_index % num_pages) << PAGE_SHIFT;
431433
loff_t sboff, offset = mddev->bitmap_info.offset;
432434
sector_t ps = pg_index * PAGE_SIZE / SECTOR_SIZE;
433435
unsigned int size = PAGE_SIZE;
@@ -436,7 +438,7 @@ static int __write_sb_page(struct md_rdev *rdev, struct bitmap *bitmap,
436438

437439
bdev = (rdev->meta_bdev) ? rdev->meta_bdev : rdev->bdev;
438440
/* we compare length (page numbers), not page offset. */
439-
if ((pg_index - store->sb_index) == store->file_pages - 1) {
441+
if ((pg_index - store->sb_index) == num_pages - 1) {
440442
unsigned int last_page_size = store->bytes & (PAGE_SIZE - 1);
441443

442444
if (last_page_size == 0)
@@ -942,7 +944,7 @@ static int md_bitmap_read_sb(struct bitmap *bitmap)
942944
bmname(bitmap), err);
943945
goto out_no_sb;
944946
}
945-
bitmap->cluster_slot = md_cluster_ops->slot_number(bitmap->mddev);
947+
bitmap->cluster_slot = bitmap->mddev->cluster_ops->slot_number(bitmap->mddev);
946948
goto re_read;
947949
}
948950

@@ -2021,7 +2023,7 @@ static void md_bitmap_free(void *data)
20212023
sysfs_put(bitmap->sysfs_can_clear);
20222024

20232025
if (mddev_is_clustered(bitmap->mddev) && bitmap->mddev->cluster_info &&
2024-
bitmap->cluster_slot == md_cluster_ops->slot_number(bitmap->mddev))
2026+
bitmap->cluster_slot == bitmap->mddev->cluster_ops->slot_number(bitmap->mddev))
20252027
md_cluster_stop(bitmap->mddev);
20262028

20272029
/* Shouldn't be needed - but just in case.... */
@@ -2229,7 +2231,7 @@ static int bitmap_load(struct mddev *mddev)
22292231
mddev_create_serial_pool(mddev, rdev);
22302232

22312233
if (mddev_is_clustered(mddev))
2232-
md_cluster_ops->load_bitmaps(mddev, mddev->bitmap_info.nodes);
2234+
mddev->cluster_ops->load_bitmaps(mddev, mddev->bitmap_info.nodes);
22332235

22342236
/* Clear out old bitmap info first: Either there is none, or we
22352237
* are resuming after someone else has possibly changed things,

drivers/md/md-cluster.c

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1166,7 +1166,7 @@ static int resize_bitmaps(struct mddev *mddev, sector_t newsize, sector_t oldsiz
11661166
struct dlm_lock_resource *bm_lockres;
11671167
char str[64];
11681168

1169-
if (i == md_cluster_ops->slot_number(mddev))
1169+
if (i == slot_number(mddev))
11701170
continue;
11711171

11721172
bitmap = mddev->bitmap_ops->get_from_slot(mddev, i);
@@ -1216,7 +1216,7 @@ static int resize_bitmaps(struct mddev *mddev, sector_t newsize, sector_t oldsiz
12161216
*/
12171217
static int cluster_check_sync_size(struct mddev *mddev)
12181218
{
1219-
int current_slot = md_cluster_ops->slot_number(mddev);
1219+
int current_slot = slot_number(mddev);
12201220
int node_num = mddev->bitmap_info.nodes;
12211221
struct dlm_lock_resource *bm_lockres;
12221222
struct md_bitmap_stats stats;
@@ -1612,7 +1612,14 @@ static int gather_bitmaps(struct md_rdev *rdev)
16121612
return err;
16131613
}
16141614

1615-
static const struct md_cluster_operations cluster_ops = {
1615+
static struct md_cluster_operations cluster_ops = {
1616+
.head = {
1617+
.type = MD_CLUSTER,
1618+
.id = ID_CLUSTER,
1619+
.name = "cluster",
1620+
.owner = THIS_MODULE,
1621+
},
1622+
16161623
.join = join,
16171624
.leave = leave,
16181625
.slot_number = slot_number,
@@ -1642,13 +1649,12 @@ static int __init cluster_init(void)
16421649
{
16431650
pr_warn("md-cluster: support raid1 and raid10 (limited support)\n");
16441651
pr_info("Registering Cluster MD functions\n");
1645-
register_md_cluster_operations(&cluster_ops, THIS_MODULE);
1646-
return 0;
1652+
return register_md_submodule(&cluster_ops.head);
16471653
}
16481654

16491655
static void cluster_exit(void)
16501656
{
1651-
unregister_md_cluster_operations();
1657+
unregister_md_submodule(&cluster_ops.head);
16521658
}
16531659

16541660
module_init(cluster_init);

drivers/md/md-cluster.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ struct mddev;
1010
struct md_rdev;
1111

1212
struct md_cluster_operations {
13+
struct md_submodule_head head;
14+
1315
int (*join)(struct mddev *mddev, int nodes);
1416
int (*leave)(struct mddev *mddev);
1517
int (*slot_number)(struct mddev *mddev);
@@ -35,4 +37,8 @@ struct md_cluster_operations {
3537
void (*update_size)(struct mddev *mddev, sector_t old_dev_sectors);
3638
};
3739

40+
extern int md_setup_cluster(struct mddev *mddev, int nodes);
41+
extern void md_cluster_stop(struct mddev *mddev);
42+
extern void md_reload_sb(struct mddev *mddev, int raid_disk);
43+
3844
#endif /* _MD_CLUSTER_H */

drivers/md/md-linear.c

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
*/
66

77
#include <linux/blkdev.h>
8-
#include <linux/raid/md_u.h>
98
#include <linux/seq_file.h>
109
#include <linux/module.h>
1110
#include <linux/slab.h>
@@ -320,9 +319,13 @@ static void linear_quiesce(struct mddev *mddev, int state)
320319
}
321320

322321
static struct md_personality linear_personality = {
323-
.name = "linear",
324-
.level = LEVEL_LINEAR,
325-
.owner = THIS_MODULE,
322+
.head = {
323+
.type = MD_PERSONALITY,
324+
.id = ID_LINEAR,
325+
.name = "linear",
326+
.owner = THIS_MODULE,
327+
},
328+
326329
.make_request = linear_make_request,
327330
.run = linear_run,
328331
.free = linear_free,
@@ -335,12 +338,12 @@ static struct md_personality linear_personality = {
335338

336339
static int __init linear_init(void)
337340
{
338-
return register_md_personality(&linear_personality);
341+
return register_md_submodule(&linear_personality.head);
339342
}
340343

341344
static void linear_exit(void)
342345
{
343-
unregister_md_personality(&linear_personality);
346+
unregister_md_submodule(&linear_personality.head);
344347
}
345348

346349
module_init(linear_init);

0 commit comments

Comments
 (0)