mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 11:41:38 -04:00
Merge branch 'task_killable' of git://git.kernel.org/pub/scm/linux/kernel/git/willy/misc
* 'task_killable' of git://git.kernel.org/pub/scm/linux/kernel/git/willy/misc: (22 commits) Remove commented-out code copied from NFS NFS: Switch from intr mount option to TASK_KILLABLE Add wait_for_completion_killable Add wait_event_killable Add schedule_timeout_killable Use mutex_lock_killable in vfs_readdir Add mutex_lock_killable Use lock_page_killable Add lock_page_killable Add fatal_signal_pending Add TASK_WAKEKILL exit: Use task_is_* signal: Use task_is_* sched: Use task_contributes_to_load, TASK_ALL and TASK_NORMAL ptrace: Use task_is_* power: Use task_is_* wait: Use TASK_NORMAL proc/base.c: Use task_is_* proc/array.c: Use TASK_REPORT perfmon: Use task_is_* ... Fixed up conflicts in NFS/sunrpc manually..
This commit is contained in:
commit
75659ca0c1
38 changed files with 282 additions and 252 deletions
|
|
@ -385,7 +385,6 @@ rpcauth_bindcred(struct rpc_task *task)
|
|||
.group_info = current->group_info,
|
||||
};
|
||||
struct rpc_cred *ret;
|
||||
sigset_t oldset;
|
||||
int flags = 0;
|
||||
|
||||
dprintk("RPC: %5u looking up %s cred\n",
|
||||
|
|
@ -393,9 +392,7 @@ rpcauth_bindcred(struct rpc_task *task)
|
|||
get_group_info(acred.group_info);
|
||||
if (task->tk_flags & RPC_TASK_ROOTCREDS)
|
||||
flags |= RPCAUTH_LOOKUP_ROOTCREDS;
|
||||
rpc_clnt_sigmask(task->tk_client, &oldset);
|
||||
ret = auth->au_ops->lookup_cred(auth, &acred, flags);
|
||||
rpc_clnt_sigunmask(task->tk_client, &oldset);
|
||||
if (!IS_ERR(ret))
|
||||
task->tk_msg.rpc_cred = ret;
|
||||
else
|
||||
|
|
|
|||
|
|
@ -313,7 +313,7 @@ struct rpc_clnt *rpc_create(struct rpc_create_args *args)
|
|||
return clnt;
|
||||
|
||||
if (!(args->flags & RPC_CLNT_CREATE_NOPING)) {
|
||||
int err = rpc_ping(clnt, RPC_TASK_SOFT|RPC_TASK_NOINTR);
|
||||
int err = rpc_ping(clnt, RPC_TASK_SOFT);
|
||||
if (err != 0) {
|
||||
rpc_shutdown_client(clnt);
|
||||
return ERR_PTR(err);
|
||||
|
|
@ -324,8 +324,6 @@ struct rpc_clnt *rpc_create(struct rpc_create_args *args)
|
|||
if (args->flags & RPC_CLNT_CREATE_HARDRTRY)
|
||||
clnt->cl_softrtry = 0;
|
||||
|
||||
if (args->flags & RPC_CLNT_CREATE_INTR)
|
||||
clnt->cl_intr = 1;
|
||||
if (args->flags & RPC_CLNT_CREATE_AUTOBIND)
|
||||
clnt->cl_autobind = 1;
|
||||
if (args->flags & RPC_CLNT_CREATE_DISCRTRY)
|
||||
|
|
@ -493,7 +491,7 @@ struct rpc_clnt *rpc_bind_new_program(struct rpc_clnt *old,
|
|||
clnt->cl_prog = program->number;
|
||||
clnt->cl_vers = version->number;
|
||||
clnt->cl_stats = program->stats;
|
||||
err = rpc_ping(clnt, RPC_TASK_SOFT|RPC_TASK_NOINTR);
|
||||
err = rpc_ping(clnt, RPC_TASK_SOFT);
|
||||
if (err != 0) {
|
||||
rpc_shutdown_client(clnt);
|
||||
clnt = ERR_PTR(err);
|
||||
|
|
@ -515,46 +513,6 @@ static const struct rpc_call_ops rpc_default_ops = {
|
|||
.rpc_call_done = rpc_default_callback,
|
||||
};
|
||||
|
||||
/*
|
||||
* Export the signal mask handling for synchronous code that
|
||||
* sleeps on RPC calls
|
||||
*/
|
||||
#define RPC_INTR_SIGNALS (sigmask(SIGHUP) | sigmask(SIGINT) | sigmask(SIGQUIT) | sigmask(SIGTERM))
|
||||
|
||||
static void rpc_save_sigmask(sigset_t *oldset, int intr)
|
||||
{
|
||||
unsigned long sigallow = sigmask(SIGKILL);
|
||||
sigset_t sigmask;
|
||||
|
||||
/* Block all signals except those listed in sigallow */
|
||||
if (intr)
|
||||
sigallow |= RPC_INTR_SIGNALS;
|
||||
siginitsetinv(&sigmask, sigallow);
|
||||
sigprocmask(SIG_BLOCK, &sigmask, oldset);
|
||||
}
|
||||
|
||||
static void rpc_task_sigmask(struct rpc_task *task, sigset_t *oldset)
|
||||
{
|
||||
rpc_save_sigmask(oldset, !RPC_TASK_UNINTERRUPTIBLE(task));
|
||||
}
|
||||
|
||||
static void rpc_restore_sigmask(sigset_t *oldset)
|
||||
{
|
||||
sigprocmask(SIG_SETMASK, oldset, NULL);
|
||||
}
|
||||
|
||||
void rpc_clnt_sigmask(struct rpc_clnt *clnt, sigset_t *oldset)
|
||||
{
|
||||
rpc_save_sigmask(oldset, clnt->cl_intr);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rpc_clnt_sigmask);
|
||||
|
||||
void rpc_clnt_sigunmask(struct rpc_clnt *clnt, sigset_t *oldset)
|
||||
{
|
||||
rpc_restore_sigmask(oldset);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rpc_clnt_sigunmask);
|
||||
|
||||
/**
|
||||
* rpc_run_task - Allocate a new RPC task, then run rpc_execute against it
|
||||
* @task_setup_data: pointer to task initialisation data
|
||||
|
|
@ -562,7 +520,6 @@ EXPORT_SYMBOL_GPL(rpc_clnt_sigunmask);
|
|||
struct rpc_task *rpc_run_task(const struct rpc_task_setup *task_setup_data)
|
||||
{
|
||||
struct rpc_task *task, *ret;
|
||||
sigset_t oldset;
|
||||
|
||||
task = rpc_new_task(task_setup_data);
|
||||
if (task == NULL) {
|
||||
|
|
@ -578,13 +535,7 @@ struct rpc_task *rpc_run_task(const struct rpc_task_setup *task_setup_data)
|
|||
goto out;
|
||||
}
|
||||
atomic_inc(&task->tk_count);
|
||||
/* Mask signals on synchronous RPC calls and RPCSEC_GSS upcalls */
|
||||
if (!RPC_IS_ASYNC(task)) {
|
||||
rpc_task_sigmask(task, &oldset);
|
||||
rpc_execute(task);
|
||||
rpc_restore_sigmask(&oldset);
|
||||
} else
|
||||
rpc_execute(task);
|
||||
rpc_execute(task);
|
||||
ret = task;
|
||||
out:
|
||||
return ret;
|
||||
|
|
|
|||
|
|
@ -120,8 +120,7 @@ static struct rpc_clnt *rpcb_create(char *hostname, struct sockaddr *srvaddr,
|
|||
.program = &rpcb_program,
|
||||
.version = version,
|
||||
.authflavor = RPC_AUTH_UNIX,
|
||||
.flags = (RPC_CLNT_CREATE_NOPING |
|
||||
RPC_CLNT_CREATE_INTR),
|
||||
.flags = RPC_CLNT_CREATE_NOPING,
|
||||
};
|
||||
|
||||
switch (srvaddr->sa_family) {
|
||||
|
|
|
|||
|
|
@ -245,9 +245,9 @@ void rpc_init_wait_queue(struct rpc_wait_queue *queue, const char *qname)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(rpc_init_wait_queue);
|
||||
|
||||
static int rpc_wait_bit_interruptible(void *word)
|
||||
static int rpc_wait_bit_killable(void *word)
|
||||
{
|
||||
if (signal_pending(current))
|
||||
if (fatal_signal_pending(current))
|
||||
return -ERESTARTSYS;
|
||||
schedule();
|
||||
return 0;
|
||||
|
|
@ -299,9 +299,9 @@ static void rpc_mark_complete_task(struct rpc_task *task)
|
|||
int __rpc_wait_for_completion_task(struct rpc_task *task, int (*action)(void *))
|
||||
{
|
||||
if (action == NULL)
|
||||
action = rpc_wait_bit_interruptible;
|
||||
action = rpc_wait_bit_killable;
|
||||
return wait_on_bit(&task->tk_runstate, RPC_TASK_ACTIVE,
|
||||
action, TASK_INTERRUPTIBLE);
|
||||
action, TASK_KILLABLE);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__rpc_wait_for_completion_task);
|
||||
|
||||
|
|
@ -696,10 +696,9 @@ static void __rpc_execute(struct rpc_task *task)
|
|||
|
||||
/* sync task: sleep here */
|
||||
dprintk("RPC: %5u sync task going to sleep\n", task->tk_pid);
|
||||
/* Note: Caller should be using rpc_clnt_sigmask() */
|
||||
status = out_of_line_wait_on_bit(&task->tk_runstate,
|
||||
RPC_TASK_QUEUED, rpc_wait_bit_interruptible,
|
||||
TASK_INTERRUPTIBLE);
|
||||
RPC_TASK_QUEUED, rpc_wait_bit_killable,
|
||||
TASK_KILLABLE);
|
||||
if (status == -ERESTARTSYS) {
|
||||
/*
|
||||
* When a sync task receives a signal, it exits with
|
||||
|
|
@ -840,8 +839,6 @@ static void rpc_init_task(struct rpc_task *task, const struct rpc_task_setup *ta
|
|||
kref_get(&task->tk_client->cl_kref);
|
||||
if (task->tk_client->cl_softrtry)
|
||||
task->tk_flags |= RPC_TASK_SOFT;
|
||||
if (!task->tk_client->cl_intr)
|
||||
task->tk_flags |= RPC_TASK_NOINTR;
|
||||
}
|
||||
|
||||
if (task->tk_ops->rpc_call_prepare != NULL)
|
||||
|
|
|
|||
Loading…
Reference in a new issue