The patch titled sunrpc: allow svc_pool_map_set_cpumask to work with any task has been removed from the -mm tree. Its filename was sunrpc-allow-svc_pool_map_set_cpumask-to-work-with-any-task.patch This patch was dropped because an updated version will be merged The current -mm tree may be found at http://userweb.kernel.org/~akpm/mmotm/ ------------------------------------------------------ Subject: sunrpc: allow svc_pool_map_set_cpumask to work with any task From: Jeff Layton <jlayton@xxxxxxxxxx> This patchset fixes the use-after-free problem in lockd, and to convert lockd to use the kthread API instead of kernel_thread. The main change from the last patchset is the elimination of the svc_create_kthread helper function, and having lockd_up call kthread_run directly. I've also made some changes to the function prototype for the lockd function to eliminate the need for casting the function pointer. Tested against the reproducer I have for the main issue (detailed in patch #7). As always, comments and suggestions are appreciated. This patch: svc_pool_map_set_cpumask will only affect "current" as of now. Add a new arg so that it can change the cpumask on any given task. Also if we're not changing "current" we don't care what the oldmask was, so allow it to be a NULL pointer. Signed-off-by: Jeff Layton <jlayton@xxxxxxxxxx> Cc: Trond Myklebust <trond.myklebust@xxxxxxxxxx> Cc: Neil Brown <neilb@xxxxxxx> Cc: "J. Bruce Fields" <bfields@xxxxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- net/sunrpc/svc.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff -puN net/sunrpc/svc.c~sunrpc-allow-svc_pool_map_set_cpumask-to-work-with-any-task net/sunrpc/svc.c --- a/net/sunrpc/svc.c~sunrpc-allow-svc_pool_map_set_cpumask-to-work-with-any-task +++ a/net/sunrpc/svc.c @@ -297,7 +297,8 @@ svc_pool_map_put(void) * Returns 1 and fills in oldmask iff a cpumask was applied. */ static inline int -svc_pool_map_set_cpumask(unsigned int pidx, cpumask_t *oldmask) +svc_pool_map_set_cpumask(struct task_struct *task, unsigned int pidx, + cpumask_t *oldmask) { struct svc_pool_map *m = &svc_pool_map; unsigned int node; /* or cpu */ @@ -314,13 +315,15 @@ svc_pool_map_set_cpumask(unsigned int pi return 0; case SVC_POOL_PERCPU: node = m->pool_to[pidx]; - *oldmask = current->cpus_allowed; - set_cpus_allowed(current, cpumask_of_cpu(node)); + if (oldmask != NULL) + *oldmask = task->cpus_allowed; + set_cpus_allowed(task, cpumask_of_cpu(node)); return 1; case SVC_POOL_PERNODE: node = m->pool_to[pidx]; - *oldmask = current->cpus_allowed; - set_cpus_allowed(current, node_to_cpumask(node)); + if (oldmask != NULL) + *oldmask = task->cpus_allowed; + set_cpus_allowed(task, node_to_cpumask(node)); return 1; } } @@ -564,7 +567,8 @@ __svc_create_thread(svc_thread_fn func, rqstp->rq_pool = pool; if (serv->sv_nrpools > 1) - have_oldmask = svc_pool_map_set_cpumask(pool->sp_id, &oldmask); + have_oldmask = svc_pool_map_set_cpumask(current, pool->sp_id, + &oldmask); error = kernel_thread((int (*)(void *)) func, rqstp, 0); _ Patches currently in -mm which might be from jlayton@xxxxxxxxxx are sunrpc-allow-svc_pool_map_set_cpumask-to-work-with-any-task.patch sunrpc-spin-svc_rqst-initialization-to-its-own-function.patch sunrpc-export-svc_sock_update_bufs.patch nlm-initialize-completion-variable-in-lockd_up.patch nlm-have-lockd-call-try_to_freeze.patch nlm-convert-lockd-to-use-kthreads.patch nlm-add-reference-counting-to-lockd.patch git-unionfs.patch smbfs-fix-calculation-of-kernel_recvmsg-size-parameter-in-smb_receive.patch deprecate-smbfs-in-favour-of-cifs.patch - To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html