All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2] md: reshape from raid0 to raid10 panic
@ 2022-05-12  9:21 Xiao Ni
  2022-05-12  9:21 ` [PATCH V2 1/2] md: Don't set mddev private to NULL in raid0 pers->free Xiao Ni
  2022-05-12  9:21 ` [PATCH 2/2] md: Double free io_acct_set bioset Xiao Ni
  0 siblings, 2 replies; 4+ messages in thread
From: Xiao Ni @ 2022-05-12  9:21 UTC (permalink / raw)
  To: song; +Cc: linux-raid, ncroxon, heinzm, ffan

It panic when reshaping from raid0 to other raid levels because of NULL
pointer dereference. This problem is introduce by patch
commit 0c031fd37f69 ("md: Move alloc/free acct bioset in to personality") 

Patch2 fixes a doulbe free memory problem introduced by the above patch.

Xiao Ni (2):
  md: Don't set mddev private to NULL in raid0 pers->free
  md: Double free io_acct_set bioset

 drivers/md/md.c    | 4 ----
 drivers/md/raid0.c | 1 -
 2 files changed, 5 deletions(-)

-- 
2.32.0 (Apple Git-132)


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH V2 1/2] md: Don't set mddev private to NULL in raid0 pers->free
  2022-05-12  9:21 [PATCH 0/2] md: reshape from raid0 to raid10 panic Xiao Ni
@ 2022-05-12  9:21 ` Xiao Ni
  2022-05-12  9:21 ` [PATCH 2/2] md: Double free io_acct_set bioset Xiao Ni
  1 sibling, 0 replies; 4+ messages in thread
From: Xiao Ni @ 2022-05-12  9:21 UTC (permalink / raw)
  To: song; +Cc: linux-raid, ncroxon, heinzm, ffan

In normal stop process, it does like this:
   do_md_stop
      |
   __md_stop (pers->free(); mddev->private=NULL)
      |
   md_free (free mddev)
__md_stop sets mddev->private to NULL after pers->free. The raid device
will be stopped and mddev memory is free. But in reshape, it doesn't
free the mddev and mddev will still be used in new raid.

In reshape, it first sets mddev->private to new_pers and then runs
old_pers->free(). Now raid0 sets mddev->private to NULL in raid0_free.
The new raid can't work anymore. It will panic when dereference
mddev->private because of NULL pointer dereference.

It can panic like this:
[63010.814972] kernel BUG at drivers/md/raid10.c:928!
[63010.819778] invalid opcode: 0000 [#1] PREEMPT SMP NOPTI
[63010.825011] CPU: 3 PID: 44437 Comm: md0_resync Kdump: loaded Not tainted 5.14.0-86.el9.x86_64 #1
[63010.833789] Hardware name: Dell Inc. PowerEdge R6415/07YXFK, BIOS 1.15.0 09/11/2020
[63010.841440] RIP: 0010:raise_barrier+0x161/0x170 [raid10]
[63010.865508] RSP: 0018:ffffc312408bbc10 EFLAGS: 00010246
[63010.870734] RAX: 0000000000000000 RBX: ffffa00bf7d39800 RCX: 0000000000000000
[63010.877866] RDX: 0000000000000000 RSI: 0000000000000001 RDI: ffffa00bf7d39800
[63010.884999] RBP: 0000000000000000 R08: fffffa4945e74400 R09: 0000000000000000
[63010.892132] R10: ffffa00eed02f798 R11: 0000000000000000 R12: ffffa00bbc435200
[63010.899266] R13: ffffa00bf7d39800 R14: 0000000000000400 R15: 0000000000000003
[63010.906399] FS:  0000000000000000(0000) GS:ffffa00eed000000(0000) knlGS:0000000000000000
[63010.914485] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[63010.920229] CR2: 00007f5cfbe99828 CR3: 0000000105efe000 CR4: 00000000003506e0
[63010.927363] Call Trace:
[63010.929822]  ? bio_reset+0xe/0x40
[63010.933144]  ? raid10_alloc_init_r10buf+0x60/0xa0 [raid10]
[63010.938629]  raid10_sync_request+0x756/0x1610 [raid10]
[63010.943770]  md_do_sync.cold+0x3e4/0x94c
[63010.947698]  md_thread+0xab/0x160
[63010.951024]  ? md_write_inc+0x50/0x50
[63010.954688]  kthread+0x149/0x170
[63010.957923]  ? set_kthread_struct+0x40/0x40
[63010.962107]  ret_from_fork+0x22/0x30

Removing the code that sets mddev->private to NULL in raid0 can fix
problem.

Fixes: 0c031fd37f69 (md: Move alloc/free acct bioset in to personality)
Reported-by: Fine Fan <ffan@redhat.com>
Signed-off-by: Xiao Ni <xni@redhat.com>
---
V1->V2: Add subsystem in subject and add more information about this problem
---
 drivers/md/raid0.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c
index e11701e394ca..5fa0d401eefc 100644
--- a/drivers/md/raid0.c
+++ b/drivers/md/raid0.c
@@ -362,7 +362,6 @@ static void free_conf(struct mddev *mddev, struct r0conf *conf)
 	kfree(conf->strip_zone);
 	kfree(conf->devlist);
 	kfree(conf);
-	mddev->private = NULL;
 }
 
 static void raid0_free(struct mddev *mddev, void *priv)
