All of lore.kernel.org
 help / color / mirror / Atom feed
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);

             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.