md:Fix name of raid thread when raid takeovered
PATCH 1/1 md:Fix name of raid thread when raid takeovered
When raid takeovered, it used old personality to set task->comm.
--- drivers/md/md.c | 15 +++++++++++++++ 1 files changed, 15 insertions(+), 0 deletions(-)
drivers/md/md.c +15 -0
@@ -32,6 +32,7 @@Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include <linux/sched.h> #include <linux/kthread.h> #include <linux/blkdev.h> #include <linux/sysctl.h>
@@ -3513,6 +3514,7 @@ level_store(struct mddev *mddev, const char *buf, size_t len)long level;void *priv;struct md_rdev *rdev; +char *tmp;if (mddev->pers ==NULL ) {if (len ==0 )
@@ -3674,6 +3676,19 @@ level_store(struct mddev *mddev, const char *buf, size_t len)del_timer_sync (&mddev->safemode_timer); } pers->run (mddev); +/* +* when raid takeover using old personality,so mddev->thread->tsk +* name is wrong. +* if kzalloc error, only using wrong name. +*/ + len =strlen (mdname (mddev)) +strlen (mddev->pers->name); + tmp =kzalloc (len +2 ,GFP_KERNEL ); +if (tmp) { +sprintf (tmp,"%s_%s" ,mdname (mddev), mddev->pers->name); +set_task_comm (mddev->thread->tsk, tmp); +kfree (tmp); + } +set_bit (MD_CHANGE_DEVS , &mddev->flags);mddev_resume (mddev);sysfs_notify (&mddev->kobj,NULL ,"level" );
Signature · 6 lines
1.7.5.4 -------------- majianpeng 2012-05-31
Quoted 37 lines · On Thu, 31 May 2012 15:41:22 +0800 "majianpeng" <[email protected]> wrote:
When raid takeovered, it used old personality to set
task->comm.Signed-off-by majianpeng <[email protected]>--- drivers/md/md.c | 15 +++++++++++++++ 1 files changed, 15 insertions(+), 0 deletions(-)drivers/md/md.c +8
-0@@ -32,6 +32,7 @@Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include <linux/sched.h> #include <linux/kthread.h> #include <linux/blkdev.h> #include <linux/sysctl.h> @@ -3513,6 +3514,7 @@ level_store(struct mddev *mddev, const char *buf, size_t len)long level;void *priv;struct md_rdev *rdev; +char *tmp;if (mddev->pers ==NULL ) {if (len ==0 )@@ -3674,6 +3676,19 @@ level_store(struct mddev *mddev, const char *buf, size_t len)del_timer_sync (&mddev->safemode_timer); } pers->run (mddev); +/* +* when raid takeover using old personality,so mddev->thread->tsk +* name is wrong. +* if kzalloc error, only using wrong name. +*/ + len =strlen (mdname (mddev)) +strlen (mddev->pers->name);
drivers/md/md.c level_store(struct mddev *mddev, const char *buf, size_t len) · line 3694
Quoted 10 lines
drivers/md/md.c +7
-0+ tmp =kzalloc (len +2 ,GFP_KERNEL ); +if (tmp) { +sprintf (tmp,"%s_%s" ,mdname (mddev), mddev->pers->name); +set_task_comm (mddev->thread->tsk, tmp); +kfree (tmp); + } +set_bit (MD_CHANGE_DEVS , &mddev->flags);mddev_resume (mddev);sysfs_notify (&mddev->kobj,NULL ,"level" );
Thanks. However:
1/ as a task name is limited to TASK_COMM_LEN, there is little point using
kzalloc. Just declare a local variable of that size.
2/ No all levels have a thread. You should check that mddev->thread is not
NULL.
If you resubmit with those fixes I'll apply the patch.
Thanks,
NeilBrown
Quoted 57 lines · On Sun, 3 Jun 2012 20:49:05 -0700,neil wrote:
Quoted 37 lines · On Thu, 31 May 2012 15:41:22 +0800 "majianpeng" <[email protected]> wrote:
When raid takeovered, it used old personality to set
task->comm.Signed-off-by majianpeng <[email protected]>--- drivers/md/md.c | 15 +++++++++++++++ 1 files changed, 15 insertions(+), 0 deletions(-)drivers/md/md.c +8
-0@@ -32,6 +32,7 @@Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include <linux/sched.h> #include <linux/kthread.h> #include <linux/blkdev.h> #include <linux/sysctl.h> @@ -3513,6 +3514,7 @@ level_store(struct mddev *mddev, const char *buf, size_t len)long level;void *priv;struct md_rdev *rdev; +char *tmp;if (mddev->pers ==NULL ) {if (len ==0 )@@ -3674,6 +3676,19 @@ level_store(struct mddev *mddev, const char *buf, size_t len)del_timer_sync (&mddev->safemode_timer); } pers->run (mddev); +/* +* when raid takeover using old personality,so mddev->thread->tsk +* name is wrong. +* if kzalloc error, only using wrong name. +*/ + len =strlen (mdname (mddev)) +strlen (mddev->pers->name);drivers/md/md.c level_store(struct mddev *mddev, const char *buf, size_t len) · line 3694
Quoted 10 lines
drivers/md/md.c +7
-0+ tmp =kzalloc (len +2 ,GFP_KERNEL ); +if (tmp) { +sprintf (tmp,"%s_%s" ,mdname (mddev), mddev->pers->name); +set_task_comm (mddev->thread->tsk, tmp); +kfree (tmp); + } +set_bit (MD_CHANGE_DEVS , &mddev->flags);mddev_resume (mddev);sysfs_notify (&mddev->kobj,NULL ,"level" );Thanks. However:
1/ as a task name is limited to
TASK_COMM_LEN, there is little point using
kzalloc. Just declare a local variable of that size.
2/ No all levels have a thread. You should check thatmddev->threadis not
NULL.
Quoted 6 lines
If you resubmit with those fixes I'll apply the patch.
Thanks,
NeilBrown
Neil, There maybe had anthor issue.set_task_comm() is not export.So when compile md is module, it will be error.
So I think it will be rewrite.It should rename in function call md_register_thread().
How about this way?
Thanks!
--------------
majianpeng
Quoted 60 lines · On Mon, 4 Jun 2012 13:36:11 +0800 majianpeng <[email protected]> wrote:
Quoted 59 lines · On Sun, 3 Jun 2012 20:49:05 -0700,neil wrote:
Quoted 37 lines · On Thu, 31 May 2012 15:41:22 +0800 "majianpeng" <[email protected]> wrote:
When raid takeovered, it used old personality to set
task->comm.Signed-off-by majianpeng <[email protected]>--- drivers/md/md.c | 15 +++++++++++++++ 1 files changed, 15 insertions(+), 0 deletions(-)drivers/md/md.c +8
-0@@ -32,6 +32,7 @@Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include <linux/sched.h> #include <linux/kthread.h> #include <linux/blkdev.h> #include <linux/sysctl.h> @@ -3513,6 +3514,7 @@ level_store(struct mddev *mddev, const char *buf, size_t len)long level;void *priv;struct md_rdev *rdev; +char *tmp;if (mddev->pers ==NULL ) {if (len ==0 )@@ -3674,6 +3676,19 @@ level_store(struct mddev *mddev, const char *buf, size_t len)del_timer_sync (&mddev->safemode_timer); } pers->run (mddev); +/* +* when raid takeover using old personality,so mddev->thread->tsk +* name is wrong. +* if kzalloc error, only using wrong name. +*/ + len =strlen (mdname (mddev)) +strlen (mddev->pers->name);drivers/md/md.c level_store(struct mddev *mddev, const char *buf, size_t len) · line 3694
Quoted 10 lines
drivers/md/md.c +7
-0+ tmp =kzalloc (len +2 ,GFP_KERNEL ); +if (tmp) { +sprintf (tmp,"%s_%s" ,mdname (mddev), mddev->pers->name); +set_task_comm (mddev->thread->tsk, tmp); +kfree (tmp); + } +set_bit (MD_CHANGE_DEVS , &mddev->flags);mddev_resume (mddev);sysfs_notify (&mddev->kobj,NULL ,"level" );Thanks. However:
1/ as a task name is limited to
TASK_COMM_LEN, there is little point using
kzalloc. Just declare a local variable of that size.
2/ No all levels have a thread. You should check thatmddev->threadis not
NULL.If you resubmit with those fixes I'll apply the patch.
Quoted 8 lines
Quoted 4 lines
Thanks,
NeilBrownNeil, There maybe had anthor issue.
set_task_comm()is not export.So when compile md is module, it will be error. So I think it will be rewrite.It should rename in function callmd_register_thread(). How about this way?
good point.
If you change all calls to "md_register_thread" that pass NULL as the last argument to instead pass the name of the personality as the last arg, then it should get it right.
Thanks,
NeilBrown