-- 
2.32.0 (Apple Git-132)


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 2/2] md: Double free io_acct_set bioset
  2022-05-12  9:21 [PATCH 0/2] md: reshape from raid0 to raid10 panic Xiao Ni
  2022-05-12  9:21 ` [PATCH V2 1/2] md: Don't set mddev private to NULL in raid0 pers->free Xiao Ni
@ 2022-05-12  9:21 ` Xiao Ni
  2022-05-12 16:26   ` Song Liu
  1 sibling, 1 reply; 4+ messages in thread
From: Xiao Ni @ 2022-05-12  9:21 UTC (permalink / raw)
  To: song; +Cc: linux-raid, ncroxon, heinzm, ffan

Now io_acct_set is alloc and free in personality. Remove the codes that
free io_acct_set in md_free and md_stop.

Fixes: 0c031fd37f69 (md: Move alloc/free acct bioset in to personality)
Signed-off-by: Xiao Ni <xni@redhat.com>
---
 drivers/md/md.c | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/drivers/md/md.c b/drivers/md/md.c
index 53787a32166d..91c6cb3da470 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -5598,8 +5598,6 @@ static void md_free(struct kobject *ko)
 
 	bioset_exit(&mddev->bio_set);
 	bioset_exit(&mddev->sync_set);
-	if (mddev->level != 1 && mddev->level != 10)
-		bioset_exit(&mddev->io_acct_set);
 	kfree(mddev);
 }
 
@@ -6285,8 +6283,6 @@ void md_stop(struct mddev *mddev)
 	__md_stop(mddev);
 	bioset_exit(&mddev->bio_set);
 	bioset_exit(&mddev->sync_set);
-	if (mddev->level != 1 && mddev->level != 10)
-		bioset_exit(&mddev->io_acct_set);
 }
 
 EXPORT_SYMBOL_GPL(md_stop);
-- 
2.32.0 (Apple Git-132)


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH 2/2] md: Double free io_acct_set bioset
  2022-05-12  9:21 ` [PATCH 2/2] md: Double free io_acct_set bioset Xiao Ni
@ 2022-05-12 16:26   ` Song Liu
  0 siblings, 0 replies; 4+ messages in thread
From: Song Liu @ 2022-05-12 16:26 UTC (permalink / raw)
  To: Xiao Ni; +Cc: linux-raid, Nigel Croxon, Heinz Mauelshagen, Fine Fan

On Thu, May 12, 2022 at 2:21 AM Xiao Ni <xni@redhat.com> wrote:
>
> Now io_acct_set is alloc and free in personality. Remove the codes that
> free io_acct_set in md_free and md_stop.
>
> Fixes: 0c031fd37f69 (md: Move alloc/free acct bioset in to personality)
> Signed-off-by: Xiao Ni <xni@redhat.com>

Applied the set to md-next. Changed the subject of 2/2 as
 md: *fix* double free of io_acct_set bioset

Thanks,
Song

> ---
>  drivers/md/md.c | 4 ----
>  1 file changed, 4 deletions(-)
>
> diff --git a/drivers/md/md.c b/drivers/md/md.c
> index 53787a32166d..91c6cb3da470 100644
> --- a/drivers/md/md.c
> +++ b/drivers/md/md.c
> @@ -5598,8 +5598,6 @@ static void md_free(struct kobject *ko)
>
>         bioset_exit(&mddev->bio_set);
>         bioset_exit(&mddev->sync_set);
> -       if (mddev->level != 1 && mddev->level != 10)
> -               bioset_exit(&mddev->io_acct_set);
>         kfree(mddev);
>  }
>
> @@ -6285,8 +6283,6 @@ void md_stop(struct mddev *mddev)
>         __md_stop(mddev);
>         bioset_exit(&mddev->bio_set);
>         bioset_exit(&mddev->sync_set);
> -       if (mddev->level != 1 && mddev->level != 10)
> -               bioset_exit(&mddev->io_acct_set);
>  }
>
>  EXPORT_SYMBOL_GPL(md_stop);
> --
> 2.32.0 (Apple Git-132)
>

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2022-05-12 16:26 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-05-12  9:21 [PATCH 0/2] md: reshape from raid0 to raid10 panic Xiao Ni
2022-05-12  9:21 ` [PATCH V2 1/2] md: Don't set mddev private to NULL in raid0 pers->free Xiao Ni
2022-05-12  9:21 ` [PATCH 2/2] md: Double free io_acct_set bioset Xiao Ni
2022-05-12 16:26   ` Song Liu

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.