25-akpm/fs/block_dev.c     |   37 ++++++++++++++++++-------------------
 25-akpm/fs/devfs/base.c    |   18 ++----------------
 25-akpm/include/linux/fs.h |    1 -
 3 files changed, 20 insertions(+), 36 deletions(-)

diff -puN fs/block_dev.c~RD13-bd_acquire-B6 fs/block_dev.c
--- 25/fs/block_dev.c~RD13-bd_acquire-B6	Mon Oct  6 05:40:53 2003
+++ 25-akpm/fs/block_dev.c	Mon Oct  6 05:40:53 2003
@@ -387,26 +387,27 @@ void bdput(struct block_device *bdev)
 
 EXPORT_SYMBOL(bdput);
  
-int bd_acquire(struct inode *inode)
+static struct block_device *bd_acquire(struct inode *inode)
 {
 	struct block_device *bdev;
 	spin_lock(&bdev_lock);
-	if (inode->i_bdev && igrab(inode->i_bdev->bd_inode)) {
+	bdev = inode->i_bdev;
+	if (bdev && igrab(bdev->bd_inode)) {
 		spin_unlock(&bdev_lock);
-		return 0;
+		return bdev;
 	}
 	spin_unlock(&bdev_lock);
 	bdev = bdget(inode->i_rdev);
-	if (!bdev)
-		return -ENOMEM;
-	spin_lock(&bdev_lock);
-	if (inode->i_bdev)
-		__bd_forget(inode);
-	inode->i_bdev = bdev;
-	inode->i_mapping = bdev->bd_inode->i_mapping;
-	list_add(&inode->i_devices, &bdev->bd_inodes);
-	spin_unlock(&bdev_lock);
-	return 0;
+	if (bdev) {
+		spin_lock(&bdev_lock);
+		if (inode->i_bdev)
+			__bd_forget(inode);
+		inode->i_bdev = bdev;
+		inode->i_mapping = bdev->bd_inode->i_mapping;
+		list_add(&inode->i_devices, &bdev->bd_inodes);
+		spin_unlock(&bdev_lock);
+	}
+	return bdev;
 }
 
 /* Call when you free inode */
@@ -666,8 +667,7 @@ int blkdev_open(struct inode * inode, st
 	 */
 	filp->f_flags |= O_LARGEFILE;
 
-	bd_acquire(inode);
-	bdev = inode->i_bdev;
+	bdev = bd_acquire(inode);
 
 	res = do_open(bdev, filp);
 	if (res)
@@ -828,11 +828,10 @@ struct block_device *lookup_bdev(const c
 	error = -EACCES;
 	if (nd.mnt->mnt_flags & MNT_NODEV)
 		goto fail;
-	error = bd_acquire(inode);
-	if (error)
+	error = -ENOMEM;
+	bdev = bd_acquire(inode);
+	if (!bdev)
 		goto fail;
-	bdev = inode->i_bdev;
-
 out:
 	path_release(&nd);
 	return bdev;
diff -puN fs/devfs/base.c~RD13-bd_acquire-B6 fs/devfs/base.c
--- 25/fs/devfs/base.c~RD13-bd_acquire-B6	Mon Oct  6 05:40:53 2003
+++ 25-akpm/fs/devfs/base.c	Mon Oct  6 05:40:53 2003
@@ -1955,15 +1955,9 @@ static int devfs_notify_change (struct d
     return 0;
 }   /*  End Function devfs_notify_change  */
 
-static void devfs_clear_inode (struct inode *inode)
-{
-    if ( S_ISBLK (inode->i_mode) ) bdput (inode->i_bdev);
-}   /*  End Function devfs_clear_inode  */
-
 static struct super_operations devfs_sops =
 { 
     .drop_inode    = generic_delete_inode,
-    .clear_inode   = devfs_clear_inode,
     .statfs        = simple_statfs,
 };
 
@@ -2015,11 +2009,7 @@ static struct inode *_devfs_get_vfs_inod
 	inode->i_rdev = de->u.cdev.dev;
     }
     else if ( S_ISBLK (de->mode) )
-    {
-	inode->i_rdev = de->u.bdev.dev;
-	if (bd_acquire (inode) != 0)
-		PRINTK ("(%d): no block device from bdget()\n",(int)inode->i_ino);
-    }
+	init_special_inode(inode, de->mode, de->u.bdev.dev);
     else if ( S_ISFIFO (de->mode) )
     	inode->i_fop = &def_fifo_fops;
     else if ( S_ISDIR (de->mode) )
@@ -2118,11 +2108,7 @@ static int devfs_open (struct inode *ino
     if (de == NULL) return -ENODEV;
     if ( S_ISDIR (de->mode) ) return 0;
     file->private_data = de->info;
-    if ( S_ISBLK (inode->i_mode) )
-    {
-	file->f_op = &def_blk_fops;
-	err = def_blk_fops.open (inode, file); /* Module refcount unchanged */
-    } else if (S_ISCHR(inode->i_mode)) {
+    if (S_ISCHR(inode->i_mode)) {
 	ops = devfs_get_ops (de);  /*  Now have module refcount  */
 	file->f_op = ops;
 	if (file->f_op)
diff -puN include/linux/fs.h~RD13-bd_acquire-B6 include/linux/fs.h
--- 25/include/linux/fs.h~RD13-bd_acquire-B6	Mon Oct  6 05:40:53 2003
+++ 25-akpm/include/linux/fs.h	Mon Oct  6 05:40:53 2003
@@ -1124,7 +1124,6 @@ enum {BDEV_FILE, BDEV_SWAP, BDEV_FS, BDE
 extern int register_blkdev(unsigned int, const char *);
 extern int unregister_blkdev(unsigned int, const char *);
 extern struct block_device *bdget(dev_t);
-extern int bd_acquire(struct inode *inode);
 extern void bd_forget(struct inode *inode);
 extern void bdput(struct block_device *);
 extern int blkdev_open(struct inode *, struct file *);

_