drivers/block/ioctl.c |    3 --
 drivers/block/loop.c  |    2 -
 fs/block_dev.c        |   65 ++++++++++++++++++++++++++++----------------------
 fs/reiserfs/journal.c |    9 +-----
 include/linux/fs.h    |    5 ++-
 mm/filemap.c          |    2 -
 mm/swapfile.c         |    7 ++---
 7 files changed, 48 insertions(+), 45 deletions(-)

diff -puN drivers/block/ioctl.c~RD15-I_BDEV-B6 drivers/block/ioctl.c
--- 25/drivers/block/ioctl.c~RD15-I_BDEV-B6	2003-10-02 01:36:12.000000000 -0700
+++ 25-akpm/drivers/block/ioctl.c	2003-10-02 01:36:12.000000000 -0700
@@ -132,10 +132,9 @@ static int put_u64(unsigned long arg, u6
 	return put_user(val, (u64 *)arg);
 }
 
-int blkdev_ioctl(struct inode *inode, struct file *file, unsigned cmd,
+int blkdev_ioctl(struct block_device *bdev, struct file *file, unsigned cmd,
 			unsigned long arg)
 {
-	struct block_device *bdev = inode->i_bdev;
 	struct gendisk *disk = bdev->bd_disk;
 	struct backing_dev_info *bdi;
 	int holder;
diff -puN drivers/block/loop.c~RD15-I_BDEV-B6 drivers/block/loop.c
--- 25/drivers/block/loop.c~RD15-I_BDEV-B6	2003-10-02 01:36:12.000000000 -0700
+++ 25-akpm/drivers/block/loop.c	2003-10-02 01:36:12.000000000 -0700
@@ -685,7 +685,7 @@ static int loop_set_fd(struct loop_devic
 	error = -EINVAL;
 
 	if (S_ISBLK(inode->i_mode)) {
-		lo_device = inode->i_bdev;
+		lo_device = I_BDEV(inode);
 		if (lo_device == bdev) {
 			error = -EBUSY;
 			goto out;
diff -puN fs/block_dev.c~RD15-I_BDEV-B6 fs/block_dev.c
--- 25/fs/block_dev.c~RD15-I_BDEV-B6	2003-10-02 01:36:12.000000000 -0700
+++ 25-akpm/fs/block_dev.c	2003-10-02 01:36:12.000000000 -0700
@@ -25,6 +25,22 @@
 #include <linux/namei.h>
 #include <asm/uaccess.h>
 
+struct bdev_inode {
+	struct block_device bdev;
+	struct inode vfs_inode;
+};
+
+static inline struct bdev_inode *BDEV_I(struct inode *inode)
+{
+	return container_of(inode, struct bdev_inode, vfs_inode);
+}
+
+inline struct block_device *I_BDEV(struct inode *inode)
+{
+	return &BDEV_I(inode)->bdev;
+}
+
+EXPORT_SYMBOL(I_BDEV);
 
 static sector_t max_block(struct block_device *bdev)
 {
@@ -100,10 +116,10 @@ static int
 blkdev_get_block(struct inode *inode, sector_t iblock,
 		struct buffer_head *bh, int create)
 {
-	if (iblock >= max_block(inode->i_bdev))
+	if (iblock >= max_block(I_BDEV(inode)))
 		return -EIO;
 
-	bh->b_bdev = inode->i_bdev;
+	bh->b_bdev = I_BDEV(inode);
 	bh->b_blocknr = iblock;
 	set_buffer_mapped(bh);
 	return 0;
@@ -113,10 +129,10 @@ static int
 blkdev_get_blocks(struct inode *inode, sector_t iblock,
 		unsigned long max_blocks, struct buffer_head *bh, int create)
 {
-	if ((iblock + max_blocks) > max_block(inode->i_bdev))
+	if ((iblock + max_blocks) > max_block(I_BDEV(inode)))
 		return -EIO;
 
-	bh->b_bdev = inode->i_bdev;
+	bh->b_bdev = I_BDEV(inode);
 	bh->b_blocknr = iblock;
 	bh->b_size = max_blocks << inode->i_blkbits;
 	set_buffer_mapped(bh);
@@ -130,7 +146,7 @@ blkdev_direct_IO(int rw, struct kiocb *i
 	struct file *file = iocb->ki_filp;
 	struct inode *inode = file->f_mapping->host;
 
-	return blockdev_direct_IO(rw, iocb, inode, inode->i_bdev, iov, offset,
+	return blockdev_direct_IO(rw, iocb, inode, I_BDEV(inode), iov, offset,
 				nr_segs, blkdev_get_blocks, NULL);
 }
 
@@ -161,11 +177,10 @@ static int blkdev_commit_write(struct fi
  */
 static loff_t block_llseek(struct file *file, loff_t offset, int origin)
 {
-	struct inode *bd_inode;
+	struct inode *bd_inode = file->f_mapping->host;
 	loff_t size;
 	loff_t retval;
 
-	bd_inode = file->f_dentry->d_inode->i_bdev->bd_inode;
 	down(&bd_inode->i_sem);
 	size = i_size_read(bd_inode);
 
@@ -188,15 +203,13 @@ static loff_t block_llseek(struct file *
 }
 	
 /*
- *	Filp may be NULL when we are called by an msync of a vma
- *	since the vma has no handle.
+ *	Filp is never NULL; the only case when ->fsync() is called with
+ *	NULL first argument is nfsd_sync_dir() and that's not a directory.
  */
  
 static int block_fsync(struct file *filp, struct dentry *dentry, int datasync)
 {
-	struct inode * inode = dentry->d_inode;
-
-	return sync_blockdev(inode->i_bdev);
+	return sync_blockdev(I_BDEV(filp->f_mapping->host));
 }
 
 /*
@@ -206,16 +219,6 @@ static int block_fsync(struct file *filp
 static spinlock_t bdev_lock __cacheline_aligned_in_smp = SPIN_LOCK_UNLOCKED;
 static kmem_cache_t * bdev_cachep;
 
-struct bdev_inode {
-	struct block_device bdev;
-	struct inode vfs_inode;
-};
-
-static inline struct bdev_inode *BDEV_I(struct inode *inode)
-{
-	return container_of(inode, struct bdev_inode, vfs_inode);
-}
-
 static struct inode *bdev_alloc_inode(struct super_block *sb)
 {
 	struct bdev_inode *ei = kmem_cache_alloc(bdev_cachep, SLAB_KERNEL);
@@ -734,11 +737,12 @@ int blkdev_put(struct block_device *bdev
 
 EXPORT_SYMBOL(blkdev_put);
 
-int blkdev_close(struct inode * inode, struct file * filp)
+static int blkdev_close(struct inode * inode, struct file * filp)
 {
-	if (inode->i_bdev->bd_holder == filp)
-		bd_release(inode->i_bdev);
-	return blkdev_put(inode->i_bdev, BDEV_FILE);
+	struct block_device *bdev = I_BDEV(filp->f_mapping->host);
+	if (bdev->bd_holder == filp)
+		bd_release(bdev);
+	return blkdev_put(bdev, BDEV_FILE);
 }
 
 static ssize_t blkdev_file_write(struct file *file, const char __user *buf,
@@ -757,6 +761,11 @@ static ssize_t blkdev_file_aio_write(str
 	return generic_file_aio_write_nolock(iocb, &local_iov, 1, &iocb->ki_pos);
 }
 
+static int block_ioctl(struct inode *inode, struct file *file, unsigned cmd,
+			unsigned long arg)
+{
+	return blkdev_ioctl(I_BDEV(file->f_mapping->host), file, cmd, arg);
+}
 
 struct address_space_operations def_blk_aops = {
 	.readpage	= blkdev_readpage,
@@ -778,7 +787,7 @@ struct file_operations def_blk_fops = {
   	.aio_write	= blkdev_file_aio_write, 
 	.mmap		= generic_file_mmap,
 	.fsync		= block_fsync,
-	.ioctl		= blkdev_ioctl,
+	.ioctl		= block_ioctl,
 	.readv		= generic_file_readv,
 	.writev		= generic_file_writev,
 	.sendfile	= generic_file_sendfile,
@@ -791,7 +800,7 @@ int ioctl_by_bdev(struct block_device *b
 	int res;
 	mm_segment_t old_fs = get_fs();
 	set_fs(KERNEL_DS);
-	res = blkdev_ioctl(bdev->bd_inode, NULL, cmd, arg);
+	res = blkdev_ioctl(bdev, NULL, cmd, arg);
 	set_fs(old_fs);
 	return res;
 }
diff -puN fs/reiserfs/journal.c~RD15-I_BDEV-B6 fs/reiserfs/journal.c
--- 25/fs/reiserfs/journal.c~RD15-I_BDEV-B6	2003-10-02 01:36:12.000000000 -0700
+++ 25-akpm/fs/reiserfs/journal.c	2003-10-02 01:36:12.000000000 -0700
@@ -1937,18 +1937,13 @@ static int journal_init_dev( struct supe
 
 	journal -> j_dev_file = filp_open( jdev_name, 0, 0 );
 	if( !IS_ERR( journal -> j_dev_file ) ) {
-		struct inode *jdev_inode;
-
-		jdev_inode = journal -> j_dev_file -> f_dentry -> d_inode;
-		journal -> j_dev_bd = jdev_inode -> i_bdev;
+		struct inode *jdev_inode = journal->j_dev_file->f_mapping->host;
 		if( !S_ISBLK( jdev_inode -> i_mode ) ) {
 			printk( "journal_init_dev: '%s' is not a block device\n", jdev_name );
 			result = -ENOTBLK;
-		} else if( jdev_inode -> i_bdev == NULL ) {
-			printk( "journal_init_dev: bdev uninitialized for '%s'\n", jdev_name );
-			result = -ENOMEM;
 		} else  {
 			/* ok */
+			journal->j_dev_bd = I_BDEV(jdev_inode);
 			set_blocksize(journal->j_dev_bd, super->s_blocksize);
 		}
 	} else {
diff -puN include/linux/fs.h~RD15-I_BDEV-B6 include/linux/fs.h
--- 25/include/linux/fs.h~RD15-I_BDEV-B6	2003-10-02 01:36:12.000000000 -0700
+++ 25-akpm/include/linux/fs.h	2003-10-02 01:36:12.000000000 -0700
@@ -480,6 +480,8 @@ static inline unsigned imajor(struct ino
 	return MAJOR(inode->i_rdev);
 }
 
+extern struct block_device *I_BDEV(struct inode *inode);
+
 struct fown_struct {
 	rwlock_t lock;          /* protects pid, uid, euid fields */
 	int pid;		/* pid or -pgrp where SIGIO should be sent */
@@ -1127,7 +1129,6 @@ extern struct block_device *bdget(dev_t)
 extern void bd_forget(struct inode *inode);
 extern void bdput(struct block_device *);
 extern int blkdev_open(struct inode *, struct file *);
-extern int blkdev_close(struct inode *, struct file *);
 extern struct block_device *open_by_devnum(dev_t, unsigned, int);
 extern struct file_operations def_blk_fops;
 extern struct address_space_operations def_blk_aops;
@@ -1135,7 +1136,7 @@ extern struct file_operations def_chr_fo
 extern struct file_operations bad_sock_fops;
 extern struct file_operations def_fifo_fops;
 extern int ioctl_by_bdev(struct block_device *, unsigned, unsigned long);
-extern int blkdev_ioctl(struct inode *, struct file *, unsigned, unsigned long);
+extern int blkdev_ioctl(struct block_device *, struct file *, unsigned, unsigned long);
 extern int blkdev_get(struct block_device *, mode_t, unsigned, int);
 extern int blkdev_put(struct block_device *, int);
 extern int bd_claim(struct block_device *, void *);
diff -puN mm/filemap.c~RD15-I_BDEV-B6 mm/filemap.c
--- 25/mm/filemap.c~RD15-I_BDEV-B6	2003-10-02 01:36:12.000000000 -0700
+++ 25-akpm/mm/filemap.c	2003-10-02 01:36:12.000000000 -0700
@@ -1662,7 +1662,7 @@ inline int generic_write_checks(struct f
 			*count = inode->i_sb->s_maxbytes - *pos;
 	} else {
 		loff_t isize;
-		if (bdev_read_only(inode->i_bdev))
+		if (bdev_read_only(I_BDEV(inode)))
 			return -EPERM;
 		isize = i_size_read(inode);
 		if (*pos >= isize) {
diff -puN mm/swapfile.c~RD15-I_BDEV-B6 mm/swapfile.c
--- 25/mm/swapfile.c~RD15-I_BDEV-B6	2003-10-02 01:36:12.000000000 -0700
+++ 25-akpm/mm/swapfile.c	2003-10-02 01:36:12.000000000 -0700
@@ -1100,8 +1100,7 @@ asmlinkage long sys_swapoff(const char _
 	swap_list_unlock();
 	vfree(swap_map);
 	if (S_ISBLK(mapping->host->i_mode)) {
-		struct block_device *bdev;
-		bdev = mapping->host->i_bdev;
+		struct block_device *bdev = I_BDEV(mapping->host);
 		set_blocksize(bdev, p->old_block_size);
 		bd_release(bdev);
 	} else {
@@ -1294,14 +1293,14 @@ asmlinkage long sys_swapon(const char __
 
 	error = -EINVAL;
 	if (S_ISBLK(inode->i_mode)) {
-		bdev = inode->i_bdev;
+		bdev = I_BDEV(inode);
 		error = bd_claim(bdev, sys_swapon);
 		if (error < 0) {
 			bdev = NULL;
 			goto bad_swap;
 		}
 		p->old_block_size = block_size(bdev);
-		error = set_blocksize(inode->i_bdev, PAGE_SIZE);
+		error = set_blocksize(bdev, PAGE_SIZE);
 		if (error < 0)
 			goto bad_swap;
 		p->bdev = bdev;

_