From: Steve Dickson <SteveD@redhat.com>
To: Trond Myklebust <trond.myklebust@fys.uio.no>
Cc: nfs@lists.sourceforge.net
Subject: Re: [PATCH] -o intr mount option prevents core dumps on 2.4 kernel
Date: Wed, 12 Jan 2005 13:18:11 -0500 [thread overview]
Message-ID: <41E569E3.20206@RedHat.com> (raw)
In-Reply-To: <1105480745.11430.56.camel@lade.trondhjem.org>
[-- Attachment #1: Type: text/plain, Size: 532 bytes --]
Trond Myklebust wrote:
>Yes, but I'm not sure that it makes sense to mask off SIGKILL as that
>makes core dumping completely uninterruptible. People do expect "kill
>-9" to always work when the "intr" flag is set.
>
>
True... and it will continue to work...
>You should, however, mask off all other signals, including SIGINT and
>SIGQUIT. The latter two (+ sigkill) are the only ones that
>rpc_clnt_sigmask() does not currently mask out when "intr" is set.
>
>
Good point... that attached patch does just that....
steved
[-- Attachment #2: linux-2.4.28-nfs-dropcore2.patch --]
[-- Type: text/x-patch, Size: 4119 bytes --]
--- linux-2.4.28/fs/nfs/pagelist.c.orig 2005-01-12 12:37:13.100184000 -0500
+++ linux-2.4.28/fs/nfs/pagelist.c 2005-01-12 12:40:43.770864000 -0500
@@ -94,8 +94,13 @@ nfs_create_request(struct rpc_cred *cred
*/
if (nfs_try_to_free_pages(server))
continue;
- if (signalled() && (server->flags & NFS_MOUNT_INTR))
+
+ if (signalled() && (server->flags & NFS_MOUNT_INTR)) {
+ if (task_core_dumping())
+ printk(KERN_WARNING \
+ "NFS: Core Dump Aborted due to lack of resources\n");
return ERR_PTR(-ERESTARTSYS);
+ }
yield();
}
--- linux-2.4.28/fs/nfs/nfs3proc.c.orig 2005-01-12 12:37:13.110184000 -0500
+++ linux-2.4.28/fs/nfs/nfs3proc.c 2005-01-12 12:40:43.786864000 -0500
@@ -31,6 +31,9 @@ nfs3_rpc_wrapper(struct rpc_clnt *clnt,
set_current_state(TASK_INTERRUPTIBLE);
schedule_timeout(NFS_JUKEBOX_RETRY_TIME);
res = -ERESTARTSYS;
+ if (signalled() && task_core_dumping())
+ printk(KERN_WARNING \
+ "NFS: Core Dump Aborted due to lack of resources\n");
} while (!signalled());
rpc_clnt_sigunmask(clnt, &oldset);
return res;
--- linux-2.4.28/fs/exec.c.orig 2005-01-12 12:37:13.120184000 -0500
+++ linux-2.4.28/fs/exec.c 2005-01-12 12:40:43.798864000 -0500
@@ -1125,6 +1125,7 @@ int do_coredump(long signr, struct pt_re
if (current->rlim[RLIMIT_CORE].rlim_cur < binfmt->min_coredump)
goto fail;
+ current->flags |= PF_DUMPCORE;
format_corename(corename, core_pattern, signr);
file = filp_open(corename, O_CREAT | 2 | O_NOFOLLOW, 0600);
if (IS_ERR(file))
--- linux-2.4.28/include/linux/sunrpc/clnt.h.orig 2005-01-12 12:37:13.129184000 -0500
+++ linux-2.4.28/include/linux/sunrpc/clnt.h 2005-01-12 12:40:43.804865000 -0500
@@ -108,6 +108,8 @@ struct rpc_procinfo {
#ifdef __KERNEL__
+#define task_core_dumping() (current->flags & PF_DUMPCORE)
+
struct rpc_clnt *rpc_create_client(struct rpc_xprt *xprt, char *servname,
struct rpc_program *info,
u32 version, int authflavor);
--- linux-2.4.28/include/linux/nfs_fs.h.orig 2005-01-12 12:37:13.137184000 -0500
+++ linux-2.4.28/include/linux/nfs_fs.h 2005-01-12 12:40:43.823864000 -0500
@@ -345,7 +345,7 @@ extern void * nfs_root_data(void);
#define nfs_wait_event(clnt, wq, condition) \
({ \
int __retval = 0; \
- if (clnt->cl_intr) { \
+ if (clnt->cl_intr && !task_core_dumping()) { \
sigset_t oldmask; \
rpc_clnt_sigmask(clnt, &oldmask); \
__retval = wait_event_interruptible(wq, condition); \
--- linux-2.4.28/net/sunrpc/sched.c.orig 2005-01-12 12:37:13.145184000 -0500
+++ linux-2.4.28/net/sunrpc/sched.c 2005-01-12 12:40:43.834864000 -0500
@@ -498,7 +498,7 @@ __rpc_atrun(struct rpc_task *task)
static int
__rpc_execute(struct rpc_task *task)
{
- int status = 0;
+ int status = 0, core_retry = 0;
dprintk("RPC: %4d rpc_execute flgs %x\n",
task->tk_pid, task->tk_flags);
@@ -572,9 +572,20 @@ __rpc_execute(struct rpc_task *task)
* -ERESTARTSYS. In order to catch any callbacks that
* clean up after sleeping on some queue, we don't
* break the loop here, but go around once more.
- */
+ */
if (task->tk_client->cl_intr && signalled()) {
dprintk("RPC: %4d got signal\n", task->tk_pid);
+ /*
+ * If we are dropping a core and 'intr' is set,
+ * we want to make an attempted at writting
+ * out the core, but not get hung up in it.
+ */
+ if (task_core_dumping()) {
+ dprintk("RPC: %4d dropping core retries %d\n",
+ task->tk_pid, core_retry);
+ if (++core_retry < 3)
+ continue;
+ }
task->tk_flags |= RPC_TASK_KILLED;
rpc_exit(task, -ERESTARTSYS);
rpc_wake_up_task(task);
--- linux-2.4.28/net/sunrpc/clnt.c.orig 2003-11-28 13:26:21.000000000 -0500
+++ linux-2.4.28/net/sunrpc/clnt.c 2005-01-12 12:41:25.647200000 -0500
@@ -209,7 +209,7 @@ void rpc_clnt_sigmask(struct rpc_clnt *c
unsigned long irqflags;
/* Turn off various signals */
- if (clnt->cl_intr) {
+ if (clnt->cl_intr && !task_core_dumping()) {
struct k_sigaction *action = current->sig->action;
if (action[SIGINT-1].sa.sa_handler == SIG_DFL)
sigallow |= sigmask(SIGINT);
next prev parent reply other threads:[~2005-01-12 18:18 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-01-06 18:31 [PATCH] -o intr mount option prevents core dumps on 2.4 kernel Steve Dickson
2005-01-07 17:14 ` Trond Myklebust
2005-01-11 19:36 ` Steve Dickson
2005-01-11 20:10 ` Trond Myklebust
2005-01-11 20:58 ` Steve Dickson
2005-01-11 21:59 ` Trond Myklebust
2005-01-12 18:18 ` Steve Dickson [this message]
2005-01-12 18:25 ` Trond Myklebust
2005-01-12 19:11 ` Steve Dickson
2005-01-13 0:38 ` Trond Myklebust
2005-01-13 14:01 ` Steve Dickson
2005-01-13 21:37 ` Steve Dickson
2005-01-14 2:57 ` Trond Myklebust
2005-01-14 19:52 ` Steve Dickson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=41E569E3.20206@RedHat.com \
--to=steved@redhat.com \
--cc=nfs@lists.sourceforge.net \
--cc=trond.myklebust@fys.uio.no \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.