[PATCH] md/bitmap: fix GPF in write_page caused by resize race

Jack Wang posted 1 patch 2 weeks, 3 days ago
drivers/md/md-bitmap.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
[PATCH] md/bitmap: fix GPF in write_page caused by resize race
Posted by Jack Wang 2 weeks, 3 days ago
A General Protection Fault occurs in write_page() during array resize:
RIP: 0010:write_page+0x22b/0x3c0 [md_mod]

This is a use-after-free race between bitmap_daemon_work() and
__bitmap_resize(). The daemon iterates over `bitmap->storage.filemap`
without locking, while the resize path frees that storage via
md_bitmap_file_unmap(). `quiesce()` does not stop the md thread,
allowing concurrent access to freed pages.

Fix by holding `mddev->bitmap_info.mutex` during the bitmap update.

Closes: https://lore.kernel.org/linux-raid/CAMGffE=Mbfp=7xD_hYxXk1PAaCZNSEAVeQGKGy7YF9f2S4=NEA@mail.gmail.com/T/#u
Cc: stable@vger.kernel.org
Signed-off-by: Jack Wang <jinpu.wang@ionos.com>
---
 drivers/md/md-bitmap.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/md/md-bitmap.c b/drivers/md/md-bitmap.c
index 84b7e2af6dba..7bb56d0491a2 100644
--- a/drivers/md/md-bitmap.c
+++ b/drivers/md/md-bitmap.c
@@ -2453,6 +2453,7 @@ static int __bitmap_resize(struct bitmap *bitmap, sector_t blocks,
 		memcpy(page_address(store.sb_page),
 		       page_address(bitmap->storage.sb_page),
 		       sizeof(bitmap_super_t));
+	mutex_lock(&bitmap->mddev->bitmap_info.mutex);
 	spin_lock_irq(&bitmap->counts.lock);
 	md_bitmap_file_unmap(&bitmap->storage);
 	bitmap->storage = store;
@@ -2560,7 +2561,7 @@ static int __bitmap_resize(struct bitmap *bitmap, sector_t blocks,
 			set_page_attr(bitmap, i, BITMAP_PAGE_DIRTY);
 	}
 	spin_unlock_irq(&bitmap->counts.lock);
-
+	mutex_unlock(&bitmap->mddev->bitmap_info.mutex);
 	if (!init) {
 		__bitmap_unplug(bitmap);
 		bitmap->mddev->pers->quiesce(bitmap->mddev, 0);
-- 
2.43.0
Re: [PATCH] md/bitmap: fix GPF in write_page caused by resize race
Posted by Yu Kuai 1 week, 5 days ago
在 2026/1/20 18:24, Jack Wang 写道:

> A General Protection Fault occurs in write_page() during array resize:
> RIP: 0010:write_page+0x22b/0x3c0 [md_mod]
>
> This is a use-after-free race between bitmap_daemon_work() and
> __bitmap_resize(). The daemon iterates over `bitmap->storage.filemap`
> without locking, while the resize path frees that storage via
> md_bitmap_file_unmap(). `quiesce()` does not stop the md thread,
> allowing concurrent access to freed pages.
>
> Fix by holding `mddev->bitmap_info.mutex` during the bitmap update.
>
> Closes:https://lore.kernel.org/linux-raid/CAMGffE=Mbfp=7xD_hYxXk1PAaCZNSEAVeQGKGy7YF9f2S4=NEA@mail.gmail.com/T/#u
> Cc:stable@vger.kernel.org
> Signed-off-by: Jack Wang<jinpu.wang@ionos.com>
> ---
>   drivers/md/md-bitmap.c | 3 ++-
>   1 file changed, 2 insertions(+), 1 deletion(-)

Applied with a fixtag:

Fixes: d60b479d177a ("md/bitmap: add bitmap_resize function to allow 
bitmap resizing.")

-- 
Thansk,
Kuai
Re: [PATCH] md/bitmap: fix GPF in write_page caused by resize race
Posted by Jinpu Wang 1 week, 5 days ago
On Mon, Jan 26, 2026 at 6:33 AM Yu Kuai <yukuai@fnnas.com> wrote:
>
> 在 2026/1/20 18:24, Jack Wang 写道:
>
> > A General Protection Fault occurs in write_page() during array resize:
> > RIP: 0010:write_page+0x22b/0x3c0 [md_mod]
> >
> > This is a use-after-free race between bitmap_daemon_work() and
> > __bitmap_resize(). The daemon iterates over `bitmap->storage.filemap`
> > without locking, while the resize path frees that storage via
> > md_bitmap_file_unmap(). `quiesce()` does not stop the md thread,
> > allowing concurrent access to freed pages.
> >
> > Fix by holding `mddev->bitmap_info.mutex` during the bitmap update.
> >
> > Closes:https://lore.kernel.org/linux-raid/CAMGffE=Mbfp=7xD_hYxXk1PAaCZNSEAVeQGKGy7YF9f2S4=NEA@mail.gmail.com/T/#u
> > Cc:stable@vger.kernel.org
> > Signed-off-by: Jack Wang<jinpu.wang@ionos.com>
> > ---
> >   drivers/md/md-bitmap.c | 3 ++-
> >   1 file changed, 2 insertions(+), 1 deletion(-)
>
> Applied with a fixtag:
>
> Fixes: d60b479d177a ("md/bitmap: add bitmap_resize function to allow
> bitmap resizing.")
>
> --
> Thansk,
> Kuai
Hi Kuai,

Thanks for applying the fix with the fixes tag.

Best,
Jinpu