--- fs/block_dev.c | 37 ++++++++++++++++++------------------- fs/devfs/base.c | 18 ++---------------- include/linux/fs.h | 1 - 3 files changed, 20 insertions(+), 36 deletions(-) diff -puN fs/block_dev.c~RD9-bd_acquire-mm fs/block_dev.c --- 25/fs/block_dev.c~RD9-bd_acquire-mm 2004-01-07 19:06:05.000000000 -0800 +++ 25-akpm/fs/block_dev.c 2004-01-07 19:06:05.000000000 -0800 @@ -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) @@ -829,11 +829,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~RD9-bd_acquire-mm fs/devfs/base.c --- 25/fs/devfs/base.c~RD9-bd_acquire-mm 2004-01-07 19:06:05.000000000 -0800 +++ 25-akpm/fs/devfs/base.c 2004-01-07 19:06:05.000000000 -0800 @@ -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~RD9-bd_acquire-mm include/linux/fs.h --- 25/include/linux/fs.h~RD9-bd_acquire-mm 2004-01-07 19:06:05.000000000 -0800 +++ 25-akpm/include/linux/fs.h 2004-01-07 19:06:05.000000000 -0800 @@ -1125,7 +1125,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 *); _