diff options
author | Tim Chase <[email protected]> | 2014-04-09 13:40:12 -0500 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2014-04-09 19:17:12 -0700 |
commit | ed650dee76e928ce266e9d204637516d3a375b77 (patch) | |
tree | c16f83a8f90afcd40bcf1f4dc3c07452643b8a76 /module | |
parent | 17a527cb0f44cef6582583e502621541061d8817 (diff) |
De-inline spl_kthread_create().
The function was defined as a static inline with variable arguments
which causes gcc to generate errors on some distros.
Signed-off-by: Brian Behlendorf <[email protected]>
Signed-off-by: Tim Chase <[email protected]>
Closes #346
Diffstat (limited to 'module')
-rw-r--r-- | module/spl/spl-thread.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/module/spl/spl-thread.c b/module/spl/spl-thread.c index b0fa4d795..a74b9d9ac 100644 --- a/module/spl/spl-thread.c +++ b/module/spl/spl-thread.c @@ -137,3 +137,31 @@ __thread_create(caddr_t stk, size_t stksize, thread_func_t func, SRETURN((kthread_t *)tsk); } EXPORT_SYMBOL(__thread_create); + +/* + * spl_kthread_create - Wrapper providing pre-3.13 semantics for + * kthread_create() in which it is not killable and less likely + * to return -ENOMEM. + */ +struct task_struct * +spl_kthread_create(int (*func)(void *), void *data, const char namefmt[], ...) +{ + struct task_struct *tsk; + va_list args; + + va_start(args, namefmt); + do { + tsk = kthread_create(func, data, namefmt, args); + if (IS_ERR(tsk)) { + if (signal_pending(current)) { + clear_thread_flag(TIF_SIGPENDING); + continue; + } + if (PTR_ERR(tsk) == -ENOMEM) + continue; + return (NULL); + } else + return (tsk); + } while (1); +} +EXPORT_SYMBOL(spl_kthread_create); |