summaryrefslogtreecommitdiffstats
path: root/fs/binfmt_elf.c
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>1999-06-13 16:29:25 +0000
committerRalf Baechle <ralf@linux-mips.org>1999-06-13 16:29:25 +0000
commitdb7d4daea91e105e3859cf461d7e53b9b77454b2 (patch)
tree9bb65b95440af09e8aca63abe56970dd3360cc57 /fs/binfmt_elf.c
parent9c1c01ead627bdda9211c9abd5b758d6c687d8ac (diff)
Merge with Linux 2.2.8.
Diffstat (limited to 'fs/binfmt_elf.c')
-rw-r--r--fs/binfmt_elf.c46
1 files changed, 23 insertions, 23 deletions
diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c
index 8be2fc475..82f75d1e6 100644
--- a/fs/binfmt_elf.c
+++ b/fs/binfmt_elf.c
@@ -927,7 +927,11 @@ static int load_elf_library(int fd)
*/
static int dump_write(struct file *file, const void *addr, int nr)
{
- return file->f_op->write(file, addr, nr, &file->f_pos) == nr;
+ int r;
+ down(&file->f_dentry->d_inode->i_sem);
+ r = file->f_op->write(file, addr, nr, &file->f_pos) == nr;
+ up(&file->f_dentry->d_inode->i_sem);
+ return r;
}
static int dump_seek(struct file *file, off_t off)
@@ -1032,10 +1036,10 @@ static int writenote(struct memelfnote *men, struct file *file)
#undef DUMP_SEEK
#define DUMP_WRITE(addr, nr) \
- if (!dump_write(&file, (addr), (nr))) \
+ if (!dump_write(file, (addr), (nr))) \
goto close_coredump;
#define DUMP_SEEK(off) \
- if (!dump_seek(&file, (off))) \
+ if (!dump_seek(file, (off))) \
goto close_coredump;
/*
* Actual dumper
@@ -1047,7 +1051,7 @@ static int writenote(struct memelfnote *men, struct file *file)
static int elf_core_dump(long signr, struct pt_regs * regs)
{
int has_dumped = 0;
- struct file file;
+ struct file *file;
struct dentry *dentry;
struct inode *inode;
mm_segment_t fs;
@@ -1118,30 +1122,28 @@ static int elf_core_dump(long signr, struct pt_regs * regs)
fs = get_fs();
set_fs(KERNEL_DS);
+
memcpy(corefile,"core.",5);
#if 0
memcpy(corefile+5,current->comm,sizeof(current->comm));
#else
corefile[4] = '\0';
#endif
- dentry = open_namei(corefile, O_CREAT | 2 | O_TRUNC | O_NOFOLLOW, 0600);
- if (IS_ERR(dentry)) {
- dentry = NULL;
+ file = filp_open(corefile, O_CREAT | 2 | O_TRUNC | O_NOFOLLOW, 0600);
+ if (IS_ERR(file))
goto end_coredump;
- }
+ dentry = file->f_dentry;
inode = dentry->d_inode;
-
- if(inode->i_nlink > 1)
- goto end_coredump; /* multiple links - don't dump */
+ if (inode->i_nlink > 1)
+ goto close_coredump; /* multiple links - don't dump */
if (!S_ISREG(inode->i_mode))
- goto end_coredump;
+ goto close_coredump;
if (!inode->i_op || !inode->i_op->default_file_ops)
- goto end_coredump;
- if (init_private_file(&file, dentry, 3))
- goto end_coredump;
- if (!file.f_op->write)
goto close_coredump;
+ if (!file->f_op->write)
+ goto close_coredump;
+
has_dumped = 1;
current->flags |= PF_DUMPCORE;
@@ -1297,7 +1299,7 @@ static int elf_core_dump(long signr, struct pt_regs * regs)
}
for(i = 0; i < numnote; i++)
- if (!writenote(&notes[i], &file))
+ if (!writenote(&notes[i], file))
goto close_coredump;
set_fs(fs);
@@ -1319,19 +1321,17 @@ static int elf_core_dump(long signr, struct pt_regs * regs)
DUMP_WRITE((void *)addr, len);
}
- if ((off_t) file.f_pos != offset) {
+ if ((off_t) file->f_pos != offset) {
/* Sanity check */
- printk("elf_core_dump: file.f_pos (%ld) != offset (%ld)\n",
- (off_t) file.f_pos, offset);
+ printk("elf_core_dump: file->f_pos (%ld) != offset (%ld)\n",
+ (off_t) file->f_pos, offset);
}
close_coredump:
- if (file.f_op->release)
- file.f_op->release(inode,&file);
+ filp_close(file, NULL);
end_coredump:
set_fs(fs);
- dput(dentry);
#ifndef CONFIG_BINFMT_ELF
MOD_DEC_USE_COUNT;
#endif