}
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);
*/
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 */
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);
thread_priv_t *tp;
DEFINE_WAIT(wait);
struct task_struct *tsk;
+ char *p;
ENTRY;
/* Option pp is simply ignored */
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);