diff options
| author | Jens Axboe <axboe@kernel.dk> | 2025-01-24 12:42:48 -0700 |
|---|---|---|
| committer | Jens Axboe <axboe@kernel.dk> | 2025-01-24 12:42:48 -0700 |
| commit | e9d8c873964e6fcec85657dde5406eafa596751a (patch) | |
| tree | 1f98259981a4a60a2585282d5f1d5a91bfc61b26 /drivers | |
| parent | a9ae6fe1c319c4776c2b11e85e15109cd3f04076 (diff) | |
| parent | 8d28d0ddb986f56920ac97ae704cc3340a699a30 (diff) | |
Merge tag 'md-6.14-20250124' of https://git.kernel.org/pub/scm/linux/kernel/git/mdraid/linux into block-6.14
Pull MD fix from Song:
"Fix a md-cluster regression introduced in the 6.12 release."
* tag 'md-6.14-20250124' of https://git.kernel.org/pub/scm/linux/kernel/git/mdraid/linux:
md/md-bitmap: Synchronize bitmap_get_stats() with bitmap lifetime
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/md/md-bitmap.c | 5 | ||||
| -rw-r--r-- | drivers/md/md.c | 5 |
2 files changed, 9 insertions, 1 deletions
diff --git a/drivers/md/md-bitmap.c b/drivers/md/md-bitmap.c index ec4ecd96e6b1..23c09d22fcdb 100644 --- a/drivers/md/md-bitmap.c +++ b/drivers/md/md-bitmap.c @@ -2355,7 +2355,10 @@ static int bitmap_get_stats(void *data, struct md_bitmap_stats *stats) if (!bitmap) return -ENOENT; - + if (bitmap->mddev->bitmap_info.external) + return -ENOENT; + if (!bitmap->storage.sb_page) /* no superblock */ + return -EINVAL; sb = kmap_local_page(bitmap->storage.sb_page); stats->sync_size = le64_to_cpu(sb->sync_size); kunmap_local(sb); diff --git a/drivers/md/md.c b/drivers/md/md.c index 866015b681af..465ca2af1e6e 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -8376,6 +8376,10 @@ static int md_seq_show(struct seq_file *seq, void *v) return 0; spin_unlock(&all_mddevs_lock); + + /* prevent bitmap to be freed after checking */ + mutex_lock(&mddev->bitmap_info.mutex); + spin_lock(&mddev->lock); if (mddev->pers || mddev->raid_disks || !list_empty(&mddev->disks)) { seq_printf(seq, "%s : ", mdname(mddev)); @@ -8451,6 +8455,7 @@ static int md_seq_show(struct seq_file *seq, void *v) seq_printf(seq, "\n"); } spin_unlock(&mddev->lock); + mutex_unlock(&mddev->bitmap_info.mutex); spin_lock(&all_mddevs_lock); if (mddev == list_last_entry(&all_mddevs, struct mddev, all_mddevs)) |
