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 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.