From 13e551b96ff12276fdb06d68770fa9b9a764dac6 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Fri, 23 Nov 2007 15:13:31 -0500 Subject: [PATCH] Import 2.1.45pre6 --- arch/alpha/mm/fault.c | 9 +- arch/i386/kernel/process.c | 2 +- arch/i386/mm/fault.c | 2 +- drivers/block/loop.c | 2 +- drivers/block/rd.c | 19 ++-- drivers/scsi/sg.c | 2 +- drivers/sound/soundcard.c | 5 +- fs/autofs/inode.c | 2 +- fs/autofs/waitq.c | 4 +- fs/binfmt_elf.c | 3 +- fs/binfmt_java.c | 40 ++++---- fs/binfmt_misc.c | 14 ++- fs/dcache.c | 2 +- fs/devices.c | 4 +- fs/inode.c | 3 +- fs/namei.c | 107 ++++++++++----------- fs/pipe.c | 2 +- fs/super.c | 184 +++++++++++++++++-------------------- 18 files changed, 198 insertions(+), 208 deletions(-) diff --git a/arch/alpha/mm/fault.c b/arch/alpha/mm/fault.c index 891dc5ff8905..72d4224f7ec1 100644 --- a/arch/alpha/mm/fault.c +++ b/arch/alpha/mm/fault.c @@ -67,8 +67,7 @@ asmlinkage void do_page_fault(unsigned long address, unsigned long mmcsr, long cause, struct pt_regs *regs) { struct vm_area_struct * vma; - struct task_struct *tsk = current; - struct mm_struct *mm = tsk->mm; + struct mm_struct *mm = current->mm; unsigned fixup; down(&mm->mmap_sem); @@ -97,7 +96,7 @@ good_area: if (!(vma->vm_flags & VM_WRITE)) goto bad_area; } - handle_mm_fault(tsk, vma, address, cause > 0); + handle_mm_fault(current, vma, address, cause > 0); up(&mm->mmap_sem); return; @@ -109,7 +108,7 @@ bad_area: up(&mm->mmap_sem); if (user_mode(regs)) { - force_sig(SIGSEGV, tsk); + force_sig(SIGSEGV, current); return; } @@ -117,7 +116,7 @@ bad_area: if ((fixup = search_exception_table(regs->pc)) != 0) { unsigned long newpc; newpc = fixup_exception(dpf_reg, fixup, regs->pc); - printk("Taking exception at [<%lx>] (%lx)\n", regs->pc, newpc); + printk("%s: Exception at [<%lx>] (%lx)\n", current->comm, regs->pc, newpc); regs->pc = newpc; return; } diff --git a/arch/i386/kernel/process.c b/arch/i386/kernel/process.c index eec1ba62ee0d..a8fe0315bd35 100644 --- a/arch/i386/kernel/process.c +++ b/arch/i386/kernel/process.c @@ -625,7 +625,7 @@ asmlinkage int sys_execve(struct pt_regs regs) lock_kernel(); filename = getname((char *) regs.ebx); error = PTR_ERR(filename); - if (IS_ERR(filename) + if (IS_ERR(filename)) goto out; error = do_execve(filename, (char **) regs.ecx, (char **) regs.edx, ®s); putname(filename); diff --git a/arch/i386/mm/fault.c b/arch/i386/mm/fault.c index d0b2d58fed0c..e4847c0701b4 100644 --- a/arch/i386/mm/fault.c +++ b/arch/i386/mm/fault.c @@ -173,7 +173,7 @@ bad_area: /* Are we prepared to handle this kernel fault? */ if ((fixup = search_exception_table(regs->eip)) != 0) { printk(KERN_DEBUG "%s: Exception at [<%lx>] (%lx)\n", - current->comm, + tsk->comm, regs->eip, fixup); regs->eip = fixup; diff --git a/drivers/block/loop.c b/drivers/block/loop.c index 53fef9b744f2..025dc0df4331 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -292,7 +292,7 @@ static int loop_set_fd(struct loop_device *lo, kdev_t dev, unsigned int arg) return -EBADF; if (lo->lo_inode) return -EBUSY; - inode = file->f_inode; + inode = file->f_dentry->d_inode; if (!inode) { printk("loop_set_fd: NULL inode?!?\n"); return -EINVAL; diff --git a/drivers/block/rd.c b/drivers/block/rd.c index fea666f7cfb3..7d7a3931ca8b 100644 --- a/drivers/block/rd.c +++ b/drivers/block/rd.c @@ -444,8 +444,9 @@ done: */ __initfunc(static void rd_load_image(kdev_t device,int offset)) { - struct inode inode, out_inode; + struct inode inode, out_inode; struct file infile, outfile; + struct dentry in_dentry, out_dentry; unsigned short fs; kdev_t ram_device; int nblocks, i; @@ -457,15 +458,19 @@ __initfunc(static void rd_load_image(kdev_t device,int offset)) memset(&infile, 0, sizeof(infile)); memset(&inode, 0, sizeof(inode)); + memset(&in_dentry, 0, sizeof(in_dentry)); inode.i_rdev = device; infile.f_mode = 1; /* read only */ - infile.f_inode = &inode; + infile.f_dentry = &in_dentry; + in_dentry.d_inode = &inode; memset(&outfile, 0, sizeof(outfile)); memset(&out_inode, 0, sizeof(out_inode)); + memset(&out_dentry, 0, sizeof(out_dentry)); out_inode.i_rdev = ram_device; outfile.f_mode = 3; /* read/write */ - outfile.f_inode = &out_inode; + outfile.f_dentry = &out_dentry; + out_dentry.d_inode = &out_inode; if (blkdev_open(&inode, &infile) != 0) return; if (blkdev_open(&out_inode, &outfile) != 0) return; @@ -506,9 +511,9 @@ __initfunc(static void rd_load_image(kdev_t device,int offset)) printk(KERN_NOTICE "RAMDISK: Loading %d blocks into ram disk... ", nblocks); for (i=0; i < nblocks; i++) { - infile.f_op->read(infile.f_inode, &infile, buf, + infile.f_op->read(infile.f_dentry->d_inode, &infile, buf, BLOCK_SIZE); - outfile.f_op->write(outfile.f_inode, &outfile, buf, + outfile.f_op->write(outfile.f_dentry->d_inode, &outfile, buf, BLOCK_SIZE); if (!(i % 16)) { printk("%c\b", rotator[rotate & 0x3]); @@ -637,7 +642,7 @@ __initfunc(static int fill_inbuf(void)) { if (exit_code) return -1; - insize = crd_infp->f_op->read(crd_infp->f_inode, crd_infp, + insize = crd_infp->f_op->read(crd_infp->f_dentry->d_inode, crd_infp, inbuf, INBUFSIZ); if (insize == 0) return -1; @@ -656,7 +661,7 @@ __initfunc(static void flush_window(void)) unsigned n; uch *in, ch; - crd_outfp->f_op->write(crd_outfp->f_inode, crd_outfp, window, + crd_outfp->f_op->write(crd_outfp->f_dentry->d_inode, crd_outfp, window, outcnt); in = window; for (n = 0; n < outcnt; n++) { diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c index eb9e7fec33ff..d83b94e26aa3 100644 --- a/drivers/scsi/sg.c +++ b/drivers/scsi/sg.c @@ -488,7 +488,7 @@ static long sg_write(struct inode *inode,struct file *filp,const char *buf,unsig static unsigned int sg_poll(struct file *file, poll_table * wait) { - int dev = MINOR(file->f_inode->i_rdev); + int dev = MINOR(file->f_dentry->d_inode->i_rdev); struct scsi_generic *device = &scsi_generics[dev]; unsigned int mask = 0; diff --git a/drivers/sound/soundcard.c b/drivers/sound/soundcard.c index 957150f7bb84..a9af5956bdbe 100644 --- a/drivers/sound/soundcard.c +++ b/drivers/sound/soundcard.c @@ -246,7 +246,7 @@ sound_poll (struct file *file, poll_table * wait) struct inode *inode; int ret = 0; - inode = file->f_inode; + inode = file->f_dentry->d_inode; if (sound_select (inode, file, SEL_IN, wait)) ret |= POLLIN; @@ -326,8 +326,7 @@ sound_mmap (struct inode *inode, struct file *file, struct vm_area_struct *vma) vma->vm_page_prot)) return -EAGAIN; - vma->vm_inode = inode; - atomic_inc(&inode->i_count); + vma->vm_dentry = dget(file->f_dentry); dmap->mapping_flags |= DMA_MAP_MAPPED; diff --git a/fs/autofs/inode.c b/fs/autofs/inode.c index f7c8977c5e23..58997a0610bd 100644 --- a/fs/autofs/inode.c +++ b/fs/autofs/inode.c @@ -194,7 +194,7 @@ struct super_block *autofs_read_super(struct super_block *s, void *data, sbi->pipe = fget(pipefd); if ( !sbi->pipe || !sbi->pipe->f_op || !sbi->pipe->f_op->write ) { if ( sbi->pipe ) { - fput(sbi->pipe, sbi->pipe->f_inode); + fput(sbi->pipe); printk("autofs: pipe file descriptor does not contain proper ops\n"); } else { printk("autofs: could not open pipe file descriptor\n"); diff --git a/fs/autofs/waitq.c b/fs/autofs/waitq.c index ec222d61cd2a..39beed699f59 100644 --- a/fs/autofs/waitq.c +++ b/fs/autofs/waitq.c @@ -37,7 +37,7 @@ void autofs_catatonic_mode(struct autofs_sb_info *sbi) wake_up(&wq->queue); wq = nwq; } - fput(sbi->pipe, sbi->pipe->f_inode); /* Close the pipe */ + fput(sbi->pipe); /* Close the pipe */ } static int autofs_write(struct file *file, const void *addr, int bytes) @@ -55,7 +55,7 @@ static int autofs_write(struct file *file, const void *addr, int bytes) old_signal = current->signal; - while ( bytes && (written = file->f_op->write(file->f_inode,file,data,bytes)) > 0 ) { + while ( bytes && (written = file->f_op->write(file->f_dentry->d_inode,file,data,bytes)) > 0 ) { data += written; bytes -= written; } diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c index e85c286f32b7..b3f86ff393ab 100644 --- a/fs/binfmt_elf.c +++ b/fs/binfmt_elf.c @@ -678,8 +678,7 @@ do_load_elf_binary(struct linux_binprm * bprm, struct pt_regs * regs) __MOD_INC_USE_COUNT(current->binfmt->module); #ifndef VM_STACK_FLAGS - current->executable = bprm->dentry; - atomic_inc(&bprm->dentry->i_count); + current->executable = dget(bprm->dentry); #endif #ifdef LOW_ELF_STACK current->start_stack = bprm->p = elf_stack - 4; diff --git a/fs/binfmt_java.c b/fs/binfmt_java.c index 4f995b0d12d7..41e66a21a285 100644 --- a/fs/binfmt_java.c +++ b/fs/binfmt_java.c @@ -28,7 +28,9 @@ static int do_load_java(struct linux_binprm *bprm,struct pt_regs *regs) char *i_name; int len; int retval; + struct dentry * dentry; unsigned char *ucp = (unsigned char *) bprm->buf; + if ((ucp[0] != 0xca) || (ucp[1] != 0xfe) || (ucp[2] != 0xba) || (ucp[3] != 0xbe)) return -ENOEXEC; @@ -42,8 +44,8 @@ static int do_load_java(struct linux_binprm *bprm,struct pt_regs *regs) bprm->java = 1; - iput(bprm->inode); - bprm->dont_iput=1; + dput(bprm->dentry); + bprm->dentry = NULL; /* * Set args: [0] the name of the java interpreter @@ -75,15 +77,17 @@ static int do_load_java(struct linux_binprm *bprm,struct pt_regs *regs) if (!bprm->p) return -E2BIG; /* - * OK, now restart the process with the interpreter's inode. + * OK, now restart the process with the interpreter's dentry. */ bprm->filename = binfmt_java_interpreter; - retval = open_namei(binfmt_java_interpreter, 0, 0, &bprm->inode); - if (retval) + dentry = open_namei(binfmt_java_interpreter, 0, 0); + retval = PTR_ERR(dentry); + if (IS_ERR(dentry)) return retval; - bprm->dont_iput=0; - retval=prepare_binprm(bprm); - if(retval<0) + + bprm->dentry = dentry; + retval = prepare_binprm(bprm); + if (retval < 0) return retval; return search_binary_handler(bprm,regs); @@ -92,12 +96,14 @@ static int do_load_java(struct linux_binprm *bprm,struct pt_regs *regs) static int do_load_applet(struct linux_binprm *bprm,struct pt_regs *regs) { char *i_name; + struct dentry * dentry; int retval; + if (strncmp (bprm->buf, "