From 893544c46baafea72eba4d19744d9b5e137ec425 Mon Sep 17 00:00:00 2001 From: Andrew Morton Date: Sun, 18 Jan 2004 18:06:59 -0800 Subject: [PATCH] [PATCH] bdev: bd_acquire() cleanup From: viro@parcelfarce.linux.theplanet.co.uk bd_acquire() made static, switched to returning the block_device it had found. Callers updated. --- fs/block_dev.c | 37 ++++++++++++++++++------------------- fs/devfs/base.c | 18 ++---------------- include/linux/fs.h | 1 - 3 files changed, 20 insertions(+), 36 deletions(-) diff --git a/fs/block_dev.c b/fs/block_dev.c index 14b4619efcd0a..3bfe77ec0864a 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -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, struct file * filp) */ 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 char *path) 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 --git a/fs/devfs/base.c b/fs/devfs/base.c index 1d8b7410e175d..fd79cc670d4ac 100644 --- a/fs/devfs/base.c +++ b/fs/devfs/base.c @@ -1955,15 +1955,9 @@ static int devfs_notify_change (struct dentry *dentry, struct iattr *iattr) 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_inode (struct super_block *sb, 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 *inode, struct file *file) 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 --git a/include/linux/fs.h b/include/linux/fs.h index ae9019c80f098..8915617d3d486 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1125,7 +1125,6 @@ enum {BDEV_FILE, BDEV_SWAP, BDEV_FS, BDEV_RAW}; 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 *); -- 2.53.0