diff --git a/modules/spl/spl-mutex.c b/modules/spl/spl-mutex.c index d9f3c0759..8ca1286e9 100644 --- a/modules/spl/spl-mutex.c +++ b/modules/spl/spl-mutex.c @@ -78,7 +78,7 @@ __spl_mutex_init(kmutex_t *mp, char *name, int type, void *ibc) } sema_init(mp->km_sem, 1); - strcpy(mp->km_name, name); + strncpy(mp->km_name, name, mp->km_name_size); #ifdef DEBUG_MUTEX mp->km_stats = kmem_zalloc(sizeof(int) * MUTEX_STATS_SIZE, flags); diff --git a/modules/spl/spl-thread.c b/modules/spl/spl-thread.c index e073bb2b6..de4f03898 100644 --- a/modules/spl/spl-thread.c +++ b/modules/spl/spl-thread.c @@ -12,6 +12,8 @@ */ typedef struct thread_priv_s { unsigned long tp_magic; /* Magic */ + int tp_name_size; /* Name size */ + char *tp_name; /* Name (without _thread suffix) */ void (*tp_func)(void *); /* Registered function */ void *tp_args; /* Args to be passed to function */ size_t tp_len; /* Len to be passed to function */ @@ -31,7 +33,8 @@ thread_generic_wrapper(void *arg) args = tp->tp_args; set_current_state(tp->tp_state); set_user_nice((kthread_t *)get_current(), PRIO_TO_NICE(tp->tp_pri)); - kmem_free(arg, sizeof(thread_priv_t)); + kmem_free(tp->tp_name, tp->tp_name_size); + kmem_free(tp, sizeof(thread_priv_t)); if (func) func(args); @@ -60,6 +63,7 @@ __thread_create(caddr_t stk, size_t stksize, thread_func_t func, thread_priv_t *tp; DEFINE_WAIT(wait); struct task_struct *tsk; + char *p; ENTRY; /* Option pp is simply ignored */ @@ -71,13 +75,30 @@ __thread_create(caddr_t stk, size_t stksize, thread_func_t func, RETURN(NULL); tp->tp_magic = TP_MAGIC; + tp->tp_name_size = strlen(name) + 1; + + tp->tp_name = kmem_alloc(tp->tp_name_size, KM_SLEEP); + if (tp->tp_name == NULL) { + kmem_free(tp, sizeof(thread_priv_t)); + RETURN(NULL); + } + + strncpy(tp->tp_name, name, tp->tp_name_size); + + /* Strip trailing "_thread" from passed name which will be the func + * name since the exposed API has no parameter for passing a name. + */ + p = strstr(tp->tp_name, "_thread"); + if (p) + p[0] = '\0'; + tp->tp_func = func; tp->tp_args = args; tp->tp_len = len; tp->tp_state = state; tp->tp_pri = pri; - tsk = kthread_create(thread_generic_wrapper, (void *)tp, "%s", name); + tsk = kthread_create(thread_generic_wrapper, (void *)tp, tp->tp_name); if (IS_ERR(tsk)) { CERROR("Failed to create thread: %ld\n", PTR_ERR(tsk)); RETURN(NULL);