[PATCH v3 07/39] fs: char_dev: introduce cd_acquire function to acquire cdev
Jan Kara
jack at suse.cz
Wed Sep 16 01:16:48 PDT 2015
On Tue 15-09-15 17:02:02, Dongsheng Yang wrote:
> cd_acquire() works like bd_acquire() to get cdev by an inode,
> this commit is a preparation for lookup_cdev().
>
> Signed-off-by: Dongsheng Yang <yangds.fnst at cn.fujitsu.com>
Two comments below.
> ---
> fs/char_dev.c | 35 +++++++++++++++++++++++++++++++++++
> 1 file changed, 35 insertions(+)
>
> diff --git a/fs/char_dev.c b/fs/char_dev.c
> index ea06a3d..e818faa 100644
> --- a/fs/char_dev.c
> +++ b/fs/char_dev.c
> @@ -439,6 +439,41 @@ static int exact_lock(dev_t dev, void *data)
> return cdev_get(p) ? 0 : -1;
> }
>
> +struct cdev *cd_acquire(struct inode *inode)
> +{
> + struct cdev *cdev;
> + struct cdev *new = NULL;
> +
> + spin_lock(&cdev_lock);
> + cdev = inode->i_cdev;
> + if (!cdev) {
> + struct kobject *kobj;
> + int idx;
Empty line here please to separate variable declarations from the code.
> + spin_unlock(&cdev_lock);
> + kobj = kobj_lookup(cdev_map, inode->i_rdev, &idx);
> + if (!kobj) {
> + cdev = NULL;
> + goto out;
> + }
> + new = container_of(kobj, struct cdev, kobj);
> + spin_lock(&cdev_lock);
> + /* Check i_cdev again in case somebody beat us to it while
> + we dropped the lock. */
> + cdev = inode->i_cdev;
> + if (!cdev) {
> + inode->i_cdev = cdev = new;
> + list_add(&inode->i_devices, &cdev->list);
> + }
I think you need to put 'new' in case you didn't use it, don't you?
> + }
> +
> + if (!cdev_get(cdev))
> + cdev = NULL;
> + spin_unlock(&cdev_lock);
> +
> +out:
> + return cdev;
> +}
> +
> /**
> * cdev_add() - add a char device to the system
> * @p: the cdev structure for the device
Honza
--
Jan Kara <jack at suse.com>
SUSE Labs, CR
More information about the linux-mtd
mailing list