--- 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);