---

 arch/parisc/kernel/sys_parisc.c |    8 ++------
 drivers/block/loop.c            |   11 ++++++-----
 fs/fcntl.c                      |    4 ++--
 fs/ioctl.c                      |    2 +-
 fs/locks.c                      |    4 ++--
 fs/open.c                       |    4 ++--
 kernel/fork.c                   |    4 ++--
 mm/fadvise.c                    |    4 +---
 mm/mmap.c                       |   18 ++++++++----------
 mm/swapfile.c                   |   24 ++++++++++++------------
 10 files changed, 38 insertions(+), 45 deletions(-)

diff -puN arch/parisc/kernel/sys_parisc.c~RD7-f_mapping3-mm arch/parisc/kernel/sys_parisc.c
--- 25/arch/parisc/kernel/sys_parisc.c~RD7-f_mapping3-mm	2004-01-07 21:24:52.000000000 -0800
+++ 25-akpm/arch/parisc/kernel/sys_parisc.c	2004-01-07 21:24:52.000000000 -0800
@@ -93,17 +93,13 @@ static unsigned long get_shared_area(str
 unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr,
 		unsigned long len, unsigned long pgoff, unsigned long flags)
 {
-	struct inode *inode;
-
 	if (len > TASK_SIZE)
 		return -ENOMEM;
 	if (!addr)
 		addr = TASK_UNMAPPED_BASE;
 
-	inode = filp ? filp->f_dentry->d_inode : NULL;
-
-	if (inode && (flags & MAP_SHARED)) {
-		addr = get_shared_area(inode->i_mapping, addr, len, pgoff);
+	if (filp && (flags & MAP_SHARED)) {
+		addr = get_shared_area(filp->f_mapping, addr, len, pgoff);
 	} else {
 		addr = get_unshared_area(addr, len);
 	}
diff -puN drivers/block/loop.c~RD7-f_mapping3-mm drivers/block/loop.c
--- 25/drivers/block/loop.c~RD7-f_mapping3-mm	2004-01-07 21:24:52.000000000 -0800
+++ 25-akpm/drivers/block/loop.c	2004-01-07 21:25:31.000000000 -0800
@@ -659,6 +659,7 @@ static int loop_set_fd(struct loop_devic
 	struct file	*file;
 	struct inode	*inode;
 	struct block_device *lo_device = NULL;
+	struct address_space *mapping;
 	unsigned lo_blocksize;
 	int		lo_flags = 0;
 	int		error;
@@ -675,7 +676,8 @@ static int loop_set_fd(struct loop_devic
 	if (!file)
 		goto out;
 
-	inode = file->f_dentry->d_inode;
+	mapping = file->f_mapping;
+	inode = mapping->host;
 
 	if (!(file->f_mode & FMODE_WRITE))
 		lo_flags |= LO_FLAGS_READ_ONLY;
@@ -690,7 +692,7 @@ static int loop_set_fd(struct loop_devic
 		if (bdev_read_only(lo_device))
 			lo_flags |= LO_FLAGS_READ_ONLY;
 	} else if (S_ISREG(inode->i_mode)) {
-		struct address_space_operations *aops = inode->i_mapping->a_ops;
+		struct address_space_operations *aops = mapping->a_ops;
 		/*
 		 * If we can't read - sorry. If we only can't write - well,
 		 * it's going to be read-only.
@@ -724,9 +726,8 @@ static int loop_set_fd(struct loop_devic
 		error = -EFBIG;
 		goto out_putf;
 	}
-	lo->old_gfp_mask = mapping_gfp_mask(inode->i_mapping);
-	mapping_set_gfp_mask(inode->i_mapping,
-			     lo->old_gfp_mask & ~(__GFP_IO|__GFP_FS));
+	lo->old_gfp_mask = mapping_gfp_mask(mapping);
+	mapping_set_gfp_mask(mapping, lo->old_gfp_mask & ~(__GFP_IO|__GFP_FS));
 
 	lo->lo_bio = lo->lo_biotail = NULL;
 
diff -puN fs/fcntl.c~RD7-f_mapping3-mm fs/fcntl.c
--- 25/fs/fcntl.c~RD7-f_mapping3-mm	2004-01-07 21:24:52.000000000 -0800
+++ 25-akpm/fs/fcntl.c	2004-01-07 21:24:52.000000000 -0800
@@ -229,8 +229,8 @@ static int setfl(int fd, struct file * f
 		   arg |= O_NONBLOCK;
 
 	if (arg & O_DIRECT) {
-		if (!inode->i_mapping || !inode->i_mapping->a_ops ||
-			!inode->i_mapping->a_ops->direct_IO)
+		if (!filp->f_mapping || !filp->f_mapping->a_ops ||
+			!filp->f_mapping->a_ops->direct_IO)
 				return -EINVAL;
 	}
 
diff -puN fs/ioctl.c~RD7-f_mapping3-mm fs/ioctl.c
--- 25/fs/ioctl.c~RD7-f_mapping3-mm	2004-01-07 21:24:52.000000000 -0800
+++ 25-akpm/fs/ioctl.c	2004-01-07 21:24:52.000000000 -0800
@@ -22,7 +22,7 @@ static int file_ioctl(struct file *filp,
 	switch (cmd) {
 		case FIBMAP:
 		{
-			struct address_space *mapping = inode->i_mapping;
+			struct address_space *mapping = filp->f_mapping;
 			int res;
 			/* do we support this mess? */
 			if (!mapping->a_ops->bmap)
diff -puN fs/locks.c~RD7-f_mapping3-mm fs/locks.c
--- 25/fs/locks.c~RD7-f_mapping3-mm	2004-01-07 21:24:52.000000000 -0800
+++ 25-akpm/fs/locks.c	2004-01-07 21:24:52.000000000 -0800
@@ -1454,7 +1454,7 @@ int fcntl_setlk(struct file *filp, unsig
 	 */
 	if (IS_MANDLOCK(inode) &&
 	    (inode->i_mode & (S_ISGID | S_IXGRP)) == S_ISGID) {
-		struct address_space *mapping = inode->i_mapping;
+		struct address_space *mapping = filp->f_mapping;
 
 		if (!list_empty(&mapping->i_mmap_shared)) {
 			error = -EAGAIN;
@@ -1592,7 +1592,7 @@ int fcntl_setlk64(struct file *filp, uns
 	 */
 	if (IS_MANDLOCK(inode) &&
 	    (inode->i_mode & (S_ISGID | S_IXGRP)) == S_ISGID) {
-		struct address_space *mapping = inode->i_mapping;
+		struct address_space *mapping = filp->f_mapping;
 
 		if (!list_empty(&mapping->i_mmap_shared)) {
 			error = -EAGAIN;
diff -puN fs/open.c~RD7-f_mapping3-mm fs/open.c
--- 25/fs/open.c~RD7-f_mapping3-mm	2004-01-07 21:24:52.000000000 -0800
+++ 25-akpm/fs/open.c	2004-01-07 21:24:52.000000000 -0800
@@ -793,8 +793,8 @@ struct file *dentry_open(struct dentry *
 
 	/* NB: we're sure to have correct a_ops only after f_op->open */
 	if (f->f_flags & O_DIRECT) {
-		if (!inode->i_mapping || !inode->i_mapping->a_ops ||
-			!inode->i_mapping->a_ops->direct_IO) {
+		if (!f->f_mapping || !f->f_mapping->a_ops ||
+			!f->f_mapping->a_ops->direct_IO) {
 				fput(f);
 				f = ERR_PTR(-EINVAL);
 		}
diff -puN kernel/fork.c~RD7-f_mapping3-mm kernel/fork.c
--- 25/kernel/fork.c~RD7-f_mapping3-mm	2004-01-07 21:24:52.000000000 -0800
+++ 25-akpm/kernel/fork.c	2004-01-07 21:24:52.000000000 -0800
@@ -316,9 +316,9 @@ static inline int dup_mmap(struct mm_str
 				atomic_dec(&inode->i_writecount);
       
 			/* insert tmp into the share list, just after mpnt */
-			down(&inode->i_mapping->i_shared_sem);
+			down(&file->f_mapping->i_shared_sem);
 			list_add_tail(&tmp->shared, &mpnt->shared);
-			up(&inode->i_mapping->i_shared_sem);
+			up(&file->f_mapping->i_shared_sem);
 		}
 
 		/*
diff -puN mm/fadvise.c~RD7-f_mapping3-mm mm/fadvise.c
--- 25/mm/fadvise.c~RD7-f_mapping3-mm	2004-01-07 21:24:52.000000000 -0800
+++ 25-akpm/mm/fadvise.c	2004-01-07 21:24:52.000000000 -0800
@@ -23,7 +23,6 @@
 asmlinkage long sys_fadvise64_64(int fd, loff_t offset, loff_t len, int advice)
 {
 	struct file *file = fget(fd);
-	struct inode *inode;
 	struct address_space *mapping;
 	struct backing_dev_info *bdi;
 	pgoff_t start_index;
@@ -33,8 +32,7 @@ asmlinkage long sys_fadvise64_64(int fd,
 	if (!file)
 		return -EBADF;
 
-	inode = file->f_dentry->d_inode;
-	mapping = inode->i_mapping;
+	mapping = file->f_mapping;
 	if (!mapping) {
 		ret = -EINVAL;
 		goto out;
diff -puN mm/mmap.c~RD7-f_mapping3-mm mm/mmap.c
--- 25/mm/mmap.c~RD7-f_mapping3-mm	2004-01-07 21:24:52.000000000 -0800
+++ 25-akpm/mm/mmap.c	2004-01-07 21:24:52.000000000 -0800
@@ -80,11 +80,10 @@ static void remove_shared_vm_struct(stru
 	struct file *file = vma->vm_file;
 
 	if (file) {
-		struct inode *inode = file->f_dentry->d_inode;
-
-		down(&inode->i_mapping->i_shared_sem);
-		__remove_shared_vm_struct(vma, inode);
-		up(&inode->i_mapping->i_shared_sem);
+		struct address_space *mapping = file->f_mapping;
+		down(&mapping->i_shared_sem);
+		__remove_shared_vm_struct(vma, file->f_dentry->d_inode);
+		up(&mapping->i_shared_sem);
 	}
 }
 
@@ -235,11 +234,10 @@ static inline void __vma_link_file(struc
 
 	file = vma->vm_file;
 	if (file) {
-		struct inode * inode = file->f_dentry->d_inode;
-		struct address_space *mapping = inode->i_mapping;
+		struct address_space *mapping = file->f_mapping;
 
 		if (vma->vm_flags & VM_DENYWRITE)
-			atomic_dec(&inode->i_writecount);
+			atomic_dec(&file->f_dentry->d_inode->i_writecount);
 
 		if (vma->vm_flags & VM_SHARED)
 			list_add_tail(&vma->shared, &mapping->i_mmap_shared);
@@ -383,7 +381,7 @@ static int vma_merge(struct mm_struct *m
 	if (vm_flags & VM_SPECIAL)
 		return 0;
 
-	i_shared_sem = file ? &inode->i_mapping->i_shared_sem : NULL;
+	i_shared_sem = file ? &file->f_mapping->i_shared_sem : NULL;
 
 	if (!prev) {
 		prev = rb_entry(rb_parent, struct vm_area_struct, vm_rb);
@@ -1207,7 +1205,7 @@ int split_vma(struct mm_struct * mm, str
 		new->vm_ops->open(new);
 
 	if (vma->vm_file)
-		 mapping = vma->vm_file->f_dentry->d_inode->i_mapping;
+		 mapping = vma->vm_file->f_mapping;
 
 	if (mapping)
 		down(&mapping->i_shared_sem);
diff -puN mm/swapfile.c~RD7-f_mapping3-mm mm/swapfile.c
--- 25/mm/swapfile.c~RD7-f_mapping3-mm	2004-01-07 21:24:52.000000000 -0800
+++ 25-akpm/mm/swapfile.c	2004-01-07 21:24:52.000000000 -0800
@@ -912,7 +912,7 @@ static int setup_swap_extents(struct swa
 	sector_t last_block;
 	int ret;
 
-	inode = sis->swap_file->f_dentry->d_inode;
+	inode = sis->swap_file->f_mapping->host;
 	if (S_ISBLK(inode->i_mode)) {
 		ret = add_swap_extent(sis, 0, sis->max, 0);
 		goto done;
@@ -1099,13 +1099,13 @@ asmlinkage long sys_swapoff(const char _
 	swap_device_unlock(p);
 	swap_list_unlock();
 	vfree(swap_map);
-	if (S_ISBLK(swap_file->f_dentry->d_inode->i_mode)) {
+	if (S_ISBLK(mapping->host->i_mode)) {
 		struct block_device *bdev;
-		bdev = swap_file->f_dentry->d_inode->i_bdev;
+		bdev = mapping->host->i_bdev;
 		set_blocksize(bdev, p->old_block_size);
 		bd_release(bdev);
 	} else {
-		up(&swap_file->f_mapping->host->i_sem);
+		up(&mapping->host->i_sem);
 	}
 	filp_close(swap_file, NULL);
 	err = 0;
@@ -1231,8 +1231,8 @@ asmlinkage long sys_swapon(const char __
 	int swapfilesize;
 	unsigned short *swap_map;
 	struct page *page = NULL;
-	struct inode *inode;
-	struct inode *downed_inode = NULL;
+	struct inode *inode = NULL;
+	int did_down = 0;
 
 	if (!capable(CAP_SYS_ADMIN))
 		return -EPERM;
@@ -1279,8 +1279,8 @@ asmlinkage long sys_swapon(const char __
 	}
 
 	p->swap_file = swap_file;
-	inode = swap_file->f_dentry->d_inode;
 	mapping = swap_file->f_mapping;
+	inode = mapping->host;
 
 	error = -EBUSY;
 	for (i = 0; i < nr_swapfiles; i++) {
@@ -1307,13 +1307,13 @@ asmlinkage long sys_swapon(const char __
 		p->bdev = bdev;
 	} else if (S_ISREG(inode->i_mode)) {
 		p->bdev = inode->i_sb->s_bdev;
-		downed_inode = mapping->host;
-		down(&downed_inode->i_sem);
+		down(&inode->i_sem);
+		did_down = 1;
 	} else {
 		goto bad_swap;
 	}
 
-	swapfilesize = i_size_read(mapping->host) >> PAGE_SHIFT;
+	swapfilesize = i_size_read(inode) >> PAGE_SHIFT;
 
 	/*
 	 * Read the swap header.
@@ -1465,8 +1465,8 @@ out:
 	}
 	if (name)
 		putname(name);
-	if (error && downed_inode)
-		up(&downed_inode->i_sem);
+	if (error && did_down)
+		up(&inode->i_sem);
 	return error;
 }
 

_