From: Steve Dickson <SteveD@redhat.com>
To: nfs@lists.sourceforge.net
Subject: [PATCH] -o intr mount option prevents core dumps on 2.4 kernel
Date: Thu, 06 Jan 2005 13:31:31 -0500 [thread overview]
Message-ID: <41DD8403.7030601@RedHat.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 1044 bytes --]
Here is a 2.4.28 patch that allows core dumps to be written on
fileystems mounted with the 'intr' option.
By setting the PF_DUMPCORE bit in the current->flags (via
do_coredump()), I was able to signal the RPC and NFS code that
the current task is trying to dump a core. So the trick was to have
the rpc code (temporarily) ignore the fact the task got signalled()
and let the write/commit path complete....
I do this by checking the PF_DUMPCORE bit in both __rpc_execute()
and nfs_wait_event(). One side effect is the dropping core process
becomes uninterruptable.... I combat this by only allowing the process
three retries before giving up...
Finally there are two placing in the NFS code where I don't ignore
the signal and do fail the writing of the core. One, is in
nfs_create_request()
when there are no available pages and in nfs3_rpc_wrapper() when
the server returns EJUKEBOX. But I did place printks so it will be clear
as to why it failed....
Comments... Suggestions... Crimes against humanity that I'm committing???
steved.
[-- Attachment #2: linux-2.4.28-nfs-dropcore.patch --]
[-- Type: text/x-patch, Size: 3642 bytes --]
--- linux-2.4.28/fs/nfs/pagelist.c.orig 2004-04-14 09:05:40.000000000 -0400
+++ linux-2.4.28/fs/nfs/pagelist.c 2005-01-06 12:27:21.053600000 -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 2003-11-28 13:26:21.000000000 -0500
+++ linux-2.4.28/fs/nfs/nfs3proc.c 2005-01-06 12:27:21.063600000 -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 2004-02-18 08:36:31.000000000 -0500
+++ linux-2.4.28/fs/exec.c 2005-01-06 12:27:21.082600000 -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 2002-11-28 18:53:15.000000000 -0500
+++ linux-2.4.28/include/linux/sunrpc/clnt.h 2005-01-06 12:35:12.701368000 -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 2004-04-14 09:05:40.000000000 -0400
+++ linux-2.4.28/include/linux/nfs_fs.h 2005-01-06 12:35:12.718369000 -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 2003-06-13 10:51:39.000000000 -0400
+++ linux-2.4.28/net/sunrpc/sched.c 2005-01-06 12:27:21.137600000 -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);
next reply other threads:[~2005-01-06 18:31 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-01-06 18:31 Steve Dickson [this message]
2005-01-07 17:14 ` [PATCH] -o intr mount option prevents core dumps on 2.4 kernel 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
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=41DD8403.7030601@RedHat.com \
--to=steved@redhat.com \
--cc=nfs@lists.sourceforge.net \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox