To: Linus Torvalds <torvalds@transmeta.com>
Subject: [Patch] interuptible core dumps
From: Christoph Rohland <hans-christoph.rohland@sap.com>
Date: 26 Apr 2000 19:29:30 +0200
--=-=-=
Hi Linus,
This patch against 2.3.99-pre6-6 makes core dumping interuptible with
SIGKILL. This makes netscape over NFS home directories much easier to
use ;-)
Greetings
Christoph
--
--=-=-=
Content-Disposition: attachment; filename=patch-core_intr
diff -uNr pre6-6patched/fs/binfmt_elf.c c6/fs/binfmt_elf.c
--- pre6-6patched/fs/binfmt_elf.c Tue Apr 25 13:43:05 2000
+++ c6/fs/binfmt_elf.c Wed Apr 26 19:21:20 2000
@@ -991,6 +991,7 @@
struct elf_prstatus prstatus; /* NT_PRSTATUS */
elf_fpregset_t fpu; /* NT_PRFPREG */
struct elf_prpsinfo psinfo; /* NT_PRPSINFO */
+ sigset_t save_set;
segs = current->mm->map_count;
@@ -998,6 +999,10 @@
printk("elf_core_dump: %d segs %lu limit\n", segs, limit);
#endif
+ spin_lock_irq(¤t->sigmask_lock);
+ save_set = current->blocked;
+ spin_unlock_irq(¤t->sigmask_lock);
+
/* Set up header */
memcpy(elf.e_ident, ELFMAG, SELFMAG);
elf.e_ident[EI_CLASS] = ELF_CLASS;
@@ -1181,6 +1186,12 @@
DUMP_SEEK(dataoff);
+ /* Only allow SIGKILL */
+ spin_lock_irq(¤t->sigmask_lock);
+ sigfillset(¤t->blocked);
+ sigdelsetmask(¤t->blocked, sigmask(SIGKILL));
+ spin_unlock_irq(¤t->sigmask_lock);
+
for(vma = current->mm->mmap; vma != NULL; vma = vma->vm_next) {
unsigned long addr;
@@ -1208,6 +1219,8 @@
pte_none(*pte)) {
DUMP_SEEK (file->f_pos + PAGE_SIZE);
} else {
+ if (signal_pending(current))
+ goto end_coredump;
DUMP_WRITE((void*)addr, PAGE_SIZE);
}
}
@@ -1220,6 +1233,9 @@
}
end_coredump:
+ spin_lock_irq(¤t->sigmask_lock);
+ current->blocked = save_set;
+ spin_unlock_irq(¤t->sigmask_lock);
set_fs(fs);
return has_dumped;
}
--=-=-=--
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/